1. 程式人生 > 其它 >騰訊雲 EMR 基於 YARN 針對雲原生容器化的優化與實踐

騰訊雲 EMR 基於 YARN 針對雲原生容器化的優化與實踐

導語 |傳統 HADOOP 生態系統使用 YARN 管理/排程計算資源,該系統⼀般具有明顯的資源使⽤週期。實時計算叢集資源消耗主要在⽩天,而資料報表型業務則安排在離線計算叢集中。離線上業務分開部署的首要問題就是資源使用率低,消耗成本⾼。隨著業務的增⻓和突發的報表計算需求,為了解決為離線叢集預留資源,騰訊雲 EMR 團隊和容器團隊聯合推出 Hadoop Yarn on Kubernetes Pod,以提⾼容器資源使用率,降低資源成本,將閒時容器叢集 CPU 使⽤率提升數倍之多。本文主要介紹 HADOOP 資源排程器 YARN 在容器環境中的優化與實踐。

一、Hadoop Yarn on Kubernetes Pod 混合部署模式

Hadoop Yarn on Kubernetes Pod 方案提供彈性擴縮容和離線上混合部署兩項功能。彈性擴縮容主要聚焦於如何利⽤雲原生資源,快速擴容資源以補充算力。離線上混合部署模式的目的是為了充分使用線上叢集的空閒資源,儘可能減少為離線叢集預留空閒資源的頻次。

EMR 彈性擴縮容模組(yarn-autoscaler)提供按負載和按時間彈性伸縮兩種擴縮容方式。對於按負載伸縮,使用者可以對不同指標設定閾值來觸發擴縮容,比如設定 Yarn 佇列中 availablevcore、 pending vcore、available mem、pending mem。亦可以使用時間擴縮規則,按天、按周、按月等規則指定觸發。

當彈性規則被觸發後,離線上部署模組獲取當前線上 TKE 叢集中可以提供的閒置算力的規格及數量,呼叫 Kubernetes api 建立對應數量的資源,ex-scheduler 擴充套件排程器確保 Pod 被建立在剩餘資源更多的節點上,該 POD 負責啟動 YARN 的服務。

通過該方案,Yarn 的 NodeManager 服務可以快速部署到 POD 節點中。但也 Yarn 原生排程沒有考慮異構資源,由此引發了兩個問題:

1. AM 的 POD 被驅逐,導致 APP 失敗

在 node 節點的資源緊缺的條件下,kubelet 為了保證 node 節點的穩定性,會觸發主動驅逐 pod 的機制。如果該節點存在 AM 服務,則整個 Application 就要被視為失敗,ResourceManager 此時會重新分配 AM。對於計算量很大的任務,Application 重跑的代價不可承受。

2. Yarn 原生非獨佔分割槽資源共享侷限性

Yarn 的標籤分割槽特性⽀持獨佔分割槽(Exclusive),非獨佔分割槽(Non-exclusive)。

  • 獨佔分割槽(Exclusive):例如指定獨佔分割槽 x,Yarn 的 container 只會分配到該 x 分割槽。

  • 非獨佔分割槽(Non-exclusive):例如非獨佔分割槽 x,x 分割槽的資源可以共享給 default 分割槽。只有當指定分割槽 default 時,default 上運⾏的 Application 可以使⽤分割槽 x 的資源。

但是在實際使⽤場景中,⽤戶要給各個業務部門分配各自的獨佔分割槽資源,同時會劃分出供各部門使用的 default 分割槽。default 分割槽資源會比較充足,業務部門希望能夠使用自己的獨佔分割槽和同時充分利用 default 分割槽資源,獨佔分割槽資源和 default 分割槽都不夠用的時候,才會觸發彈性擴容,往屬於自己的獨佔分割槽中擴容資源。

二、對 Yarn 改造帶來的挑戰

對上述 feature 的開發,除了需求技術本⾝的難度。還需要考慮到儘可能降低使用者存量叢集穩定性的影響,減少使用者業務側改造成本。
  • 叢集穩定性:Hadoop Yarn 作為大資料系統中的基礎排程元件,如果改動過多,引發的故障機率就會增大。同時引入的 feature,必然需要升級存量叢集的 Haoop Yarn。升級操作要做到對存量業務叢集無感知,不能影響到當天的業務。

  • 業務側使用成本:引入的新 feature 也必須符合原⽣yarn 的使用習慣,方便業務側使用者理解,同時降低業務側對程式碼的改造。

1. AM 自主選擇儲存介質

目前 Yarn 的社群沒有考慮雲上異構資源混合部署的特點。線上 TKE 叢集中,當資源緊張時會對容器進行驅逐。為了避免 Appliction 重新計算,浪費資源的現象,必須提供 AM 可以指定能否分配到 POD 型別資源。

自主選擇儲存介質中,使用配置化標識,由 NodeManager 通過 RPC 上報能否將資源提供給 AM 使用,ResourceManager 通過上報資訊決定將 Application 的 AM 分配到穩定資源介質中。由 NodeManager 通過配置化上報資訊的好處是顯而易見的:

  • 去集中化:減少 ResourceManager 處理邏輯。否則,擴容資源時,還需將資源資訊通過 RPC/配置流入到 ResourceManager 中。如無必要,勿增實體,對 ResourceManager 的改造應該輕量化。

  • 叢集穩定性:存量業務叢集對 Yarn 升級後,需要重啟 NodeManager, 只需要重啟 ResourceManager。Yare 的高可用特性可保證升級過程對業務無影響。無需重啟 NodeManager 的原因是,NM 預設將本機資源視為可分配。

  • 簡單易用:使用者可以通過配置⾃由決定任務資源擁有分配 AM 的權利,不單單侷限 POD 容器資源。

