文章目錄
- 一、學前必備知識
- 二、Hadoop HDFS 命令
- 1、HDFS 常用命令總覽
- 2、創建與查看 HDFS 目錄
- 3、本地計算機和 HDFS 間的檔案復制
- 4、復制與洗掉 HDFS 檔案
- 5、查看 HDFS 檔案內容
- 6、對比 hdfs dfs
- 三、Java 操作 HDFS
一、學前必備知識
- 2021年 全網最細大資料學習筆記(一):初識 Hadoop
- 2021年 全網最細大資料學習筆記(二):Hadoop 偽分布式安裝
- 2021年 全網最細大資料學習筆記(三):Hadoop 集群的搭建與配置
二、Hadoop HDFS 命令
1、HDFS 常用命令總覽
可以利用 HDFS 命令對 HDFS 進行操作,HDFS 有很多用戶介面,其中命令列是最基本的,也是所有開發者必須熟悉的,所有命令列均由 bin/hadoop 腳本引發,不指定引數運行 Hadoop 腳本將顯示所有命令的描述,若要完整了解 Hadoop 命令,可輸入 hadoop fs -help 即可查看所有命令的幫助檔案,HDFS 命令的格式如下:
hadoop fs –命令
下面介紹一些常用的 HDFS 命令,如下表所示:

2、創建與查看 HDFS 目錄
1、創建 HDFS 目錄
命令:hadoop fs -mkdir,在 Hadoop 上創建目錄與在 Linux 上創建目錄類似,根目錄用 / 表示,例如,創建 test 目錄,打開 bigdata01 節點的終端,輸入如下命令:
hadoop fs -mkdir /test
例如,在 test 目錄下創建 amo 子目錄,命令如下:
hadoop fs -mkdir /test/amo
例如,在 amo 目錄下創建 demo 子目錄,命令如下:
hadoop fs -mkdir /test/amo/demo
執行結果如下圖所示:

說明:在使用 HDFS 命令之前,必須先啟動 Hadoop 集群,且命令執行在主節點的終端上,在創建 /test/amo 目錄之前,必須先創建 test 目錄,不能直接使用 hadoop fs -mkdir /test/amo 命令創建 amo 目錄,
2、創建多級 HDFS 目錄
當創建目錄時,如果要逐級地創建也很麻煩,所以 HDFS 提供了 -p 選項,可以幫助用戶一次創建多級目錄,例如,創建多級目錄 /dir1/dir2/dir3 的命令為:
hadoop fs -mkdir -p /dir1/dir2/dir3
執行結果如下圖所示:

3、查看 HDFS 目錄
與 Linux 的 ls 命令類似,Hadoop 也有查看檔案串列的命令,命令如下:
hadoop fs -ls <args>
其中,<args> 為可選引數,下面介紹查看命令的常用用法,
- 查看目錄,查看上面創建的 test 目錄,命令:hadoop fs -ls /test,執行結果如下圖所示:

通過上圖的執行結果可以看到,顯示了 test 目錄下的子目錄和檔案,如子目錄 amo, - 查看根目錄,根目錄是用
/表示的,查看根目錄的命令為:hadoop fs -ls /,執行結果如下圖所示:

上述命令用來顯示根目錄下的子目錄和檔案,因為在之前的小節中創建了 dir1 和 test 目錄,除了用戶自己創建的目錄以外,系統在安裝的時候也已經創建了其他的目錄,如 user 目錄,user 目錄與用戶自己創建的目錄具有相同的權限, - 查看所有子目錄,引數 -R 可用于查看所有 HDFS 子目錄,R 代表 recursive(遞回),命令:hadoop fs -ls -R /,執行結果如下圖所示:

3、本地計算機和 HDFS 間的檔案復制
1、從本地計算機復制檔案到 HDFS
從本地計算機(Linux 虛擬機) 復制檔案到 HDFS,也可稱為上傳檔案到 HDFS,有兩種命令可以使用,一種是 hadoop fs -put,另一種是 hadoop fs -copyFromLocal,在 bigdata01(主) 節點的終端輸入如下命令:
hadoop fs -put /root/readme.txt /test/readme.txt
本段代碼可以實作將本地 Linux 的檔案 /root/readme.txt 上傳到 HDFS 的 /test 下,檔案名保持為 readme.txt,也可以在復制的時候重新命名檔案,也可以不寫復制的檔案名,直接寫要復制到的路徑即可,如下所示,表示檔案名保持不變,
hadoop fs -put /root/readme.txt /test
注意:在上傳檔案時,“/root/readme.txt” 該目錄下的檔案必須存在,查看復制的檔案,命令如下:

使用 hadoop fs -copyFromLocal /root/readme.txt /test/readme.txt 也可實作上傳檔案的功能,
2、強制復制檔案
當復制本地檔案至 HDFS 目錄時,如果檔案已經存在,系統會提示 File exists,即檔案已經存在,將不會復制,如下圖所示:

當檔案已經存在時,可以使用 -f 選項(f 是 force,強制),進行強制復制,命令如下:
hadoop fs -put -f /root/readme.txt /test/readme.txt
3、復制多個檔案
可以一次復制多個本地檔案到 HDFS 目錄,在下面的例子中,實作了復制“/root/readme2.txt” 和 “/root/readme3.txt” 這兩個檔案到 /test 目錄,
hadoop fs -put /root/readme2.txt /root/readme3.txt /test
執行結果如下圖所示:

4、復制目錄
除了可以復制檔案外,還可以復制目錄,例如,將本地的目錄 “/data/soft/hadoop-3.2.0/etc/” 到 HDFS 目錄 /test,命令如下:
hadoop fs -put /data/soft/hadoop-3.2.0/etc /test
執行結果如下圖所示:

從上圖中,只看到了 etc 的目錄名稱,還可以使用 hadoop fs -ls -R /test/etc 命令,來列出 HDFS 目錄 /test/etc 下的所有檔案,
5、復制并輸入
在復制目錄時使用到的是 -put 選項,還可以使用 -copyFromLocal 選項,但是兩者的不同之處是:-put選項接受 stdin(標準輸入),下面看兩個使用 -put 選項接受 stdin 的例子,
(1) 將原本顯示在螢屏上的內容存盤到 HDFS 檔案,命令如下:
echo abd | hadoop fs -put - /test/echoin.txt
其中 echo abc 原本是要指定顯示在螢屏上的內容 abc,現在通過 |(pipe 管道) 符號傳遞給 hadoop 的命令,并且存盤到 HDFS 目錄下的檔案 echoin.txt 中,并列出 /test/echoin.txt 檔案的內容,執行結果如下圖所示:

(2) 將本地目錄的串列存盤到 HDFS 檔案,命令如下:
ls /data/soft/hadoop-3.2.0/etc/hadoop | hadoop fs -put - /test/hadoopetc.txt
其中 “ls /data/soft/hadoop-3.2.0/etc/hadoop” 命令會把本地目錄 ls /data/soft/hadoop-3.2.0/etc/hadoop 的串列顯示在螢屏上,但是通過后面的 “|” 符號(pipe 管道) 傳遞給了 Hadoop 命令,所以最后會存盤到 HDFS 目錄下的 hadoopetc.txt 檔案中,列出 /test/hadoopetc.txt 檔案的內容,執行結果如下圖所示:

6、將 HDFS 上的檔案復制到本地計算機
將 HDFS 上的檔案復制到本地計算機也稱為檔案下載,有兩種命令可以使用,一種是 hadoop fs -get,另一種是 hadoop fs -copyToLocal,兩種的用法相同,語法如下:
hadoop fs -get HDFS路徑 本地路徑
將 HDFS 的檔案復制到本地計算機,首先在本地計算機上創建 localtest 測驗目錄,命令:mkdir localtest,然后將 HDFS 的檔案 /test/hadoopetc.txt,復制到本地計算機的測驗目錄中 /localtest,命令:hadoop fs -get /test/hadoopetc.txt /root/localtest,最后查看本地 localtest 測驗目錄內檔案和目錄,命令:ls /root/localtest/,執行結果如下圖所示:

