RBF 需要優化的配置
NameNode 側
- NN 啟用 RPC context 特性,在審計日志中打印真實的客戶端 IP.
默認情況下,NN 的審計日志記錄的所有請求的源 IP 都是 Router,如果要看到真正的 client IP,需要在 NameNode 側,hdfs-site.xml 中,使能 callerContext,之后在 NN 審計日志中,將在 CallerContext 字段記錄此次 RPC 請求的真實 IP:
在 NameNode 側,hdfs-site.xml 中,做如下配置:
<property>
<name>hadoop.caller.context.enabled</name>
<value>true</value>
</property>
審計日志如下
客戶端側
- 客戶端隨機選擇 router,而不是總選擇第一個.
默認情況下,在客戶端配置了多個 router 時,客戶端總是優先使用第一個 router,如果所有客戶端都是這種行為的話,很可能會造成第一個 router 累死,而其它 router 餓死,為了防止這種情況出現,需要讓客戶端隨機選取 router:
在 Client 側,hdfs-site.xml 中,做如下配置:
<property>
<name>dfs.client.failover.random.order</name>
<value>true</value>
</property>
Router 側
- 配置 ganglia 監控
Router 的監控信息,也需要輸出到 ganglia 上:
在 Router 側,hadoop-metrics2.properties 中,增加下面配置:
*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31
*.sink.ganglia.period=60
router.sink.ganglia.servers=GANGLIA機器IP:8649
- 增大 Router RPC server 的 reader count 和 handler count.
默認情況下,router 的 handler count 為10,reader count 為1,這些值都太小,需要加大.
在 Router 側,hdfs-rbf-site.xml 中,將 RPC handler count 配置為 4096:
<property>
<name>dfs.federation.router.handler.count</name>
<value>4096</value>
</property>
將 RPC reader count 配置為 16:
<property>
<name>dfs.federation.router.reader.count</name>
<value>16</value>
</property>
- 開啟各個 Router 之間的 mount table 即時更新功能.
默認情況下,如果一個 router 修改了 mount table,那么其他 router 不能立即更新,需要等待一段時間才能達到同步狀態。開啟即時更新功能后, 修改了 mount table 的 router 會主動通知其他 router 更新 cache,從而使其他 router 立即達到同步狀態.
在 Router 側,hdfs-rbf-site.xml 中,做如下配置:
<property>
<name>dfs.federation.router.mount-table.cache.update</name>
<value>true</value>
</property>
- 開啟 Router 的超載拒絕服務特性.
默認情況下,如果一個 router 接收到的 RPC 請求太多,則會嚴重排隊。開啟該特性后,一個 router 在滿載之后,會立即拒絕新的 RPC 請求,之后客戶端會繼續嘗試其他的 router:
在 Router 側,hdfs-rbf-site.xml 中,做如下配置:
<property>
<name>dfs.federation.router.client.reject.overload</name>
<value>true</value>
</property>
- 禁用 Router 的 “部分 list/count” 特性.
如果 router 啟用了 multi destination 掛載功能,且一個掛載目錄的某些 sub cluster 不可用時,可能出現不能完整 list/count 一個目錄的情況,此時只能 list/count 到一部分目錄內容。這種結果不可接受,需要禁用該特性,此時應直接返回失敗。
在 Router 側,hdfs-rbf-site.xml 中,做如下配置:
<property>
<name>dfs.federation.router.client.allow-partial-listing</name>
<value>false</value>
</property>
- 禁止 Router 緩存客戶端 RPC 請求的路徑解析結果.
默認情況下,Router 會緩存客戶端 RPC 請求的路徑解析結果,最多緩存1W條,但如果客戶端的操作路徑非常多變(典型情況:集群業務量超大,Router 收到的 RPC 請求路徑頻繁變化),則這種緩存意義不大,且額外的緩存操作還會增加 Router 時耗,此時應該禁用緩存。
在 Router 側,hdfs-rbf-site.xml 中,做如下配置:
<property>
<name>dfs.federation.router.mount-table.cache.enable</name>
<value>false</value>
</property>
- 禁止 Router 自動監聽本地 NameNode.
默認情況下,Router 僅自動監聽本地 NameNode,實際使用中,我們會手動配置 Router 需要監聽的所有 NN.
在 Router 側,hdfs-rbf-site.xml 中,做如下配置:
<property>
<name>dfs.federation.router.monitor.localnamenode.enable</name>
<value>false</value>
</property>
幾個需要確認的問題
- Router 性能損耗
在 Client 和 NameNode 直接插入 Router 之后,對業務的 RPC 時耗影響大概有多大? - Router MountTable 性能問題
在 Router 的 MountTable Entry 過多時(例如 10W 條),是否會對 Router 性能產生影響? - token 性能問題
各個 Router 的 token 都存在一個 zk 里面,并且使用 zk 的 CallBack 更新機制,以現網目前的 token 量,zk 是否撐得住?