简单的HDFS操作
簡(jiǎn)單的HDFS操作
文章目錄
- 簡(jiǎn)單的HDFS操作
- HDFS常用Shell命令
- 使用HDFS的Shell命令
- 輸出HDFS某一個(gè)目錄下所有文件詳細(xì)信息
- 向HDFS中上傳任意文本文件
- 將HDFS中指定文件的內(nèi)容輸出到終端
- 從HDFS中下載指定文件
- 刪除HDFS中指定的文件
- HDFS常用JavaAPI
- 使用HDFS的JavaAPI
- 創(chuàng)建工程并導(dǎo)入JAR包
- 向HDFS上傳任意文本文件
- 從HDFS下載指定文件
- 參考文章
HDFS常用Shell命令
操作 HDFS的 Shell命令有三種:
官方并不推薦使用第二種命令 hadoop dfs,有些 Hadoop版本中已將這種命令棄用。
Shell命令語(yǔ)法如下
hadoop fs [genericOptions] [commandOptions]
| hadoop fs -ls | 顯示指定文件的詳細(xì)信息 |
| hadoop fs -cat | 將指定文件的內(nèi)容輸出到標(biāo)準(zhǔn)輸出 |
| hadoop fs touchz | 創(chuàng)建一個(gè)指定的空文件 |
| hadoop fs -mkdir [-p] | 創(chuàng)建指定的一個(gè)或多個(gè)文件夾,-p選項(xiàng)用于遞歸創(chuàng)建 |
| hadoop fs -cp | 將文件從源路徑復(fù)制到目標(biāo)路徑 |
| hadoop fs -mv | 將文件從源路徑移動(dòng)到目標(biāo)路徑 |
| hadoop fs -rm | 刪除指定的文件,只刪除非空目錄和文件 |
| hadoop fs -rm -r | 刪除指定的文件夾及其下的所有文件,-r表示遞歸刪除子目錄 |
| hadoop fs -chown | 改變指定文件的所有者為,該命令僅適用于超級(jí)用戶 |
| hadoop fs -chmod | 將指定的文件權(quán)限更改為,該命令僅適用于超級(jí)用戶和文件所有者 |
| hadoop fs -get | 復(fù)制指定的文件到本地文件系統(tǒng)指定的文件或文件夾 |
| hadoop fs -put | 從本地文件系統(tǒng)中復(fù)制指定的單個(gè)或多個(gè)源文件到指定的目標(biāo)文件系統(tǒng) |
| hadoop fs -moveFromLocal | 與put命令功能相同,但是文件上傳結(jié)束后會(huì)刪除源文件 |
| hadoop fs -copyFromLocal | 將本地源文件復(fù)制到路徑指定的文件或文件夾中 |
| hadoop fs -copyToLocal | 將目標(biāo)文件復(fù)制到本地文件或文件夾中 |
使用HDFS的Shell命令
輸出HDFS某一個(gè)目錄下所有文件詳細(xì)信息
我的 Hadoop版本為 Hadoop3.1.3。首先,我們先開(kāi)啟 Hadoop集群
cd $HADOOP_HOME ./sbin/start-dfs.sh如果沒(méi)有配置環(huán)境變量 HADOOP_HOME,請(qǐng)把上面命令中的 HADOOP_HOME改成你本地 Hadoop的安裝位置。
第一次使用HDFS時(shí),需要首先在HDFS中創(chuàng)建用戶目錄。我們建立用戶目錄/user/hadoop。
./bin/hdfs dfs –mkdir –p /user/hadoop
用戶目錄的名字自己可以隨意擬定,因?yàn)槲椰F(xiàn)在使用的用戶名是 hadoop,所以我的用戶目錄順便也叫 hadoop。
用戶目錄建立完成后,所有的操作都會(huì)在用戶目錄上進(jìn)行。也就是說(shuō),現(xiàn)在用戶目錄就是當(dāng)前 HDFS默認(rèn)的操作路徑。例如,我們?cè)?HDFS直接上建立文件夾 test,它的絕對(duì)路徑是 /user/hadoop/test。
//下面兩個(gè)命令等價(jià) ./bin/hdfs dfs –mkdir test ./bin/hdfs dfs –mkdir /user/hadoop/test我們?cè)谟脩裟夸浵陆nput和output文件夾,并創(chuàng)建一個(gè)abc.txt文件。
./bin/hdfs dfs -mkdir input output ./bin/hdfs dfs touchz abc.txt我們現(xiàn)在可以查看用戶目錄下所有文件的讀寫(xiě)權(quán)限、大小、創(chuàng)建時(shí)間、路徑等信息。
./bin/hdfs dfs -ls .
向HDFS中上傳任意文本文件
我們?cè)诒镜?home目錄中創(chuàng)建一個(gè) myFile.txt文件,使用 vim編輯文件。
cd ~ touch myFile.txt vim myFile.txt按 “i” 鍵進(jìn)入編輯模式,隨便往文件里輸入一些字母,比如
hadoop spark flink然后按 “esc” 鍵,輸入“:wq”保存并退出。
然后我們使用 put命令,把 myFile.txt文件上傳到 HDFS用戶目錄的 input文件夾中。
cd $HADOOP_HOME ./bin/hdfs dfs -put ~/myLocalFile.txt input我們可以使用 ls命令查看一下文件是否成功上傳到HDFS中
./bin/hdfs dfs –ls input
可以看到,myFile.txt文件已經(jīng)在 input文件夾中。
將HDFS中指定文件的內(nèi)容輸出到終端
我們使用 cat命令即可查看 HDFS中 myFile.txt文件的內(nèi)容
./bin/hdfs dfs -cat input/myFile.txt
從HDFS中下載指定文件
我們使用 get命令將剛才上傳的 myFile.txt文件下載到本地 home/Videos目錄中
./bin/hdfs dfs -get input/myFile.txt ~/Videos
同樣地,使用 ls命令查看是否下載成功
cd ~/Videos ls刪除HDFS中指定的文件
我們使用 rm 命令刪除 input文件夾,以及該文件夾下的所有文件
cd $HADOOP_HOME ./bin/hdfs dfs -rm -r input然后用 ls命令查看用戶目錄,判斷是否刪除成功
./bin/hdfs dfs -ls .
HDFS常用JavaAPI
Hadoop本身使用 Java語(yǔ)言編寫(xiě)的,Hadoop不同的文件系統(tǒng)之間可以通過(guò)調(diào)用 JavaAPI來(lái)進(jìn)行交互。Shell命令本質(zhì)上就是 JavaAPI的應(yīng)用。
| org.apache.hadoop.fs.FileSystem | 一個(gè)通用文件系統(tǒng)的抽象基類,可以被分布式文件系統(tǒng)繼承。所有可能使用 Hadoop文件系統(tǒng)的代碼都要使用這個(gè)類。 |
| org.apache.hadoop.fs.FileStatus | 一個(gè)接口,用于向客戶端展示系統(tǒng)中文件和目錄的元數(shù)據(jù),具體包括文件大小、塊大小、副本信息、所有者、修改時(shí)間等。 |
| org.apache.hadoop.fs.FSDataInputStream | 文件輸入流,用于讀取 Hadoop文件 |
| org.apache.hadoop.fs.FSDataOutputStream | 文件輸入流,用于寫(xiě) Hadoop文件 |
| org.apache.hadoop.conf.Configuration | 訪問(wèn)配置項(xiàng) |
| org.apache.hadoop.fs.Path | 用于表示 Hadoop文件系統(tǒng)中的一個(gè)文件或一個(gè)目錄的路徑 |
使用HDFS的JavaAPI
創(chuàng)建工程并導(dǎo)入JAR包
這里我們使用的是 Ubuntu16.04系統(tǒng),IDE是 Eclipse。如果沒(méi)有在 Ubuntu系統(tǒng)上安裝 Eclipse的,請(qǐng)參考這篇博客進(jìn)行安裝 Ubuntu16.04系統(tǒng)安裝Eclipse
啟動(dòng) Eclipse,在菜單欄選擇 “File”->“New”->“Java Project”,創(chuàng)建新的 Java項(xiàng)目。
根據(jù)個(gè)人喜好輸入工程名稱,這里我們輸入“HDFS_Practice”。勾選“Use default location”,讓工程文件保存在我們?cè)O(shè)置的 Eclipse的工作區(qū)里。JRE部分選擇“Use a project specific JRE”,使用我們自己安裝的 JDK版本。然后點(diǎn)擊“next”,進(jìn)入下一步。
我們需要為項(xiàng)目導(dǎo)入必要的 JAR包,這些 JAR包中包含了可以訪問(wèn) HDFS的 Java API。JAR包的位置在“Hadoop安裝目錄/share/hadoop”目錄下。比如我的是在“/usr/local/hadoop/share/hadoop”目錄下,下面的操作中請(qǐng)選擇到自己配置的 hadoop目錄下導(dǎo)入 JAR包。
我們點(diǎn)擊標(biāo)題欄的“Libraries”,點(diǎn)擊“Add Externtal JARs”
在新的彈窗中,我們通過(guò)選擇上面的文件目錄,進(jìn)入“/usr/local/hadoop/share/hadoop”目錄,記住是進(jìn)入自己的Hadoop安裝目錄。
我們需要向 Java工程中添加以下 JAR包:
- “/usr/local/hadoop/share/hadoop/common”目錄下的所有 JAR包,即 hadoop-common-3.1.3.jar、hadoop-common-3.1.3-tests.jar、haoop-nfs-3.1.3.jar和、haoop-kms-3.1.3.jar,不包括 jdiff、lib、sources、webapps四個(gè)文件夾。
- “/usr/local/hadoop/share/hadoop/common/lib”目錄下的所有 JAR包
- “/usr/local/hadoop/share/hadoop/hdfs”目錄下的所有 JAR包。同樣地,不包括 jdiff、lib、sources、webapps四個(gè)文件夾。
- “/usr/local/hadoop/share/hadoop/hdfs/lib”目錄下的所有 JAR包
我們分四次操作,把需要的 JAR包全部導(dǎo)入進(jìn)來(lái)(lib目錄下的 JAR包太多,我們可以使用 Ctrl+A快捷鍵進(jìn)行全選)。所需的 JAR包全部添加完畢以后,我們點(diǎn)擊右下角的“Finish”,完成 Java工程的創(chuàng)建。
如果是第一次使用 Eclipse來(lái)操作 HDFS,我們還需要去關(guān)閉 HDFS的權(quán)限檢測(cè)。因?yàn)?HDFS的權(quán)限檢測(cè)機(jī)制默認(rèn)是打開(kāi)的,未關(guān)閉的時(shí)候,不能使用 eclipse插件對(duì) HDFS上的文件進(jìn)行操作,比如上傳,刪除等。我們先關(guān)閉 HDFS服務(wù),然后在 hdfs-site.xml文件中加入一個(gè)變量 dfs.permissions,值設(shè)置為 false,用來(lái)其關(guān)閉權(quán)限檢測(cè)。
我們先進(jìn)入 home folder(也就是文件管理器),點(diǎn)擊右上角的更多按鈕,選擇“Enter Location”
然后彈出的搜索框中輸入“hadoop安裝目錄/etc/hadoop”,回車(chē)進(jìn)入目錄,然后找到 hdfs-site.xml,鼠標(biāo)右鍵點(diǎn)擊文件,選擇“Open with”->“vim”進(jìn)行編輯。
輸入以下代碼并保存。
<property><name>dfs.permissions</name><value>false</value> </property>因?yàn)槲覀兪莻畏植际侥J竭\(yùn)行 Hadoop,我們還需要將“hadoop安裝目錄/etc/hadoop”目錄下的 core-site.xml、hdfs-site.xml這兩個(gè)文件拷貝到 eclipse工作區(qū)中該工程的 bin文件夾下。
向HDFS上傳任意文本文件
我們開(kāi)始新建一個(gè) Java程序,在 Eclipse界面左側(cè)找到我們剛才創(chuàng)建的項(xiàng)目,點(diǎn)擊鼠標(biāo)右鍵,選擇“New”->“Class”。
因?yàn)槲覀兿胍?HDFS上傳任意文本文件,所以我們?nèi)∶麨椤皍ploadFile”,其他設(shè)置保持默認(rèn),點(diǎn)擊“Finish”。
創(chuàng)建程序完成后,界面如下
接下來(lái),我們開(kāi)始編寫(xiě)往 HDFS中上傳文件的 Java程序。
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;public class uploadFile {public static void main(String[] args) {try {/*配置參數(shù)*/Configuration conf = new Configuration(); //實(shí)例化配置對(duì)象URI uri = new URI("hdfs://localhost:9000"); //指定偽分布式模式FileSystem fs = FileSystem.get(uri, conf, "hadoop"); //獲取文件系統(tǒng)對(duì)象,三個(gè)參數(shù)分別綁定uri,conf,當(dāng)前用戶賬戶/*指定源文件和上傳目錄*/String srcFile = "/home/hadoop/myFile.txt"; //本地目錄String dstDir = "/user/hadoop/"; //hdfs用戶目錄Path src = new Path(srcFile); //綁定Path路徑Path dst = new Path(dstDir);/*上傳文件*/fs.copyFromLocalFile(src, dst); //調(diào)用copyFromLocal命令fs.close(); //關(guān)閉文件系統(tǒng)對(duì)象} catch (Exception e) {e.printStackTrace();}} }源文件是我已經(jīng)提前編寫(xiě)好放在 /home/hadoop/目錄下的 myFile.txt,待上傳的目錄 /user/hadoop也是之前創(chuàng)建好的。
在開(kāi)始編譯運(yùn)行程序之前,請(qǐng)一定確保 Hadoop已經(jīng)啟動(dòng)運(yùn)行,如果還沒(méi)有啟動(dòng),請(qǐng)打開(kāi)一個(gè) Linux終端,輸入命令啟動(dòng) Hadoop
cd $HADOOP_HOME ./sbin/start-dfs.sh按快捷鍵“Ctrl+S”保存一下代碼,接下來(lái)我們開(kāi)始編譯運(yùn)行 Java程序。我們點(diǎn)擊 Eclipse菜單欄上的運(yùn)行按鈕,選擇“Run as”->“Java Application”。或者我們也可以使用快捷鍵“Ctrl+F11”直接運(yùn)行。
程序運(yùn)行結(jié)束后,底部的“Console”控制臺(tái)會(huì)彈出運(yùn)行信息,我們可以根據(jù)運(yùn)行信息來(lái)判斷程序是否成功執(zhí)行。
如果遇到“l(fā)og4j:WARN···”之類的警告信息,將 “hadoop安裝目錄/etc/hadoop”目錄下的 log4j.properties文件復(fù)制到項(xiàng)目的 bin文件夾下,重新運(yùn)行即可。
如果在控制臺(tái)上看到這個(gè)提示信息,則證明文件上傳成功。
INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
我們看到,雖然程序運(yùn)行沒(méi)有問(wèn)題,但是多了一個(gè)警告,說(shuō)是不能加載 native-hadoop庫(kù)。
Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
這是因?yàn)槲覀冃薷呐渲梦募臅r(shí)候少配置了 native路徑,系統(tǒng)加載不到這些庫(kù)文件。具體解決辦法請(qǐng)參考這篇博客 Hadoop之Unable to load native-hadoop library問(wèn)題解決
言歸正傳,我們現(xiàn)在通過(guò) terminal終端,驗(yàn)證一下文件是否上傳成功。
cd $HADOOP_HOME ./bin/hdfs dfs -ls .可以看到,HDFS的用戶目錄 /user/hadoop下已經(jīng)有了 myFile.txt文件。
我們也可以通過(guò) Web界面來(lái)查看 HDFS的文件,進(jìn)行驗(yàn)證。打開(kāi) Ubuntu自帶的 FireFox瀏覽器,在地址欄輸入“l(fā)ocalhost:9870”,回車(chē),進(jìn)入 HDFS的 WebUI。點(diǎn)擊標(biāo)題欄右側(cè)的“Utilities”,選擇“Browse the file system”
在下方目錄搜索欄中輸入“/user/hadoop”,然后回車(chē)。可以看到,此時(shí) HDFS的用戶目錄下的確存在 myFile.txt文件,通過(guò) Java API向 HDFS 上傳文件成功。
從HDFS下載指定文件
同理,我們新建 Java程序 downloadFile.java,使用 Java API編寫(xiě)程序從 HDFS下載文件。我們就將剛才上傳的 myFile.txt文件,從 HDFS中下載到本地桌面上。
import java.net.URI;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;public class downloadFile {public static void main(String[] args) {try {//set configurationsConfiguration conf = new Configuration();URI uri = new URI("hdfs://localhost:9000");FileSystem fs = FileSystem.get(uri, conf, "hadoop");//set File and DirString srcFile = "/user/hadoop/myFile.txt";String dstDir = "/home/hadoop/Desktop/";Path src = new Path(srcFile);Path dst = new Path(dstDir);//downloadfs.copyToLocalFile(src, dst);fs.close();} catch (Exception e) {e.printStackTrace();}} }保存代碼,然后我們開(kāi)始編譯運(yùn)行 Java程序。同樣地,看到提示信息,證明文件下載成功。
INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
我們回到桌面上,可以看到,桌面上已經(jīng)有了 myFile.txt文件,通過(guò) Java API從 HDFS 下載文件成功。
參考文章
HDFS編程實(shí)踐(Hadoop3.1.3)
通過(guò)JAVA API 來(lái)操作HDFS
使用Java API操作hdfs
eclipse控制臺(tái)打印log4j警告
總結(jié)
- 上一篇: 使用VNC远程连接阿里云ECS实例的Ub
- 下一篇: 第一章-大数据概述