注意:在復制 HDFS 上的檔案到本地的時候,此檔案必須存在,否則會出現錯誤,另外,可以在復制檔案的時候,重命名檔案,
hadoop fs -get /test/hadoopetc.txt /root/localtest/amo.txt
4、復制與洗掉 HDFS 檔案
- 復制檔案的命令為 “hadoop fs -cp”,示例,將 HDFS 檔案 /test/readme.txt 復制到 HDFS 測驗目錄 /test/temp 上,

- 洗掉檔案的命令為 “hadoop fs -rm”,洗掉 HDFS 目錄的命令為 “hadoop fs -rm -R”,例如,洗掉 /test/temp/readme.txt 檔案以及 temp目錄,

5、查看 HDFS 檔案內容
可以使用 hadoop fs -test、hadoop fs-cat、hadoop fs -tail 等不同引數形式查看 HDFS 集群中的檔案內容,但是,只有文本檔案的內容才可以查看,其他型別的檔案則顯示亂碼,例如,查看 /test/readme.txt 檔案,命令如下:
hadoop fs -cat /test/readme.txt
執行結果如下圖所示:

6、對比 hdfs dfs
hdfs dfs 和 hadoop fs 命令沒什么太大的區別,hdfs dfs 格式如下:
使用 hadoop bin 目錄的 hdfs 命令,后面指定 dfs,表示是操作分布式檔案系統的,這些屬于固定格式,如果在 PATH 中配置了 hadoop 的 bin 目錄,那么這里可以直接使用 hdfs 就可以了,這里的 xxx 是一個占位符,具體我們想對 hdfs 做什么操作,就可以在這里指定對應的命令了,大多數 hdfs 的命令和對應的 Linux 命令類似,HDFS 的 schema 是 hdfs,authority 是集群中 namenode 所在節點的 ip 和對應的埠號,把 ip 換成主機名也是一樣的,path 是我們要操作的檔案路徑資訊,其實后面這一長串內容就是 core-site.xml 組態檔中 fs.defaultFS 屬性的值,這個代表的是 HDFS 的地址,說明:scheme://authority / 可以省略,因為 hdfs 在執行的時候會根據 HDOOP_HOME 自動識別組態檔中的 fs.defaultFS 屬性,
- 直接在命令列中輸入 hdfs dfs,可以查看 dfs 后面可以跟的所有引數,
- -ls:查詢指定路徑資訊,hdfs dfs -ls /
- -put:從本地上傳檔案,
- -cat:查看 HDFS 檔案內容,
- -get:下載檔案到本地,
- -mkdir [-p]:創建檔案夾,
- -rm [-r]:洗掉檔案/檔案夾,
三、Java 操作 HDFS
我們在作業中會遇到一些需求是需要通過代碼操作 hdfs 的,下面我們就來看一下如何使用 java 代碼操作 hdfs,在具體操作之前需要先明確一下開發環境,代碼編輯器使用 idea,當然了 eclipse 也可以,筆者這里的話使用 idea,后續的文章也可能會使用 eclipse,在創建專案的時候創建 maven 專案,使用 maven 來管理依賴,比較方便,把 apache-maven-3.0.5-bin.zip 解壓到某一個目錄下面,解壓之后,建議修改一下 maven 的組態檔,把 maven 倉庫的地址修改到其它盤,例如 D 盤,默認是在 C 盤的用戶目錄下,修改 D:\Program Files\apache-maven-3.0.5-bin\apache-maven-3.0.5\conf 下的 settings.xml 檔案,讀者根據自己的實際路徑進行修改,如下:

