HDFS 短路本機讀取

短路本機讀取

背景

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 短路本機讀取

舊版短路本機讀取實作(用戶端直接開啟 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>