基於 HDFS 路由器的聯盟

簡介

NameNodes 有可擴充性限制,因為元資料開銷包含 inode(檔案和目錄)和檔案區塊、Datanode 心跳次數以及 HDFS RPC 用戶端要求的數量。常見的解決方案是將檔案系統分割成較小的子叢集 HDFS Federation,並提供聯合檢視 ViewFs。問題是如何維護子叢集的分割(例如,名稱空間分割),這會強制使用者連線到多個子叢集並管理資料夾/檔案的配置。

架構

此分割聯合的自然延伸是加入一個負責聯合名稱空間的軟體層。此額外層讓使用者可以透明地存取任何子叢集,讓子叢集獨立管理自己的區塊池,而且稍後會支援在子叢集之間重新平衡資料(請參閱 HDFS-13123 中的更多資訊)。RBF 中的子叢集不需要是獨立的 HDFS 叢集,也可以是正常的聯合叢集(有多個區塊池)或聯合和獨立叢集的混合叢集。為了達成這些目標,聯合層會將區塊存取導向到適當的子叢集,維護名稱空間的狀態,並提供重新平衡資料的機制。此層必須具有可擴充性、高可用性和容錯能力。

此聯合層包含多個元件。路由器元件具有與 NameNode 相同的介面,並根據狀態儲存的真實資訊將用戶端要求轉發到正確的子叢集。狀態儲存結合遠端掛載表(類似 ViewFs,但在用戶端之間共用)以及關於子叢集的利用率(負載/容量)資訊。此方法具有與 YARN 聯合 相同的架構。

Router-based Federation Sequence Diagram | width=800

範例流程

最簡單的組態會在每個 NameNode 機器上部署一個路由器。路由器會監控本機 NameNode 及其狀態,並對狀態儲存庫進行心跳偵測。路由器會監控本機 NameNode,並對狀態儲存庫進行狀態心跳偵測。當一般 DFS 用戶端連線到任何路由器以存取聯合檔案系統中的檔案時,路由器會檢查狀態儲存庫中的掛載資料表(即本機快取),找出包含該檔案的子叢集。接著,它會檢查狀態儲存庫中的成員資格資料表(即本機快取),找出負責該子叢集的 NameNode。在找出正確的 NameNode 後,路由器會代理該要求。用戶端會直接存取資料節點。

路由器

系統中可以有多個具有軟狀態的路由器。每個路由器有兩個角色

  • 聯合介面:對用戶端公開單一的全球 NameNode 介面,並將要求轉發到正確子叢集中的 active NameNode
  • NameNode 心跳偵測:維護狀態儲存庫中關於 NameNode 的資訊

聯合介面