這樣修改之后,maven 管理的依賴 jar 包都會保存到 D:.m2 目錄下了,接下來需要配置 maven 的環境變數,和 Windows 中配置 JAVA_HOME 環境變數是一樣的,先在環境變數中配置 M2_HOME=D:\Program Files\apache-maven-3.0.5-bin\apache-maven-3.0.5,然后在 PATH 環境變數中添加 %M2_HOME%\bin 即可,環境變數配置完畢以后,打開 cmd 視窗,輸入 mvn 命令,只要能正常執行就說明 Windows 本地的 maven 環境配置好了,

這還沒完,還需要在 idea 中指定我們本地的 maven 配置,點擊 idea 左上角的 File–>Settings,進入如下界面,搜索 maven,把本地的 maven 添加到這里面即可,

注意:專案創建好以后,在新打開的界面中需要點擊右小角的 Enable Auto Import,這樣添加到 maven 依賴會自動引入,否則會發現引入依賴了,但是代碼中還是識別不了,這個時候還需要手動引入,比較麻煩,配置 maven 源:

內容:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
ok,專案創建好了以后,就需要引入 hadoop 的依賴了,在這里我們需要引入 hadoop-client 依賴包,到 maven 倉庫中去找,添加到 pom.xml 檔案中,
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies>
示例代碼如下:
package com.amo.hdfs;
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 org.apache.hadoop.io.IOUtils;
import java.io.FileInputStream;
import java.net.URI;
/**
* Java代碼操作HDFS
* 檔案操作:上傳檔案、下載檔案、洗掉檔案
* Created by AmoXiang
*/
public class HdfsOp {
public static void main(String[] args) throws Exception {
//創建一個配置物件
Configuration conf = new Configuration();
//指定HDFS的地址
conf.set("fs.defaultFS", "hdfs://bigdata01:9000");
//獲取操作HDFS的物件
FileSystem fileSystem = FileSystem.get(conf);
//獲取HDFS檔案系統的輸出流
FSDataOutputStream fos = fileSystem.create(new Path("/winin.txt"));
//獲取本地檔案的輸入流
FileInputStream fis = new FileInputStream("D:\\file\\test.txt");
//上傳檔案:通過工具類把輸入流拷貝到輸出流里面,實作本地檔案上傳到HDFS
IOUtils.copyBytes(fis, fos, 1024, true);
}
}
執行代碼,發現報錯,提示權限拒絕,說明 Windows 中的這個用戶沒有權限向 HDFS 中寫入資料,

解決辦法有兩個:
(1) 去掉 hdfs 的用戶權限檢驗機制,通過在 hdfs-site.xml 中配置 dfs.permissions.enabled 為 false 即可,
(2) 把代碼打包到 linux 中執行,
在這里為了在本地測驗方便,我們先使用第一種方式,
-
停止 Hadoop 集群,cd /data/soft/hadoop-3.2.0、sbin/stop-all.sh
-
修改 hdfs-site.xml 組態檔,注意:集群內所有節點中的組態檔都需要修改,先在 bigdata01 節點上修改,然后再同步到另外兩個節點上,vi etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>bigdata01:50090</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration> -
同步到另外兩個節點中,scp -rq etc/hadoop/hdfs-site.xml bigdata02:/data/soft/hadoop-3.2.0/etc/hadoop/、scp -rq etc/hadoop/hdfs-site.xml bigdata03:/data/soft/hadoop-3.2.0/etc/hadoop/
-
啟動集群:sbin/start-all.sh
-
重新再執行代碼,沒有報錯,到 hdfs 上查看資料,

在執行代碼的時候會發現輸出了很多紅色的警告資訊,雖然不影響代碼執行,但是看起來很礙眼,強迫癥實在忍不了,如何解決這個問題呢?通過分析錯誤資訊發現第一個是缺少 log4j 的實作類,第二個是缺少 log4j 的組態檔,
-
pom.xml 中增加 log4j 依賴,
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.10</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.10</version> </dependency> -
resources 目錄下添加 log4j.properties 檔案,在專案的 src\main\resources 目錄中添加 log4j.properties,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274837.html
標籤:其他
上一篇:Linux--自定義minishell中實作重定向功能
下一篇:【Linux 1】入門
