文章目錄
- 一、實驗環境
- 二、實驗內容
- (一)數據準備
- (二)編程環境準備
- (三)使用Hadoop API操作HDFS文件系統
- (四)使用Hadoop API + Java IO流操作HDFS文件系統
- 三、實驗步驟
- (一)數據準備
- (二)編程環境準備
- 1、啟動IDEA
- 2、創建Maven項目
- 3、添加項目依賴
- (1)hadoop-common (org.apache.hadoop:hadoop-common:2.7.6)
- (2)hadoop-client (org.apache.hadoop:hadoop-client:2.7.6)
- (3)hadoop-hdfs (org.apache.hadoop:hadoop-hdfs:2.7.6)
- (4)junit (junit:junit:4.10)
- (5)log4j-core (org.apache.logging.log4j:log4j-core:2.8.2)
- 4、添加資源文件
- 5、創建包
- (三)使用Hadoop API操作HDFS文件系統
- 1、獲取文件系統并配置在集群上運行
- 2、創建目錄
- 3、上傳文件
- 4、下載文件
- 5、刪除文件/目錄
- 6、列出指定路徑下的文件和目錄
- 7、查看完整代碼
- (四)使用Hadoop API + Java IO流操作HDFS文件系統
- 1、獲取文件系統并配置在集群上運行
- 2、上傳文件(IO流)
- 3、讀取文件(IO流)
- 4、下載文件(IO流)
- 5、輔助代碼
一、實驗環境
- 本實驗主要涉及到了4臺虛擬機,其中1臺虛擬機的操作系統是
ubuntu desktop
,另外3臺虛擬機的操作系統是centos server
。
- 本實驗已經搭建好了Hadoop HA的完全分布式集群
二、實驗內容
- 我們將一同探討數據處理中至關重要的一環——Hadoop文件系統(HDFS)的操作。我們將分為四個主要部分,分別是數據準備、編程環境準備、使用Hadoop API操作HDFS文件系統以及使用Hadoop API結合Java IO流進行操作。
(一)數據準備
- 在進行任何數據處理之前,充分準備好數據是至關重要的一步。這一部分將介紹數據準備的重要性,以及如何有效地準備數據以供后續處理使用。
(二)編程環境準備
- 在進行HDFS文件系統的操作之前,我們需要確保我們的編程環境已經得到了妥善的準備。這包括獲取文件系統、配置集群環境等步驟,確保我們的操作能夠在集群上運行。
(三)使用Hadoop API操作HDFS文件系統
- 這一部分是我們的重頭戲,我們將使用Hadoop API進行各種文件系統的操作。從創建目錄到上傳、下載、刪除文件,再到列出指定路徑下的文件和目錄,我們將一一演示如何使用Hadoop API輕松地完成這些操作。同時,我們也會分享一些輔助代碼,使大家更好地理解和應用這些操作。
(四)使用Hadoop API + Java IO流操作HDFS文件系統
-
在這一部分,我們將進一步深入,結合Java IO流,展示如何通過IO流上傳、讀取和下載文件。這將為大家提供更多的靈活性和掌握文件系統操作的技能。
-
本次實驗幫助大家更好地理解和應用Hadoop文件系統的操作,使大家能夠在實際工作中更加得心應手。接下來,我們將深入到各個部分,讓我們一同來探索這個數據處理的世界吧!
三、實驗步驟
(一)數據準備
- 在
desktop
節點打開終端
- 切換到
/opt
目錄
- 創建數據文件
data.txt
- 創建數據文件
localFile.txt
- 下載日志屬性文件,執行命令:
wget 192.168.192.81:8086/api/web/resource/bigdata/Hadoop_Base/06/expPackages/log4j.properties
- 下載Hadoop核心配置文件
core-site.xml
,執行命令:wget 192.168.192.81:8086/api/web/resource/bigdata/Hadoop_Base/06/expPackages/core-site.xml
- 下載Hadoop分布式文件系統配置文件
hdfs-site.xml
,執行命令:wget 192.168.192.81:8086/api/web/resource/bigdata/Hadoop_Base/06/expPackages/hdfs-site.xml
(二)編程環境準備
1、啟動IDEA
-
在desktop節點上啟動IDEA
-
勾選用戶協議
-
單擊【Continue】按鈕
2、創建Maven項目
- 單擊歡迎窗口中的【New Project】按鈕,在左邊欄里選擇【Maven】類型
- 單擊【Next】按鈕,在對話框里設置項目名稱、位置、組標識和構件標識
- 單擊【Finish】按鈕,在彈出的【Tip of the Day】消息框里勾選【Don’t show tips】復選框
- 單擊【Close】按鈕,看到一個空的Maven項目
3、添加項目依賴
- 在
pom.xml
文件里添加相關依賴
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency>
</dependencies>
(1)hadoop-common (org.apache.hadoop:hadoop-common:2.7.6)
- 作用: 提供Hadoop的通用庫和工具,包括文件系統操作、配置管理等。
- 詳細說明: 這是Hadoop的核心庫,包含了許多通用的類和工具,用于支持Hadoop分布式文件系統(HDFS)和分布式計算。
(2)hadoop-client (org.apache.hadoop:hadoop-client:2.7.6)
- 作用: 提供Hadoop的客戶端庫,支持與Hadoop集群進行交互。
- 詳細說明: 包含Hadoop客戶端的相關類,用于在應用程序中與Hadoop集群通信,提交作業等。
(3)hadoop-hdfs (org.apache.hadoop:hadoop-hdfs:2.7.6)
- 作用: 提供Hadoop分布式文件系統(HDFS)的支持。
- 詳細說明: 包含了HDFS相關的類,用于進行文件系統的讀寫操作,支持分布式存儲和文件管理。
(4)junit (junit:junit:4.10)
- 作用: 提供Java單元測試的支持。
- 詳細說明: JUnit是一個廣泛用于Java項目的測試框架,用于編寫和運行單元測試。
(5)log4j-core (org.apache.logging.log4j:log4j-core:2.8.2)
-
作用: 提供Log4j日志框架的核心功能。
-詳細說明: Log4j是一個用于Java應用程序的靈活的日志框架,log4j-core包含了其核心的日志處理功能。 -
中慧教學實訓平臺提供了文件的上傳和下載功能
-
CentOS上Maven項目本地倉庫默認位置(
用戶主目錄/.m2/repository
)
-
刷新項目依賴
-
刷新之后,多一個
Dependencies
項
-
查看項目依賴的外部庫(External Libraries)
4、添加資源文件
- 將
/opt
目錄里的core-site.xml
、hdfs-site.xml
、log4j.properties
文件拷貝到項目的resources
目錄
5、創建包
- 在
src/main/java
里創建net.huawei.usehdfs
包
(三)使用Hadoop API操作HDFS文件系統
1、獲取文件系統并配置在集群上運行
- 在
net.huawei.usehdfs
包里創建HDFSBase
類
- 導入程序所需要的包
- 創建
init()
方法,獲取在集群上運行的文件系統
- 運行
init()
方法
- 在控制臺查看結果
2、創建目錄
- 創建
testMkdirs()
方法
- 由于每次對于HDFS文件系統的操作都需要獲取文件系統并配置在集群上運行,因此需要將上一個功能代碼中的
@Test
修改為@Before
,并將System.out.printIn(fileSystem);
語句注釋掉。
- 運行
testMkdirs()
方法,查看控制臺結果
- 在Hadoop WebUI上查看創建的目錄
- 利用HDFS Shell命令
hdfs dfs -ls -R /
查看
3、上傳文件
- 創建
testCopyFromLocal()
方法
testCopyFromLocal()
方法,查看結果
- 查看上傳的文件內容
4、下載文件
-
創建
testCopyToLocal()
方法
-
運行
testCopyToLocal()
方法,查看結果
-
在desktop節點上查看下載的文件
-
在desktop節點上查看下載的文件內容
5、刪除文件/目錄
-
創建
testDeleteFile()
方法,刪除/idea/mkdir/directory/data.txt
文件
-
運行
testDeleteFile()
方法,查看結果
-
查看
/idea/mkdir/directory/data.txt
文件,報錯說文件不存在
-
修改代碼,刪除
/idea/mkdir/directory
目錄
-
運行
testDeleteFile()
方法,查看結果
-
查看
/idea/mkdir/directory
目錄,報錯說目錄不存在
6、列出指定路徑下的文件和目錄
- 創建
testListAllStatus()
方法
- 運行
testListAllStatus()
方法,查看結果
- 上傳
anaconda-ks.cfg
到HDFS根目錄
- 運行
testListAllStatus()
方法,查看結果
7、查看完整代碼
package net.huawei.usehdfs;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;public class HDFSBase {private FileSystem fileSystem;private Configuration configuration;/*** 獲取文件系統并配置在集群上運行* @throws IOException* @throws InterruptedException*/@Beforepublic void init() throws IOException, InterruptedException {//1、獲取文件系統configuration = new Configuration();//2、配置在集群上運行String uri = "hdfs://mycluster:8020";fileSystem = FileSystem.get(URI.create(uri), configuration, "root");//System.out.println(fileSystem);}/*** 創建目錄* @throws IOException*/@Testpublic void testMkdirs() throws IOException {//3、創建目錄Path path = new Path("/idea/mkdir/directory");fileSystem.mkdirs(path);fileSystem.close();}/*** 上傳文件* @throws IOException*/@Testpublic void testCopyFromLocal() throws IOException {//3、從本地上傳文件到hdfs文件系統// Path src 要上傳的文件的路徑(本地文件系統中的路徑)Path src = new Path("/opt/data.txt");// Path dst 將文件上傳到的路徑(hdfs文件系統中的路徑)Path dst = new Path("/idea/mkdir/directory");fileSystem.copyFromLocalFile(src, dst);fileSystem.close();System.out.println("文件上傳成功~" + dst.toString() + "/" + src.getName());}/*** 下載文件* @throws IOException*/@Testpublic void testCopyToLocal() throws IOException {//3、從hdfs文件系統將文件下載到本地// Path src 文件在hdfs文件系統中的路徑(hdfs文件系統中的路徑)Path src = new Path("/idea/mkdir/directory/data.txt");// Path dst 要下載的文件的路徑(本地文件系統中的路徑)Path dst = new Path("/usr/local/src/data.txt");fileSystem.copyToLocalFile(src, dst);fileSystem.close();System.out.println("文件下載成功~" + dst.toString());}/*** 刪除文件/目錄* @throws IOException*/@Testpublic void testDeleteFile() throws IOException {//3、刪除hdfs文件系統中的文件或目錄Path path = new Path("/idea/mkdir/directory");//判斷是否是目錄boolean directory = fileSystem.isDirectory(path);//判斷是否是文件boolean file = fileSystem.isFile(path);//如果是目錄,則刪除目錄if(directory){boolean deleteDirectory = fileSystem.delete(path, true);if(deleteDirectory){System.out.println("該路徑是個目錄,刪除目錄成功!");}}//如果是文件,則刪除文件if(file){boolean deleteFile = fileSystem.delete(path, true);if(deleteFile) {System.out.println("該路徑是個文件,刪除文件成功!");}}fileSystem.close();}/*** 列出指定路徑下的文件和目錄* @throws IOException*/@Testpublic void testListAllStatus() throws IOException {//3、列出hdfs文件系統中指定路徑下所有的目錄和文件Path path = new Path("/");FileStatus[] fileStatuses = fileSystem.listStatus(path);for (FileStatus fileStatus : fileStatuses) {//如果是文件,則輸出文件if(fileStatus.isFile()){System.out.println("文件:"+fileStatus.getPath().getName());}//如果是目錄,則輸出目錄if(fileStatus.isDirectory()){System.out.println("目錄:"+fileStatus.getPath().getName());}}fileSystem.close();}
}