路由器會接收用戶端要求,檢查狀態儲存庫以找出正確的子叢集,並將要求轉發到該子叢集的 active NameNode。然後,NameNode 的回覆會以相反的方向傳送。路由器是無狀態的,而且可以位在負載平衡器之後。對於健康檢查,您可以使用 /isActive 端點作為健康探測(例如 http://ROUTER_HOSTNAME:ROUTER_PORT/isActive)。為了效能,路由器也會快取遠端掛載資料表項目和子叢集的狀態。為了確保變更已傳播到所有路由器,每個路由器會對狀態儲存庫進行狀態心跳偵測。

路由器和狀態儲存庫之間的通訊會被快取(並設定計時過期以保持最新)。這會改善系統效能。

路由器心跳偵測

路由器會定期對狀態儲存庫進行狀態心跳偵測。

NameNode 心跳偵測

對於此角色,路由器會定期檢查 NameNode 的狀態(通常在同一伺服器上),並將其高可用性 (HA) 狀態和負載/空間狀態報告給狀態儲存庫。請注意,這是一個選用角色,因為路由器可以獨立於任何子叢集。對於 NameNode HA 的效能,路由器會使用狀態儲存庫中的高可用性狀態資訊,將要求轉發到最有可能為 active 的 NameNode。請注意,此服務可以內嵌到 NameNode 本身中,以簡化操作。

可用性和容錯

路由器在多個層級下運作時會發生故障。

  • 聯合介面 HA:路由器是無狀態的,而 NameNodes 的元資料操作是原子的。如果路由器無法使用,任何路由器都可以接手。客戶端會將其 DFS HA 客戶端(例如 ConfiguredFailoverProvider 或 RequestHedgingProxyProvider)設定為聯合中所有路由器作為端點。

  • 無法使用的狀態儲存:如果路由器無法連線到狀態儲存,它將進入安全模式狀態,禁止它提供服務要求。客戶端會將安全模式中的路由器視為備用 NameNode,並嘗試其他路由器。有一種手動方式可以管理路由器的安全模式。

可以使用下列指令管理安全模式狀態

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -safemode enter | leave | get
  • NameNode 心跳 HA:為了高可用性和靈活性,多個路由器可以監控同一個 NameNode,並將資訊傳送給狀態儲存。這會增加客戶端對過時資訊的復原能力,如果路由器發生故障。狀態儲存中衝突的 NameNode 資訊會由每個路由器透過法定人數解決。

  • 無法使用的 NameNodes:如果路由器無法連線到活動 NameNode,它會嘗試子叢集中的其他 NameNodes。它會先嘗試那些報告為備用的,然後嘗試無法使用的。如果路由器無法連線到任何 NameNode,它會擲回例外狀況。

  • 過期的 NameNodes:如果 NameNode 心跳未在狀態儲存中記錄多個心跳間隔,監控路由器會記錄 NameNode 已過期,且沒有路由器會嘗試存取它。如果 NameNode 後續記錄了更新的心跳,監控路由器會從過期狀態中還原 NameNode。

介面

為了與使用者和管理員互動,路由器公開多個介面。

  • RPC:路由器 RPC 實作了客戶端用來與 HDFS 互動的最常見介面。目前的實作已使用以純粹 MapReduce、Spark 和 Hive(在 Tez、Spark 和 MapReduce 上)編寫的分析工作負載進行測試。快照、加密和分層儲存等進階功能留待未來版本。所有未實作的功能都會擲回例外狀況。

  • 管理員:管理員可以透過 RPC 從叢集查詢資訊,並新增/移除掛載表中的項目。此介面也透過命令列公開,以取得和修改聯合資訊。

  • Web UI:路由器會公開一個 Web UI,用以視覺化聯合狀態,模擬目前的 NameNode UI。它會顯示掛載表、每個子叢集的成員資訊,以及路由器的狀態。

  • WebHDFS:路由器除了 RPC 介面外,也提供 HDFS REST 介面 (WebHDFS)。

  • JMX:它透過 JMX 公開指標,模擬 NameNode。Web UI 會使用此指標來取得叢集狀態。

有些操作在基於路由器的聯合中不可用。路由器會針對這些操作擲回例外。使用者可能會遇到的範例如下。

  • 在兩個不同的名稱服務中重新命名檔案/資料夾。
  • 在兩個不同的名稱服務中複製檔案/資料夾。
  • 寫入正在重新平衡的檔案/資料夾。

配額管理

聯合支援並控制掛載表層級的全球配額。基於效能考量,路由器會快取配額使用量並定期更新它。這些配額使用量值會在 RouterRPCSever 中呼叫的每個 WRITE RPC 呼叫期間,用於配額驗證。請參閱 HDFS 配額指南,以取得配額詳細資料。

注意:當啟用全球配額時,不建議直接設定或清除子叢集的配額,因為路由器管理員伺服器會以全球配額覆寫子叢集的配額。

狀態儲存

(邏輯上集中化,但實際上分散的)狀態儲存會維護

  • 子叢集的狀態,包括區塊存取負載、可用磁碟空間、HA 狀態等。
  • 資料夾/檔案與子叢集之間的對應,也就是遠端掛載表。

狀態儲存的後端是可插入的。我們利用後端實作的容錯能力。狀態儲存中儲存的主要資訊及其實作

  • 成員:成員資訊編碼聯合中 NameNode 的狀態。這包括子叢集的資訊,例如儲存容量和節點數量。路由器會定期對一個或多個 NameNode 進行此資訊的心跳偵測。由於多個路由器可以監控單一 NameNode,因此會儲存每個路由器的心跳偵測。當從狀態儲存查詢此資訊時,路由器會套用資料的過半數。路由器會捨棄超過特定閾值的項目(例如,十個路由器心跳偵測週期)。

  • 掛載表:此表格會主控資料夾與子叢集之間的對應。它類似於 ViewFs 中的掛載表,其中會指定聯合資料夾、目標子叢集和該資料夾中的路徑。

安全性

路由器支援與 HDFS 中 目前的安全性模型 類似的安全性。此功能可同時用於 RPC 和基於 Web 的呼叫。它有能力代理到底層的 HDFS 安全叢集。

與 Namenode 類似,支援 Kerberos 和基於權杖的驗證,供連線至路由器的用戶端使用。路由器在內部依賴於 core-site.xmlhdfs-site.xml 中現有的安全性相關設定,以支援此功能。除此之外,路由器需要設定自己的 keytab 和認證主體。

對於基於權杖的驗證,路由器會向上游用戶端發出委派權杖,而無需與下游名稱節點進行通訊。路由器會使用自己的憑證,代表上游實際使用者安全地代理至下游名稱節點。路由器認證主體必須在所有安全的下游名稱節點中設定為超級使用者。請參閱 此處,以設定名稱節點的代理使用者。此外,擁有路由器守護程式之使用者應設定與名稱節點處理程序本身相同的識別。請參閱 此處,以取得詳細資料。路由器依賴狀態儲存,以在所有路由器之間分配權杖。除了使用者提供的預設實作外,使用者還可以插入自己的狀態儲存實作,以進行權杖管理。預設實作依賴於 Zookeeper 進行權杖管理。由於大型路由器/Zookeeper 叢集可能會持有數百萬個權杖,因此路由器守護程式應適當地設定 Zookeeper 用戶端依賴的 jute.maxbuffer 系統屬性。

請參閱 Apache JIRA 錯誤單 HDFS-13532,以取得有關此功能的更多資訊。

部署

預設情況下,路由器已準備好接收請求並監控本機中的 NameNode。它需要透過設定 dfs.federation.router.store.driver.class 來知道狀態儲存端點。其餘選項記載於 hdfs-rbf-default.xml 中。

一旦路由器設定完畢,即可啟動

[hdfs]$ $HADOOP_PREFIX/bin/hdfs --daemon start dfsrouter

並停止

[hdfs]$ $HADOOP_PREFIX/bin/hdfs --daemon stop dfsrouter

掛載表格管理

掛載表格項目與 ViewFs 中的項目大致相同。簡化管理的良好作法是,將聯合名稱空間命名為與目的地名稱空間相同的名稱。例如,如果我們要在聯合名稱空間中掛載 /data/app1,建議在目的地名稱空間中使用相同的名稱。

聯盟管理工具支援管理掛載表。例如,建立三個掛載點並列出它們

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /tmp ns1 /tmp
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /data/app1 ns2 /data/app1
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /data/app2 ns3 /data/app2
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -ls

它也支援不允許寫入的掛載點

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /readonly ns1 / -readonly

如果未設定掛載點,路由器會將其對應到預設名稱空間 dfs.federation.router.default.nameserviceId

掛載表具有類 UNIX 的「權限」,用於限制哪些使用者和群組可以存取掛載點。寫入權限允許使用者新增、更新或移除掛載點。讀取權限允許使用者列出掛載點。執行權限未使用。

可以透過下列指令設定掛載表權限

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /tmp ns1 /tmp -owner root -group supergroup -mode 0755

選項模式是掛載表的 UNIX 風格權限。權限以八進位數字指定,例如 0755。預設值為 0755。

配額

基於路由器的聯盟支援掛載表層級的全球配額。掛載表條目可能會分散在多個子叢集中,而全球配額將在這些子叢集中計算。

聯盟管理工具支援設定指定掛載表條目的配額

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -setQuota /path -nsQuota 100 -ssQuota 1024

上述指令表示我們允許路徑最多有 100 個檔案/目錄,並使用最多 1024 位元組的儲存空間。ssQuota 參數支援多個大小單位字尾(例如 1k 是 1KB,5m 是 5MB)。如果未指定字尾,則假設為位元組。

設定指定掛載表條目的儲存類型配額

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -setStorageTypeQuota <path> -storageType <storage type>

移除指定掛載表條目的配額

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -clrQuota <path>

移除指定掛載表條目的儲存類型配額

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -clrStorageTypeQuota <path>

Ls 指令會顯示每個掛載表條目的下列資訊

Source                    Destinations              Owner                     Group                     Mode                      Quota/Usage
/path                     ns0->/path                root                      supergroup                rwxr-xr-x                 [NsQuota: 50/0, SsQuota: 100 B/0 B]

掛載表快取會定期更新,但也可以透過執行更新指令來更新。

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -refresh

上述指令會更新連線路由器的快取。當掛載表更新服務已啟用時,此指令是多餘的,因為該服務會持續保持快取更新。

多個子叢集

掛載點也支援對應多個子叢集。例如,建立一個將檔案儲存在子叢集 ns1ns2 中的掛載點。

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /data ns1,ns2 /data -order SPACE

列出 /data 時,它會顯示兩個子叢集中的所有資料夾和檔案。它使用順序參數來決定要在何處建立新的檔案/資料夾,目前支援下列方法

  • HASH:遵循第一層的一致性雜湊。更深層的層級會在其中一個父層級中。
  • LOCAL:嘗試在本地子叢集中寫入資料。
  • RANDOM:隨機子叢集。這通常有助於平衡負載。資料夾會建立在所有子叢集中。
  • HASH_ALL:在所有層級遵循一致性雜湊。此方法會嘗試在子叢集中平均平衡讀取和寫入。資料夾會建立在所有子叢集中。
  • 空間:嘗試將資料寫入具有最多可用空間的子叢集。資料夾會建立在所有子叢集中。

對於基於雜湊的方法,差異在於 HASH 會讓資料夾中的所有檔案/資料夾屬於同一個子叢集,而 HASH_ALL 會將所有檔案散佈在掛載點下。例如,假設我們有一個 HASH 掛載點為 /data/hash,則 /data/hash/folder0 下的檔案和資料夾都會在同一個子叢集中。另一方面,/data/hash_all 的 HASH_ALL 掛載點會將 /data/hash_all/folder0 下的檔案散佈在該掛載點的所有子叢集中(子資料夾會建立到所有子叢集中)。

RANDOM 可用於從/寫入資料到不同的子叢集。這種方法的常見用途是在多個子叢集中擁有相同的資料,並在子叢集中平衡讀取。例如,如果數千個容器需要讀取相同的資料(例如函式庫),則可以使用 RANDOM 從任何子叢集中讀取資料。

判斷哪個子叢集包含檔案

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -getDestination /user/user1/file.txt

請注意,路由器不保證子叢集中資料的一致性。預設情況下,如果一個子叢集不可用,則寫入可能會失敗,如果它們鎖定該子叢集。若要允許在另一個子叢集中寫入,可以讓掛載點具有容錯能力

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /data ns1,ns2 /data -order HASH_ALL -faulttolerant

請注意,這可能會導致檔案寫入多個子叢集或資料夾在其中一個子叢集中遺失。需要了解這些不一致性的可能性,並將此 faulttolerant 方法鎖定到有復原力的路徑。這方面的範例是 /app-logs 資料夾,它大多會寫入子資料夾一次。

停用名稱服務

若要防止存取名稱服務(子叢集),可以從聯盟中停用它。例如,可以停用 ns1,列出它,然後再次啟用它

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -nameservice disable ns1
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -getDisabledNameservices
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -nameservice enable ns1

這在停用子叢集或當一個子叢集行為不當時(例如,效能不佳或不可用)時很有用。

路由器伺服器一般性重新整理

若要觸發 <host:ipc_port> 上 <key> 指定的資源的執行時間重新整理。例如,若要啟用白名單檢查,我們只需要傳送重新整理指令,而不是重新啟動路由器伺服器。

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -refreshRouterArgs <host:ipc_port> <key> [arg1..argn]

路由器狀態傾印

若要診斷路由器的目前狀態,可以使用 dumpState 指令。它會產生狀態儲存中記錄的文字傾印。由於它使用組態來尋找和讀取狀態儲存,因此最簡單的方法通常是使用路由器執行的機器。此指令會在本地執行,因此路由器不必啟動才能使用此指令。

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -dumpState

用戶端設定

要讓用戶端使用聯合命名空間,他們需要建立一個新的命名空間指向路由器。例如,一個有 4 個命名空間 ns0、ns1、ns2、ns3 的叢集,可以在 hdfs-site.xml 中新增一個命名為 ns-fed 的命名空間,指向兩個路由器

<configuration>
  <property>
    <name>dfs.nameservices</name>
    <value>ns0,ns1,ns2,ns3,ns-fed</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.ns-fed</name>
    <value>r1,r2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns-fed.r1</name>
    <value>router1:rpc-port</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns-fed.r2</name>
    <value>router2:rpc-port</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.ns-fed</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.client.failover.random.order</name>
    <value>true</value>
  </property>
</configuration>

dfs.client.failover.random.order 設為 true 可以讓負載平均分配到各個路由器。

有了這個設定,使用者可以將 ns-fed 視為一個一般命名空間來使用

$ $HADOOP_HOME/bin/hdfs dfs -ls hdfs://ns-fed/
/tmp
/data

這個聯合命名空間也可以在 core-site.xml 中使用 fs.defaultFS 設為預設命名空間。

NameNode 設定

為了讓系統支援資料區域性,您必須設定 NameNode,讓它們信任路由器提供使用者的用戶端 IP 位址。dfs.namenode.ip-proxy-users 定義一個以逗號分隔的使用者清單,允許他們透過呼叫者內容提供用戶端 IP 位址。

<configuration>
  <property>
    <name>dfs.namenode.ip-proxy-users</name>
    <value>hdfs</value>
  </property>
</configuration>

路由器設定

可以在 hdfs-rbf-site.xml 中新增路由器聯合設定。主要選項記載於 hdfs-rbf-default.xml 中。設定值說明如下。

RPC 伺服器

接收用戶端連線的 RPC 伺服器。

屬性 預設值 說明
dfs.federation.router.default.nameserviceId 要監控的預設次叢集的名稱服務識別碼。
dfs.federation.router.rpc.enable true 如果為 true,將啟用路由器中處理用戶端要求的 RPC 服務。
dfs.federation.router.rpc-address 0.0.0.0:8888 處理所有用戶端要求的 RPC 位址。
dfs.federation.router.rpc-bind-host 0.0.0.0 RPC 伺服器實際會繫結到的位址。
dfs.federation.router.handler.count 10 路由器處理用戶端 RPC 要求的伺服器執行緒數目。
dfs.federation.router.handler.queue.size 100 處理用戶端 RPC 要求的處理常式數目佇列大小。
dfs.federation.router.reader.count 1 路由器處理用戶端 RPC 要求的讀取器數目。
dfs.federation.router.reader.queue.size 100 路由器處理用戶端 RPC 要求的讀取器數目佇列大小。

連線到 NameNode

路由器將客戶端要求轉送至 NameNode。它使用連線池來減少建立連線的延遲。

屬性 預設值 說明
dfs.federation.router.connection.pool-size 1 路由器至名稱節點的連線池大小。
dfs.federation.router.connection.clean.ms 10000 以毫秒為單位的時間間隔,用於檢查連線池是否應移除未使用的連線。
dfs.federation.router.connection.pool.clean.ms 60000 以毫秒為單位的時間間隔,用於檢查連線管理員是否應移除未使用的連線池。

管理員伺服器

管理裝載表之管理伺服器。

屬性 預設值 說明
dfs.federation.router.admin.enable true 如果為 true,則啟用 RPC 管理服務以處理路由器中的客戶端要求。
dfs.federation.router.admin-address 0.0.0.0:8111 處理管理要求的 RPC 位址。
dfs.federation.router.admin-bind-host 0.0.0.0 RPC 管理伺服器將繫結到的實際位址。
dfs.federation.router.admin.handler.count 1 路由器用於處理來自管理員的 RPC 要求的伺服器執行緒數量。

HTTP 伺服器

HTTP 伺服器提供 Web UI 和 HDFS REST 介面 (WebHDFS) 給客戶端。預設 URL 為“http://router_host:50071”。

屬性 預設值 說明
dfs.federation.router.http.enable true 如果為 true,則啟用 HTTP 服務以處理路由器中的客戶端要求。
dfs.federation.router.http-address 0.0.0.0:50071 處理對路由器之 Web 要求的 HTTP 位址。
dfs.federation.router.http-bind-host 0.0.0.0 HTTP 伺服器將繫結到的實際位址。
dfs.federation.router.https-address 0.0.0.0:50072 處理對路由器之 Web 要求的 HTTPS 位址。
dfs.federation.router.https-bind-host 0.0.0.0 HTTPS 伺服器將繫結到的實際位址。

狀態儲存

與狀態儲存的連線以及路由器中的內部快取。

屬性 預設值 說明
dfs.federation.router.store.enable true 如果為 true,則路由器會連線至狀態儲存。
dfs.federation.router.store.serializer org.apache.hadoop.hdfs.server.federation.store.driver.impl.StateStoreSerializerPBImpl 用於序列化狀態儲存記錄的類別。
dfs.federation.router.store.driver.class org.apache.hadoop.hdfs.server.federation.store.driver.impl.StateStoreZooKeeperImpl 用於實作狀態儲存的類別。
dfs.federation.router.store.connection.test 60000 以毫秒為單位,檢查與狀態儲存的連線頻率。
dfs.federation.router.cache.ttl 60000 以毫秒為單位,更新狀態儲存快取的頻率。
dfs.federation.router.store.membership.expiration 300000 成員記錄的到期時間(毫秒)。
dfs.federation.router.mount-table.cache.update false 如果為 true,則當所有路由器的掛載表條目新增、修改或移除時,會更新掛載表快取。
dfs.federation.router.mount-table.cache.update.timeout 1m 等待所有路由器完成掛載表快取更新的最大時間。
dfs.federation.router.mount-table.cache.update.client.max.time 5m RouterClient 連線可快取的最大時間。

路由

將用戶端要求轉發到正確的子叢集。

屬性 預設值 說明
dfs.federation.router.file.resolver.client.class org.apache.hadoop.hdfs.server.federation.resolver.MountTableResolver 將檔案解析到子叢集的類別。若要為掛載點啟用多個子叢集,請設定為 org.apache.hadoop.hdfs.server.federation.resolver.MultipleDestinationMountTableResolver。
dfs.federation.router.namenode.resolver.client.class org.apache.hadoop.hdfs.server.federation.resolver.MembershipNamenodeResolver 解析子叢集名稱節點的類別。

名稱節點監控

監控子叢集中的名稱節點,以轉發用戶端要求。

屬性 預設值 說明
dfs.federation.router.heartbeat.enable true 如果為 true,路由器會定期將其狀態傳送至狀態儲存。
dfs.federation.router.namenode.heartbeat.enable 如果為 true,路由器會取得名稱節點傳送至狀態儲存的傳送訊號。如果未明確指定,則採用與 dfs.federation.router.heartbeat.enable 相同的值。
dfs.federation.router.heartbeat.interval 5000 以毫秒為單位,路由器傳送傳送訊號至狀態儲存的頻率。
dfs.federation.router.monitor.namenode 要監控和傳送傳送訊號的名稱節點識別碼。
dfs.federation.router.monitor.localnamenode.enable true 如果為 true,路由器應監控本機的名稱節點。

注意:如果啟用 dfs.federation.router.monitor.localnamenode.enable,建議設定組態 dfs.nameservice.id。這將允許路由器直接尋找本機節點。否則,它會透過將名稱節點 RPC 位址與本機節點位址配對,來尋找名稱服務 ID。如果配對到多個位址,路由器將無法啟動。此外,如果本機節點處於 HA 模式,建議設定 dfs.ha.namenode.id

配額

聯盟中支援的全球配額。

屬性 預設值 說明
dfs.federation.router.quota.enable false 如果為 true,則在 Router 中啟用配額系統。在這種情況下,不建議直接設定或清除子叢集的配額,因為 Router 管理員伺服器會以全域配額覆寫子叢集的配額。
dfs.federation.router.quota-cache.update.interval 60 秒 Router 更新配額快取的頻率。此設定支援多個時間單位字尾。如果未指定字尾,則假設為毫秒。

安全性

Kerberos 和委派權杖在聯合中受支援。

屬性 預設值 說明
dfs.federation.router.keytab.file Router 用於以其服務主體身分登入的金鑰表檔案。主體名稱設定為「dfs.federation.router.kerberos.principal」。
dfs.federation.router.kerberos.principal Router 服務主體。這通常設定為 router/_HOST@REALM.TLD。每個 Router 都會在啟動時用自己的完全限定主機名稱取代 _HOST。_HOST 佔位符允許在 HA 設定中對所有 Router 使用相同的設定。
dfs.federation.router.kerberos.principal.hostname 包含此設定檔的 Router 的主機名稱。每個機器都會不同。預設為目前的主機名稱。
dfs.federation.router.kerberos.internal.spnego.principal ${dfs.web.authentication.kerberos.principal} 當啟用 Kerberos 安全性時,Router 用於網頁 UI SPNEGO 驗證的伺服器主體。這通常設定為 HTTP/_HOST@REALM.TLD。依慣例,SPNEGO 伺服器主體以字首 HTTP/ 開頭。如果值為「*」,網頁伺服器會嘗試使用金鑰表檔案「dfs.web.authentication.kerberos.keytab」中指定的每個主體登入。
dfs.federation.router.secret.manager.class org.apache.hadoop.hdfs.server.federation.router.security.token.ZKDelegationTokenSecretManagerImpl 實作狀態儲存至委派權杖的類別。預設實作使用 Zookeeper 作為後端來儲存委派權杖。

指標

Router 和狀態儲存統計資料顯示在 metrics/JMX 中。這些資訊對於監控非常有用。更多指標資訊請參閱 RBF 指標Router RPC 指標狀態儲存指標