HDFS的應用開發
HDFS在生產應用中主要是客戶端的開發,其核心步驟是從HDFS提供的api中構造一個HDFS的訪問客戶端對象,然後通過該客戶端對象操作(增刪改查)HDFS上的文件。
1.1. 搭建開發環境
創建Maven工程,引入pom依賴
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.4</version> </dependency> </dependencies>
配置windows平臺Hadoop環境
在windows上做HDFS客戶端應用開發,需要設置Hadoop環境,而且要求是windows平臺編譯的Hadoop,不然會報以下的錯誤:
Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
為此我們需要進行如下的操作:
A、在windows平臺下編譯Hadoop源碼(可以參考資料編譯,但不推薦)
B、使用已經編譯好的Windows版本Hadoop:
C、解壓一份到windows的任意一個目錄下
D、在windows系統中配置HADOOP_HOME指向你解壓的安裝包目錄
E、在windows系統的path變量中加入HADOOP_HOME的bin目錄
1.2. 構造客戶端對象
在java中操作HDFS,主要涉及以下Class:
Configuration:該類的對象封轉了客戶端或者服務器的配置;
FileSystem:該類的對象是一個文件系統對象,可以用該對象的一些方法來對文件進行操作,通過FileSystem的靜態方法get獲得該對象。
FileSystem fs = FileSystem.get(conf)
1.3. 示例代碼
Configuration conf = new Configuration();
//這裏指定使用的是hdfs文件系統
conf.set("fs.defaultFS", "hdfs://node-21:9000");
//通過如下的方式進行客戶端身份的設置
System.setProperty("HADOOP_USER_NAME", "root");
//通過FileSystem的靜態方法獲取文件系統客戶端對象
FileSystem fs = FileSystem.get(conf);
//也可以通過如下的方式去指定文件系統的類型 並且同時設置用戶身份
//FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
//創建一個目錄
fs.create(new Path("/hdfsbyjava-ha"), false);
//上傳一個文件
fs.copyFromLocalFile(new Path("e:/hello.sh"), new Path("/hdfsbyjava-ha"));
//關閉我們的文件系統
fs.close();
其他更多操作如文件增刪改查請查看實例代碼。
Stream流形式操作
public void testUpload() throws Exception {
FSDataOutputStream outputStream = fs.create(new Path("/1.txt"), true);
FileInputStream inputStream = new FileInputStream("D:\\1.txt");
IOUtils.copy(inputStream, outputStream);
}
2. 案例:shell定時采集數據至HDFS
上線的網站每天都會產生日誌數據。假如有這樣的需求:要求在淩晨24點開始操作前一天產生的日誌文件,準實時上傳至HDFS集群上。
該如何實現?實現後能否實現周期性上傳需求?如何定時?
2.1. 技術分析
HDFS SHELL:
hadoop fs –put //滿足上傳文件,不能滿足定時、周期性傳入。
Linux crontab:
crontab -e
0 0 * /shell/ uploadFile2Hdfs.sh //每天淩晨12:00執行一次
2.2. 實現流程
一般日誌文件生成的邏輯由業務系統決定,比如每小時滾動一次,或者一定大小滾動一次,避免單個日誌文件過大不方便操作。
比如滾動後的文件命名為access.log.x,其中x為數字。正在進行寫的日誌文件叫做access.log。這樣的話,如果日誌文件後綴是1\2\3等數字,則該文件滿足需求可以上傳,就把該文件移動到準備上傳的工作區間目錄。工作區間有文件之後,可以使用hadoop put命令將文件上傳。
2.3. 代碼實現
HDFS的應用開發