2. 多標籤動態分配資源

Yarn 的原生標籤設計中,提交任務時的標籤表示式中只能含有單個標籤。如果為了提⾼利用率,同時使用多個分割槽資源,就必須將非 default 分割槽設定為 Non-exclusive 特性。標籤表示式必須解決如下三個問題:

  • 資源隔離:分割槽 A 設定 Non-exclusive 後,資源被其他分割槽上的 APP 佔用後,無法及時交換給分割槽 A 的 App。

  • 自由共享資源:只有 default 分割槽才有資格申請 Non-exclusive 分割槽資源。

  • 動態選擇分割槽資源:多分割槽資源共享時,無法根據分割槽剩餘資源大小選擇可用區,影響任務執行效率。

騰訊雲 EMR 團隊通過支援擴充套件表示式語法,增加對邏輯運算子表示式的支援,使 App 可以申請多個分割槽資源。同時開發資源統計模組動態統計分割槽可用資源,為 App 分配最合適的分割槽。

三、實操演練

測試環境:指定 172.17.48.28/172.17.48.17 的 NodeManager 為 default 分割槽,172.17.48.29/172.17.48.26 的 NodeManager 為 x 分割槽。

佇列設定:

<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>yarn.scheduler.capacity.root.queues</name><value>a,b</value></property>
<property><name>yarn.scheduler.capacity.root.accessible-node-labels.x.capacity</nam e><value>100</value></property>
<property><name>yarn.scheduler.capacity.root.accessible-node-labels.y.capacity</nam e><value>100</value></property>
<!-- configuration of queue-a --><property><name>yarn.scheduler.capacity.root.a.accessible-node-labels</name><value>x</value></property>
<property><name>yarn.scheduler.capacity.root.a.capacity</name><value>50</value></property>
<property><name>yarn.scheduler.capacity.root.a.accessible-node-labels.x.capacity</n ame><value>100</value></property>
<!-- configuration of queue-b --><property><name>yarn.scheduler.capacity.root.b.accessible-node-labels</name><value>y</value></property>
<property><name>yarn.scheduler.capacity.root.b.capacity</name><value>50</value></property>
<property><name>yarn.scheduler.capacity.root.b.accessible-node-labels.y.capacity</n ame><value>100</value></property>
</configuration>
複製程式碼

1. 規定 AM 只能分配在 172.17.48.28

對另外三個節點的 NodeManager 節點配置如下配置項:

yarn.nodemanager.am-alloc-disabled = true
複製程式碼

配置後,提交的 Application 的 AM 只能在 172.17.48.28 節點啟動。

2. 使用組合標籤

通過 mapreduce.job.node-label-expression 指定標籤表示式,x||表示同時使用 x/default 分割槽。

hadoop jar /usr/local/service/hadoop/share/hadoop/mapreduce/hadoop-mapredu ce-examples-3.1.2.jar pi -D mapreduce.job.queuename="a" -D mapreduce.job. node-label-expression="x||" 10 10
複製程式碼

使用該命令提交後,觀察到 Application 的 container 被分配在 x/default 分割槽。

四、Hadoop Yarn on Kubernetes Pod 最佳實踐

該客戶大資料應用和儲存跑在 Yarn 管理的大資料叢集,在生產環境中,面臨諸多問題,主要體現在大資料的算力不足和線上業務波谷時資源的浪費。如離線計算在算力不足時,資料準時性無法得到保證,尤其是當遇到隨機緊急大資料查詢任務,沒有可用的計算資源,只能停掉已有的計算任務,或者等已有任務完成,⽆論哪種⽅式,總體任務執行的效率都會大打折扣。

基於 Hadoop Yarn on Kubernetes Pod 方案,將離線任務自動擴容至雲上叢集,與 TKE 線上業務叢集混合部署,充分利用雲上波谷時段的閒置資源,提高離線業務的算力,並利用雲上資源快速的彈性擴容能力,及時補充離線計算的算力。

通過 Hadoop Yarn on Kubernetes Pod ⽅案對客戶的線上 TKE 叢集資源使用進行優化後,叢集閒時 CPU 使用率能提高 500%。

線上叢集閒時 CPU 佔用

離線上混部後 CPU 佔用

五、總結

本文提出了基於 YARN 針對雲原生容器化的優化與實踐,在混合部署雲原生環境中,極大地提高了任務執行的穩定性,高效性,有效提高了叢集資源利用率,節約硬體成本。在未來,我們會探討更多大資料雲原生場景,為企業客戶帶來更多的實際效益。

作者簡介

張翮,騰訊雲高階工程師,目前主要負責騰訊雲大資料產品彈性 MapReduce 的管控相關模組和重要元件 Hive 的技術研發。向 Apache Hive,Apache Calcite 開源專案貢獻過程式碼,畢業於電子科技大學。

關注“騰訊雲大資料”公眾號,技術交流、最新活動、服務專享一站 Get~