HDFS NFS 閘道

概觀

NFS 閘道支援 NFSv3,並允許將 HDFS 掛載為用戶端本機檔案系統的一部分。目前,NFS 閘道支援並啟用下列使用模式

  • 使用者可以在相容於 NFSv3 用戶端作業系統的本機檔案系統中瀏覽 HDFS 檔案系統。
  • 使用者可以從 HDFS 檔案系統下載檔案到他們的本機檔案系統。
  • 使用者可以從他們的本機檔案系統直接上傳檔案到 HDFS 檔案系統。
  • 使用者可透過掛載點將資料直接串流至 HDFS。支援檔案附加,但不支援隨機寫入。

NFS 閘道器機器需要相同的項目來執行 HDFS 儲存體,例如 Hadoop JAR 檔案、HADOOP_CONF 目錄。NFS 閘道器可以與 DataNode、NameNode 或任何 HDFS 儲存體位於相同主機上。

組態

NFS 閘道器使用代理使用者來代理所有存取 NFS 掛載的使用者。在非安全模式下,執行閘道器的使用者為代理使用者,而在安全模式下,Kerberos keytab 中的使用者為代理使用者。假設代理使用者為「nfsserver」,而屬於群組「users-group1」和「users-group2」的使用者使用 NFS 掛載,則在 NameNode 的 core-site.xml 中,必須設定下列兩個屬性,且僅在變更組態後需要重新啟動 NameNode(注意:將字串「nfsserver」替換為叢集中的代理使用者名稱)

<property>
  <name>hadoop.proxyuser.nfsserver.groups</name>
  <value>root,users-group1,users-group2</value>
  <description>
         The 'nfsserver' user is allowed to proxy all members of the 'users-group1' and
         'users-group2' groups. Note that in most cases you will need to include the
         group "root" because the user "root" (which usually belonges to "root" group) will
         generally be the user that initially executes the mount on the NFS client system.
         Set this to '*' to allow nfsserver user to proxy any group.
  </description>
</property>

<property>
  <name>hadoop.proxyuser.nfsserver.hosts</name>
  <value>nfs-client-host1.com</value>
  <description>
         This is the host where the nfs gateway is running. Set this to '*' to allow
         requests from any hosts to be proxied.
  </description>
</property>

以上是 NFS 閘道器在非安全模式下唯一需要的組態。對於 Kerberized Hadoop 叢集,需要將下列組態新增至閘道器的 hdfs-site.xml(注意:將字串「nfsserver」替換為代理使用者名稱,並確保 keytab 中包含的使用者也是相同的代理使用者)

  <property>
    <name>nfs.keytab.file</name>
    <value>/etc/hadoop/conf/nfsserver.keytab</value> <!-- path to the nfs gateway keytab -->
  </property>

  <property>
    <name>nfs.kerberos.principal</name>
    <value>nfsserver/_HOST@YOUR-REALM.COM</value>
  </property>

NFS 閘道器組態的其餘部分對於安全和非安全模式都是選用的。

  • AIX NFS 儲存體有 幾個已知問題,預設會導致它無法與 HDFS NFS 閘道器正確運作。如果您想要從 AIX 存取 HDFS NFS 閘道器,您應該設定下列組態設定,以啟用這些問題的解決方法

    <property>
      <name>nfs.aix.compatibility.mode.enabled</name>
      <value>true</value>
    </property>
    

    請注意,一般非 AIX 儲存體不應啟用 AIX 相容性模式。AIX 相容性模式實作的解決方法會有效停用防護措施,以確保透過 NFS 列出目錄內容會傳回一致的結果,且傳送至 NFS 伺服器的所有資料都能確保已提交。

  • HDFS 超級使用者是與 NameNode 程序本身具有相同身分的使用者,且超級使用者可以執行任何操作,因為超級使用者的權限檢查永遠不會失敗。如果已組態下列屬性,NFS 儲存體上的超級使用者可以存取 HDFS 上的任何檔案。預設情況下,閘道器中未組態超級使用者。請注意,即使已組態超級使用者,「nfs.exports.allowed.hosts」仍會生效。例如,如果 NFS 儲存體主機未被允許在「nfs.exports.allowed.hosts」中擁有寫入存取權,則超級使用者將無法透過閘道器對 HDFS 檔案擁有寫入存取權。

    <property>
      <name>nfs.superuser</name>
      <value>the_name_of_hdfs_superuser</value>
    </property>
    

強烈建議使用者根據其使用案例更新一些組態屬性。所有下列組態屬性都可以在 hdfs-site.xml 中加入或更新。

  • 如果客戶端以允許存取時間更新的方式掛載匯出,請確定組態檔中未停用下列屬性。此屬性變更後,只有 NameNode 需要重新啟動。在某些 Unix 系統上,使用者可以透過以「noatime」掛載匯出,來停用存取時間更新。如果匯出以「noatime」掛載,使用者不需要變更下列屬性,因此不需要重新啟動名稱節點。

    <property>
      <name>dfs.namenode.accesstime.precision</name>
      <value>3600000</value>
      <description>The access time for HDFS file is precise upto this value.
        The default value is 1 hour. Setting a value of 0 disables
        access times for HDFS.
      </description>
    </property>
    
  • 預期使用者會更新檔案傾印目錄。NFS 客戶端經常重新排序寫入,特別是在未以「sync」選項掛載匯出時。順序寫入可能會以隨機順序到達 NFS 閘道。此目錄用於在寫入 HDFS 之前,暫時儲存無序寫入。對於每個檔案,無序寫入會在累積超過記憶體中的特定閾值(例如 1MB)後傾印。需要確定目錄有足夠的空間。例如,如果應用程式上傳 10 個檔案,每個檔案 100MB,建議此目錄有大約 1GB 的空間,以防最糟情況下寫入重新排序發生在每個檔案。此屬性更新後,只有 NFS 閘道需要重新啟動。

      <property>
        <name>nfs.dump.dir</name>
        <value>/tmp/.hdfs-nfs</value>
      </property>
    
  • 預設情況下,任何客戶端都可以掛載匯出。為了更佳控制存取,使用者可以更新下列屬性。值字串包含機器名稱和存取權限,以空白字元分隔。機器名稱格式可以是單一主機、「*」、Java 正規表示式或 IPv4 位址。存取權限使用 rw 或 ro 來指定機器對匯出的讀取/寫入或唯讀存取。如果未提供存取權限,預設為唯讀。項目以「;」分隔。例如:「192.168.0.0/22 rw ; \\w*\\.example\\.com ; host1.test.org ro;」。此屬性更新後,只有 NFS 閘道需要重新啟動。請注意,這裡的 Java 正規表示式與 Linux NFS 匯出表格中使用的正規表示式不同,例如,使用「\\w*\\.example\\.com」取代「*.example.com」,「192\\.168\\.0\\.(11|22)」取代「192.168.0.[11|22]」,依此類推。

    <property>
      <name>nfs.exports.allowed.hosts</name>
      <value>* rw</value>
    </property>
    
  • HDFS 超級使用者是與 NameNode 程序本身具有相同身分的使用者,且超級使用者可以執行任何操作,因為超級使用者的權限檢查永遠不會失敗。如果已組態下列屬性,NFS 儲存體上的超級使用者可以存取 HDFS 上的任何檔案。預設情況下,閘道器中未組態超級使用者。請注意,即使已組態超級使用者,「nfs.exports.allowed.hosts」仍會生效。例如,如果 NFS 儲存體主機未被允許在「nfs.exports.allowed.hosts」中擁有寫入存取權,則超級使用者將無法透過閘道器對 HDFS 檔案擁有寫入存取權。

    <property>
      <name>nfs.superuser</name>
      <value>the_name_of_hdfs_superuser</value>
    </property>
    
  • 指標。與其他 HDFS 程式一樣,閘道公開執行時間指標。它以 JSON 文件的形式在 http://gateway-ip:50079/jmx 中提供。NFS 處理常式相關指標在「Nfs3Metrics」名稱下公開。可以透過將下列屬性加入 hdfs-site.xml 檔案來啟用延遲直方圖。

    <property>
      <name>nfs.metrics.percentiles.intervals</name>
      <value>100</value>
      <description>Enable the latency histograms for read, write and
         commit requests. The time unit is 100 seconds in this example.
      </description>
    </property>
    
  • JVM 和記錄設定。您可以在 HDFS_NFS3_OPTS 中匯出 JVM 設定(例如,堆積大小和 GC 記錄)。可以在 hadoop-env.sh 中找到更多與 NFS 相關的設定。若要取得 NFS 除錯追蹤,您可以編輯 log4j.property 檔案,加入下列內容。請注意,除錯追蹤,特別是針對 ONCRPC,可能會非常詳細。

    變更記錄等級

        log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG
    

    取得更多 ONCRPC 要求的詳細資料

        log4j.logger.org.apache.hadoop.oncrpc=DEBUG
    
  • 匯出點。可以指定 HDFS 的 NFS 匯出點。僅支援一個匯出點。設定匯出點時需要完整路徑。預設情況下,匯出點為根目錄「/」。

    <property>
      <name>nfs.export.point</name>
      <value>/</value>
    </property>
    

