HDFS叢集主要由 NameNode 管理檔案系統 Metadata 和 DataNodes 儲存的實際資料。
HDFS中的讀/寫操作執行在塊級。HDFS資料檔案被分成塊大小的塊,這是作為獨立的單元儲存。預設塊大小為64 MB。
HDFS操作上是資料複製的概念,其中在資料塊的多個副本被建立,分布在整個節點的群集以使在節點故障的情況下資料的高可用性。
註: 在HDFS的檔案,比單個塊小,不占用塊的全部儲存。
資料讀取請求將由 HDFS,NameNode和DataNode來服務。讓我們把讀取器叫 “客戶”。下圖描繪了檔案的讀取操作在 Hadoop 中。
在本節中,我們將了解如何通過的檔案將資料寫入到 HDFS。
在本節中,我們來了解 Java 介面並用它們來存取Hadoop的檔案系統。
為了使用程式設計方式與 Hadoop 檔案系統進行互動,Hadoop 提供多種 Java 類。org.apache.hadoop.fs 包中包含操縱 Hadoop 檔案系統中的檔案類工具。這些操作包括,開啟,讀取,寫入,和關閉。實際上,對於 Hadoop 檔案 API 是通用的,可以擴充套件到 HDFS 的其他檔案系統互動。
程式設計從 HDFS 讀取檔案
java.net.URL 物件是用於讀取檔案的內容。首先,我們需要讓 Java 識別 Hadoop 的 HDFS URL架構。這是通過呼叫 URL 物件的 setURLStreamHandlerFactory方法和 FsUrlStreamHandlerFactory 的一個範例琮傳遞給它。此方法只需要執行一次在每個JVM,因此,它被封閉在一個靜態塊中。
範例程式碼
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);
}
}
}
|
這段程式碼用於開啟和讀取檔案的內容。HDFS檔案的路徑作為命令列引數傳遞給該程式。
這是與 HDFS 互動的最簡單的方法之一。 命令列介面支援對檔案系統操作,例如:如讀取檔案,建立目錄,移動檔案,刪除資料,並列出目錄。
可以執行 '$HADOOP_HOME/bin/hdfs dfs -help' 來獲得每一個命令的詳細幫助。這裡, 'dfs' HDFS是一個shell命令,它支援多個子命令。首先要啟動 Haddop 服務(使用 hduser_使用者),執行命令如下:
hduser_@ubuntu:~$ su hduser_ hduser_@ubuntu:~$ $HADOOP_HOME/sbin/start-dfs.sh hduser_@ubuntu:~$ $HADOOP_HOME/sbin/start-yarn.sh
一些廣泛使用的命令的列表如下
1. 從本地檔案系統複製檔案到 HDFS
hduser_@ubuntu:~$ $HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
此命令將檔案從本地檔案系統拷貝 temp.txt 檔案到 HDFS。
2. 我們可以通過以下命令列出一個目錄下存在的檔案 -ls
hduser_@ubuntu:~$ $HADOOP_HOME/bin/hdfs dfs -ls /
我們可以看到一個檔案 'temp.txt“(之前複製)被列在”/“目錄。
3. 以下命令將檔案從 HDFS 拷貝到本地檔案系統
hduser_@ubuntu:~$ $HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
我們可以看到 temp.txt 已經複製到本地檔案系統。
4. 以下命令用來建立新的目錄
hduser_@ubuntu:~$ $HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory