在 HDFS
中,讀取通常會透過 DataNode
。因此,當客戶端要求 DataNode
讀取檔案時,DataNode
會從磁碟讀取該檔案,並透過 TCP socket 將資料傳送給客戶端。所謂的「短路」讀取會繞過 DataNode
,讓客戶端可以直接讀取檔案。顯然地,這只有在客戶端與資料位於同一個位置時才有可能。短路讀取可大幅提升許多應用程式的效能。
若要組態短路本機讀取,您需要啟用 libhadoop.so
。有關如何啟用此函式庫的詳細資訊,請參閱 本機函式庫。
短路讀取使用 UNIX 域套接字。這是檔案系統中的特殊路徑,允許用戶端和 DataNode
進行通訊。您需要設定此套接字的路徑。DataNode
需要能夠建立此路徑。另一方面,除了 HDFS 使用者或 root 之外,任何使用者都不應該能夠建立此路徑。因此,通常會使用 /var/run
或 /var/lib
底下的路徑。
用戶端和 DataNode
透過 /dev/shm
上的共享記憶體區段交換資訊。
短路本機讀取需要在 DataNode
和用戶端上設定。
以下是範例設定。
<configuration> <property> <name>dfs.client.read.shortcircuit</name> <value>true</value> </property> <property> <name>dfs.domain.socket.path</name> <value>/var/lib/hadoop-hdfs/dn_socket</value> </property> </configuration>
舊版短路本機讀取實作(用戶端直接開啟 HDFS 區塊檔案)仍然可以使用於 Linux 以外的平台。除了 dfs.client.read.shortcircuit
之外,將 dfs.client.use.legacy.blockreader.local
的值設定為 true 即可啟用此功能。
您還需要將 dfs.datanode.data.dir.perm
的值設定為 750
,而不是預設的 700
,並將 dfs.datanode.data.dir
底下的目錄樹 chmod/chown 為用戶端和 DataNode
可讀取。您必須小心,因為這表示用戶端可以繞過 HDFS 權限讀取所有區塊檔案。
由於舊版短路本機讀取不安全,因此此功能的存取權限僅限於 dfs.block.local-path-access.user
的值中所列出的使用者。
<configuration> <property> <name>dfs.client.read.shortcircuit</name> <value>true</value> </property> <property> <name>dfs.client.use.legacy.blockreader.local</name> <value>true</value> </property> <property> <name>dfs.datanode.data.dir.perm</name> <value>750</value> </property> <property> <name>dfs.block.local-path-access.user</name> <value>foo,bar</value> </property> </configuration>