啟動和停止 NFS 閘道服務

需要三個守護程式來提供 NFS 服務:rpcbind(或 portmap)、mountd 和 nfsd。NFS 閘道程序同時具有 nfsd 和 mountd。它共享 HDFS 根目錄「/」作為唯一的匯出。建議使用 NFS 閘道套件中包含的 portmap。儘管 NFS 閘道適用於大多數 Linux 發行版提供的 portmap/rpcbind,但某些 Linux 系統(如 RHEL 6.2 和 SLES 11)需要套件中包含的 portmap,前者是因為 rpcbind 錯誤。可以在 HDFS-4763 中找到更詳細的討論。

  1. 停止平台提供的 nfsv3 和 rpcbind/portmap 服務(命令在不同的 Unix 平台上可能有所不同)

    [root]> service nfs stop
    [root]> service rpcbind stop
    
  2. 啟動 Hadoop 的 portmap(需要 root 權限)

    [root]> $HADOOP_HOME/bin/hdfs --daemon start portmap
    
  3. 啟動 mountd 和 nfsd。

    此命令不需要 root 權限。在非安全模式下,NFS 閘道應由本使用者指南開頭處提到的代理使用者啟動。而在安全模式下,只要使用者有權限讀取「nfs.keytab.file」中定義的 Kerberos 密鑰表,任何使用者都可以啟動 NFS 閘道。

    [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start nfs3
    
  4. 停止 NFS 閘道服務。

    [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop nfs3
    [root]> $HADOOP_HOME/bin/hdfs --daemon stop portmap
    

選擇性地,如果您以 root 身分啟動 NFS 閘道,則可以放棄執行 Hadoop 提供的 portmap 守护程序,而是在所有作業系統上使用系統 portmap 守护程序。這將允許 HDFS NFS 閘道解決上述錯誤,並仍使用系統 portmap 守护程序進行註冊。為此,只需像平常一樣啟動 NFS 閘道守护程序,但請務必以「root」使用者身分執行,並將「HDFS_NFS3_SECURE_USER」環境變數設定為非特權使用者。在此模式下,NFS 閘道將以 root 身分啟動,以執行其與系統 portmap 的初始註冊,然後將權限降回 HDFS_NFS3_SECURE_USER 指定的使用者,並在 NFS 閘道程序的生命週期剩餘時間內保持這種狀態。請注意,如果您選擇此路徑,應略過上述步驟 1 和 2。

驗證 NFS 相關服務的有效性

  1. 執行以下命令以驗證所有服務是否已啟動並執行

    [root]> rpcinfo -p $nfs_server_ip
    

    您應該會看到類似以下的輸出

           program vers proto   port
    
           100005    1   tcp   4242  mountd
    
           100005    2   udp   4242  mountd
    
           100005    2   tcp   4242  mountd
    
           100000    2   tcp    111  portmapper
    
           100000    2   udp    111  portmapper
    
           100005    3   udp   4242  mountd
    
           100005    1   udp   4242  mountd
    
           100003    3   tcp   2049  nfs
    
           100005    3   tcp   4242  mountd
    
  2. 驗證 HDFS 名稱空間是否已匯出且可掛載。

    [root]> showmount -e $nfs_server_ip
    

    您應該會看到類似以下的輸出

            Exports list on $nfs_server_ip :
    
            / (everyone)
    

掛載匯出「/」

目前 NFS v3 僅使用 TCP 作為傳輸協定。不支援 NLM,因此需要掛載選項「nolock」。強烈建議使用掛載選項「sync」,因為它可以將重新排序的寫入降至最低或避免重新排序的寫入,進而產生更可預測的傳輸量。未指定 sync 選項可能會在上傳大型檔案時導致行為不穩定。建議使用硬式掛載。這是因為,即使客戶端已將所有資料傳送至 NFS 閘道,當寫入是由 NFS 客戶端核心重新排序時,NFS 閘道可能需要一些額外時間將資料傳輸至 HDFS。

如果必須使用軟式掛載,使用者應給予相對較長的逾時時間(至少不短於主機上的預設逾時時間)。

使用者可依下列方式掛載 HDFS 名稱空間

 [root]>mount -t nfs -o vers=3,proto=tcp,nolock,noacl,sync $server:/  $mount_point

然後,使用者可以存取 HDFS 作為本機檔案系統的一部分,但目前尚不支援硬式連結和隨機寫入。若要最佳化大型檔案 I/O 的效能,可以在掛載期間增加 NFS 傳輸大小 (rsize 和 wsize)。預設情況下,NFS 閘道支援 1MB 作為最大傳輸大小。對於較大的資料傳輸大小,需要在 NFS 閘道電腦上的 hdfs-site.xml 中更新「nfs.rtmax」和「nfs.wtmax」。

允許未經授權的客戶端掛載

在一般無法取得客戶端電腦的 root 存取權的環境中,可以透過確保僅來自授權埠的 NFS 客戶端可以連線至 NFS 伺服器來取得一定程度的安全性。此功能稱為「埠監控」。此功能在 HDFS NFS 閘道中未預設啟用,但可以在 NFS 閘道電腦上的 hdfs-site.xml 中設定下列設定來選擇性啟用

<property>
  <name>nfs.port.monitoring.disabled</name>
  <value>false</value>
</property>

使用者驗證和對應

此版本中的 NFS 閘道使用 AUTH_UNIX 樣式驗證。當 NFS 客戶端上的使用者存取掛載點時,NFS 客戶端會將 UID 傳遞至 NFS 閘道。NFS 閘道會查詢以從 UID 中找出使用者名稱,然後將使用者名稱與 HDFS 要求一起傳遞至 HDFS。例如,如果 NFS 客戶端目前的使用者為「admin」,則當使用者存取已掛載的目錄時,NFS 閘道會以使用者「admin」存取 HDFS。若要以使用者「hdfs」存取 HDFS,需要在存取已掛載的目錄時將目前的使用者切換為「hdfs」。

系統管理員必須確保 NFS 客戶端主機上的使用者與 NFS 閘道主機上的使用者名稱和 UID 相同。如果在 HDFS 節點和 NFS 客戶端節點上使用相同的使用者管理系統(例如 LDAP/NIS)來建立和部署使用者,這通常不會造成問題。如果在不同的主機上手動建立使用者帳戶,則可能需要修改 NFS 客戶端或 NFS 閘道主機上的 UID(例如執行「usermod -u 123 myusername」),才能讓兩邊的 UID 相同。可以在 RPC 規格 中找到 RPC AUTH_UNIX 的更多技術詳細資料。

系統管理員可以選擇設定自訂靜態對應檔案,以防從 UID/GID 完全不同的系統存取 HDFS NFS 閘道。預設情況下,這個檔案位於「/etc/nfs.map」,但可以透過將「static.id.mapping.file」屬性設定為靜態對應檔案路徑,來設定自訂位置。靜態對應檔案的格式類似於 exports(5) 手冊頁中所述,但大致上是

# Mapping for clients accessing the NFS gateway
uid 10 100 # Map the remote UID 10 the local UID 100
gid 11 101 # Map the remote GID 11 to the local GID 101