前言:這次學(xué)習(xí)實際操作跟hdfs交互,
hadoop fs命令代表著hadoop的file system文件系統(tǒng)。要操作hdfs就需要跟這個前綴命令打交道。
一、往hdfs上傳下載文件
實驗?zāi)康模河^察如何往hdfs上傳文件,并通過網(wǎng)頁界面查看超過128m的文件分塊和存儲情況。
實驗命令:hadoop fs -put 文件路徑
實際操作如下圖:


對應(yīng)往hdfs上傳文件就會有從hdfs下載文件到本地,命令如下
hadoop fs -get hdfs://host:port/user/hadoop/file localfile 成功返回0,失敗返回-1。
二、hdfs的命令記錄
hadoop fs -mkdir 文件目錄 //創(chuàng)建目錄
hadoop fs -rm 文件名 //刪文件
hadoop fs -rm -r 文件夾 // 刪文件夾,遞歸刪除
hadoop fs -text 文件名 //改
hadoop fs -cat //查看文件內(nèi)容
hadoop fs -ls 文件路徑 //查,列舉目錄下的文件
hadoop fs -du -s -h /apps/hive/warehouse/test.db/test //查詢文件大小,這里即對于表容量
hadoop fs -cp [-f選項會覆蓋已經(jīng)存在的目標] 原文件路徑 目標路徑 //復(fù)制文件
hadoop fs -mv 文件路徑 目標路徑 //移動文件
hadoop fs -count 文件路徑 //統(tǒng)計文件路徑下的目錄、文件、字節(jié)數(shù)
另外:在vim編輯器中,刪除一整行的命令是dd
三、修改hdfs的配置文件hdfs-site.xml
在<configuration>標簽組里添加<property>配置
- 下面這個標簽屬性是配置文件默認的備份份數(shù)(默認是三份),比如設(shè)置為2這樣文件在hdfs中就備份2份。
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
- 下面這個標簽屬性是設(shè)置hadoop每隔多長時間檢查集群機器中的哪些機器宕機了,默認為300000毫秒(即5分鐘),我們可以設(shè)置短一些(比如10000毫秒,即1分鐘)。注意:集群機器宕機了一兩臺是不會影響集群對外提供服務(wù)的,因為集群本就是多臺機器為同一個任務(wù)服務(wù)。
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>10000</value>
</property>
- 下面這個標簽屬性是用來配置hdfs取消用戶權(quán)限檢查的
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
還有許多屬性沒記錄到,需要的時候百度或者查api就足夠了。
- 注意,在上一篇搭建Hadoop集群環(huán)境的時候,我沒有修改hadoop文件存儲在哪里,所以默認是放在根目錄的/tmp目錄下,而tmp目錄在Linux系統(tǒng)下關(guān)機后是會不定時清除的,所以這會導(dǎo)致一個非常嚴重的問題,就是你的集群會時而啟動正常時而啟動不正常。解決方法:更改hadoop文件的默認存儲位置,通過設(shè)置core-site.xml配置文件,加入如下標簽組屬性,集群內(nèi)的所有機器都要配置,不止是namenode,datanode也要配置這個屬性,然后關(guān)閉集群,格式化下namenode,再重啟集群就可以了。
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
最后放一個HDFS的理論篇,別人以漫畫的形式寫的。
https://mp.weixin.qq.com/s/8p6R8j2LLmFcaenOtVywVg
hadoop客戶端和hdfs交互的原理是:
比如往hdfs上傳功能,hadoop先訪問namenode,namenode指定文件存放在哪個datanode,然后告訴hadoop客戶端,hadoop再去訪問對應(yīng)的datanode。
比如從hdfs下載功能,hadoop先訪問namenode,namenode查找文件存放在哪個datanode,然后告訴hadoop客戶端,hadoop再去訪問對應(yīng)的datanode。
四、寫Java程序訪問HDFS
寫java程序訪問hdfs之前得先導(dǎo)入hadoop對應(yīng)的包,然后再上傳一個文件到hdfs文件系統(tǒng)內(nèi)作為前提條件。這些jar包在hadoop安裝包目錄下,我直接放在我的網(wǎng)盤中,有需要自行下載然后導(dǎo)入jar包再寫程序。
網(wǎng)盤鏈接:https://pan.baidu.com/s/1EbvHSzcGCkCf8Vgb6KgCyw
提取碼:npk7
下面的java程序是一些基礎(chǔ)的訪問hdfs的方法,要了解更多還是得去看API文檔。
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class HelloHDFS {
public static void main(String[] args) throws Exception{
boolean success;
//不加這一行設(shè)置,默認url只識別http協(xié)議
//所以必須通過這一行設(shè)置一個專門用來處理hdfs協(xié)議的FsUrlStreamHandlerFactory工廠
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
URL url = new URL("hdfs://10.14.28.100:9000/test.txt");
InputStream in = url.openStream();
//把輸入流的內(nèi)容轉(zhuǎn)到輸出流,true是完成后自動關(guān)閉流,4096是緩沖區(qū)大小
IOUtils.copyBytes(in,System.out,4096,true);
//相當于在命令行中配置core-site.xml的屬性
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://10.14.28.100:9000");
//根據(jù)配置獲得一個文件系統(tǒng)
FileSystem fs = FileSystem.get(conf);
//新建一個文件目錄
success = fs.mkdirs(new Path("/xiaojiang"));
System.out.println(success);
//判斷文件是否存在
success = fs.exists(new Path("/test.txt"));
System.out.println(success);
//刪除文件目錄
success = fs.delete(new Path("/xiaojiang"));
System.out.println(success);
//驗證是否還存在被刪除的文件目錄
success = fs.exists(new Path("/xiaojiang"));
System.out.println(success);
FSDataOutputStream out = fs.create(new Path("/test.data"),true);
//把window的文件傳到hdfs中
FileInputStream fin = new FileInputStream("D:/Hive編程指南 PDF 中文高清版.pdf");
IOUtils.copyBytes(fin,out,4096,true);
//獲得指定目錄下的每個文件的信息
FileStatus[] statues = fs.listStatus(new Path("/"));
for(FileStatus statu:statues) {
System.out.println(statu.getPath());
System.out.println(statu.getPermission());
System.out.println(statu.getReplication());
}
}
}
五、小結(jié)
文章是根據(jù)馬士兵老師的hadoop入門視頻教程所學(xué)整理,視頻講得挺好的,期間遇到一些錯誤就百度自行解決。
HDFS我們可以理解為是一個分冗展的大硬盤,即分塊且多份存儲、冗余存儲、橫向擴展。

答:
1、Hadoop分為HDFS、MapReduce、YARN主要三個邏輯組件。
2、HDFS的典型架構(gòu)是主從架構(gòu),即一臺master機器啟動namenode進程,管理著多臺slave啟動著datanode的機器。
3、當空間不夠了,可以通過加機器擴充datanode,配置好datanode,然后設(shè)置core-site.xml配置文件告訴master機器擴充了datanode,并交由namenode管理,這就是橫向擴展,很方便很具有健壯性。
4、HDFS典型應(yīng)用有百度網(wǎng)盤這種。
5、不會復(fù)制一份數(shù)據(jù)到我的網(wǎng)盤,只是存放一個鏈接到其他datanode,訪問時通過鏈接訪問對方的網(wǎng)盤。