HDFS集群主要由 NameNode 管理文件系統(tǒng) Metadata 和 DataNodes 存儲的實際數(shù)據(jù)。
HDFS中的讀/寫操作運行在塊級。HDFS數(shù)據(jù)文件被分成塊大小的塊,這是作為獨立的單元存儲。默認塊大小為64 MB。
HDFS操作上是數(shù)據(jù)復(fù)制的概念,其中在數(shù)據(jù)塊的多個副本被創(chuàng)建,分布在整個節(jié)點的群集以使在節(jié)點故障的情況下數(shù)據(jù)的高可用性。
注: 在HDFS的文件,比單個塊小,不占用塊的全部存儲。
數(shù)據(jù)讀取請求將由 HDFS,NameNode和DataNode來服務(wù)。讓我們把讀取器叫 “客戶”。下圖描繪了文件的讀取操作在 Hadoop 中。

在本節(jié)中,我們將了解如何通過的文件將數(shù)據(jù)寫入到 HDFS。

在本節(jié)中,我們來了解 Java 接口并用它們來訪問Hadoop的文件系統(tǒng)。
為了使用編程方式與 Hadoop 文件系統(tǒng)進行交互,Hadoop 提供多種 Java 類。org.apache.hadoop.fs 包中包含操縱 Hadoop 文件系統(tǒng)中的文件類工具。這些操作包括,打開,讀取,寫入,和關(guān)閉。實際上,對于 Hadoop 文件 API 是通用的,可以擴展到 HDFS 的其他文件系統(tǒng)交互。
編程從 HDFS 讀取文件
java.net.URL 對象是用于讀取文件的內(nèi)容。首先,我們需要讓 Java 識別 Hadoop 的 HDFS URL架構(gòu)。這是通過調(diào)用 URL 對象的 setURLStreamHandlerFactory方法和 FsUrlStreamHandlerFactory 的一個實例琮傳遞給它。此方法只需要執(zhí)行一次在每個JVM,因此,它被封閉在一個靜態(tài)塊中。
示例代碼
| publicclassURLCat { static{ URL.setURLStreamHandlerFactory(newFsUrlStreamHandlerFactory()); } publicstaticvoidmain(String[] args) throwsException { InputStream in = null; try{ in = newURL(args[0]).openStream(); IOUtils.copyBytes(in, System.out, 4096, false); } finally{ IOUtils.closeStream(in); } } } |
這段代碼用于打開和讀取文件的內(nèi)容。HDFS文件的路徑作為命令行參數(shù)傳遞給該程序。
這是與 HDFS 交互的最簡單的方法之一。 命令行接口支持對文件系統(tǒng)操作,例如:如讀取文件,創(chuàng)建目錄,移動文件,刪除數(shù)據(jù),并列出目錄。
可以執(zhí)行 '$HADOOP_HOME/bin/hdfs dfs -help' 來獲得每一個命令的詳細幫助。這里, 'dfs' HDFS是一個shell命令,它支持多個子命令。首先要啟動 Haddop 服務(wù)(使用 hduser_用戶),執(zhí)行命令如下:
hduser_@ubuntu:~$ su hduser_ hduser_@ubuntu:~$ $HADOOP_HOME/sbin/start-dfs.sh hduser_@ubuntu:~$ $HADOOP_HOME/sbin/start-yarn.sh
一些廣泛使用的命令的列表如下
1. 從本地文件系統(tǒng)復(fù)制文件到 HDFS
hduser_@ubuntu:~$ $HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
此命令將文件從本地文件系統(tǒng)拷貝 temp.txt 文件到 HDFS。
2. 我們可以通過以下命令列出一個目錄下存在的文件 -ls
hduser_@ubuntu:~$ $HADOOP_HOME/bin/hdfs dfs -ls /


我們可以看到一個文件 'temp.txt“(之前復(fù)制)被列在”/“目錄。
3. 以下命令將文件從 HDFS 拷貝到本地文件系統(tǒng)
hduser_@ubuntu:~$ $HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
我們可以看到 temp.txt 已經(jīng)復(fù)制到本地文件系統(tǒng)。
4. 以下命令用來創(chuàng)建新的目錄
hduser_@ubuntu:~$ $HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory