0x00: 說明
使用 Java 操作 HDFS 文件系統(tǒng)可以使用其對應的Java API,即對應三個 jar 依賴包:
- hadoop-common.jar (該文件在 hadoop-2.10.1.tar.gz 壓縮包中的
\share\hadoop\common
目錄下) - hadoop-hdfs.jar (該文件在 hadoop-2.10.1.tar.gz 壓縮包中的
\share\hadoop\hdfs
目錄下) - hadoop-client.jar (該文件在 hadoop-2.10.1.tar.gz 壓縮包中的
\share\hadoop\hdfs
目錄下)
這三個 jar 包的具體名字可能根據(jù)你所安裝的版本進行變化,在本文檔中這三個文件名稱具體如下:
此處我不推薦直接通過 jar 包引入依賴支持,本文中也將不在撰寫 jar 的方式引入,因為這三個jar還依賴于其他的依賴庫,例如 woodstox-core
等一系列jar包,過程較為繁瑣,因此本文中使用 pom 表引入對應配置,使用pom表來管理依賴后,子依賴會自動導入,不在需要我們手動引入,較為方便,pom表依賴配置如下:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.10.1</version>
</dependency>
在本文中我將在宿主機使用 IDEA 創(chuàng)建對應工程調(diào)用虛擬機的 Java API 接口,創(chuàng)建基本 Java 工程在本文中將不在贅述,但請注意,在創(chuàng)建工程時請將系統(tǒng)編譯方式選擇為 Maven,如下圖所示:
0x01: 依賴導入
注意,在第三步引入后你會發(fā)現(xiàn)他是處于紅色的錯誤狀態(tài),此時點擊第四步刷新依賴后即可
引入依賴完成后如下圖所示,但因為版本問題存在相對較多的安全的漏洞提示,鼠標放在上方即可顯示相關的CVE漏洞編號,但我們僅僅只是學習用途,該問題我們直接忽略
該步驟完成后 pom 表中無紅色文本內(nèi)容時則代表已完成依賴引入
0x02: HDFS 文件創(chuàng)建
這里給出一段示例代碼,你可以用來驗證 HDFS 的 Java API 是否能正常工作。在開始前,你需要了解如下幾個注意點:
- 我們在訪問 hdfs 的時候會進行一個權(quán)限認證認證的過程,取用戶名的過程是這樣的:
首先讀取 HADOOP_USER_NAME
系統(tǒng)環(huán)境變量,如果不為空,那么拿它作用戶名
如果為空,則讀取 HADOOP_USER_NAME
這個 java 環(huán)境變量,如果繼續(xù)為空,則拋出異常
因此在下方代碼中,我在第 19-20 行中加了環(huán)境變量配置,如果你不想進行該配置,則可以在第 27 行文件系統(tǒng)配置中進行修改,添加一個user參數(shù),代碼如下:
// 鏈接到文件系統(tǒng)
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf, "root");
- 該段代碼運行后可能會提示有找不到 logger 和 log4j 未正常初始化的配置,如下圖,但因為我們此處僅作學習用途,該警告我們可直接忽略。
完整實例代碼如下:
package org.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// 配置環(huán)境變量
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root");
// 創(chuàng)建配置
Configuration conf = new Configuration();
try {
// 鏈接到文件系統(tǒng)
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);
// 創(chuàng)建文件
FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/Tianxidev/test/1.txt"));
// 寫入文件內(nèi)容到輸出流
fsDataOutputStream.writeUTF("Hi HDFS!");
// 輸出流提交 HDFS
fsDataOutputStream.flush();
// 關閉輸出流
fsDataOutputStream.close();
// 關閉文件系統(tǒng)
fileSystem.close();
} catch (IOException | URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
運行后,我們在虛擬機上執(zhí)行命令 hdfs dfs -ls /
查看 HDFS 文件系統(tǒng)根目錄,發(fā)現(xiàn)已多出一個我們代碼中創(chuàng)建的文件夾,使用 hdfs dfs -cat /Tianxidev/test/1.txt
查看我們創(chuàng)建的文件內(nèi)容發(fā)現(xiàn)寫入內(nèi)容為預期文本,此時則代表 HDFS 的 Java API 工作正常。
0x03: HDFS 文件夾創(chuàng)建
此處僅提供完整樣例代碼不在提供運行截圖,樣例代碼已經(jīng)過驗證
package org.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// 配置環(huán)境變量
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root");
// 創(chuàng)建配置
Configuration conf = new Configuration();
try {
// 鏈接到文件系統(tǒng)
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);
// 創(chuàng)建文件夾
fileSystem.mkdirs(new Path("/Tianxidev/test1"));
// 關閉文件系統(tǒng)
fileSystem.close();
} catch (IOException | URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
0x04: 本地文件上傳 HDFS
此處僅提供完整樣例代碼不在提供運行截圖,樣例代碼已經(jīng)過驗證
package org.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// 配置環(huán)境變量
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root");
// 創(chuàng)建配置
Configuration conf = new Configuration();
try {
// 鏈接到文件系統(tǒng)
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);
// 上傳本地文件
fileSystem.copyFromLocalFile(new Path("D:\\temp\\hdfs_test_1.txt"),new Path("/Tianxidev/test1"));
// 關閉文件系統(tǒng)
fileSystem.close();
} catch (IOException | URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
0x05: 讀取 HDFS 文件內(nèi)容
此處僅提供完整樣例代碼不在提供運行截圖,樣例代碼已經(jīng)過驗證
package org.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// 配置環(huán)境變量
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root");
// 創(chuàng)建配置
Configuration conf = new Configuration();
try {
// 鏈接到文件系統(tǒng)
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);
// 打開文件
FSDataInputStream fsDataInputStream = fileSystem.open(new Path("/Tianxidev/test/1.txt"));
// 打印文件內(nèi)容
System.out.println("文件內(nèi)容: " + fsDataInputStream.readUTF());
// 關閉輸入流
fsDataInputStream.close();
// 關閉文件系統(tǒng)
fileSystem.close();
} catch (IOException | URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
0x06: HDFS 文件下載本地
此處僅提供完整樣例代碼不在提供運行截圖,樣例代碼已經(jīng)過驗證
請注意,因為win系統(tǒng)文件系統(tǒng)結(jié)構(gòu)原因,會拋出如下報錯:
java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset.
出現(xiàn)該報錯時需要你引入 winutils 支持,winutil.exe 主要用于模擬linux下的目錄環(huán)境,你可以在互聯(lián)網(wǎng)上尋找該配置教程,如果你不想麻煩,也可以選擇通過 API 讀取文件內(nèi)容然后在使用 Java 文件相關API方法將文件流作為文件寫入系統(tǒng)。文章來源:http://www.zghlxwxcb.cn/news/detail-424263.html
package org.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// 配置環(huán)境變量
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root");
// 創(chuàng)建配置
Configuration conf = new Configuration();
try {
// 鏈接到文件系統(tǒng)
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);
// 下載文件到本地
fileSystem.copyToLocalFile(new Path("/Tianxidev/test1/hdfs_test_1.txt"),new Path("D:\\temp\\hdfs_test_1.txt"));
// 關閉文件系統(tǒng)
fileSystem.close();
} catch (IOException | URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
0x07: 遠程刪除 HDFS 文件或文件夾
此處僅提供完整樣例代碼不在提供運行截圖,樣例代碼已經(jīng)過驗證文章來源地址http://www.zghlxwxcb.cn/news/detail-424263.html
package org.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// 配置環(huán)境變量
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root");
// 創(chuàng)建配置
Configuration conf = new Configuration();
try {
// 鏈接到文件系統(tǒng)
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);
// b: true 遞歸刪除目錄 false 刪除指定文件
fileSystem.delete(new Path("/Tianxidev/test1/hdfs_test_1.txt"),false);
fileSystem.delete(new Path("/Tianxidev"),true);
// 關閉文件系統(tǒng)
fileSystem.close();
} catch (IOException | URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
到了這里,關于使用Hadoop 的 Java API 操縱 HDFS 文件系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!