您好,登錄后才能下訂單哦!
作者 | 吳怡燃
轉(zhuǎn)自 | 京東技術(shù)
京東為什么要做萬(wàn)臺(tái)規(guī)模的Hadoop?
隨著京東的業(yè)務(wù)增長(zhǎng),原有的Hadoop集群已經(jīng)無(wú)法滿足高速增長(zhǎng)的存儲(chǔ)與計(jì)算需求。拆分集群雖然可以分擔(dān)一部分壓力,但帶來(lái)了另外的一些問(wèn)題,如拆分集群之后假如某個(gè)業(yè)務(wù)無(wú)法避免的需要另外一個(gè)集群上的數(shù)據(jù),這時(shí)便帶來(lái)了跨集群讀數(shù)據(jù)的問(wèn)題,嚴(yán)重影響了作業(yè)執(zhí)行效率。另一方面,各個(gè)集群總有閑忙時(shí)間,在某個(gè)集群閑時(shí)這些資源是浪費(fèi)的并沒(méi)有產(chǎn)生價(jià)值。
為了增加生產(chǎn)效率和節(jié)約成本,必須要將之前分散在各處的集群資源統(tǒng)一管理起來(lái),組成一個(gè)超大集群對(duì)外提供服務(wù),并且要讓各種并行框架可以利用它的存儲(chǔ)和計(jì)算資源進(jìn)行業(yè)務(wù)處理。
Hadoop 概述
Hadoop 作為大數(shù)據(jù)的處理平臺(tái)已經(jīng)有十幾年的發(fā)展歷史。其設(shè)計(jì)思想是使用廉價(jià)的臺(tái)式機(jī)組成一個(gè)大的集群做分布式計(jì)算與數(shù)據(jù)存儲(chǔ),利用冗余備份的方式保證數(shù)據(jù)的安全性和高可用,通過(guò)并行計(jì)算的方式完成超大數(shù)據(jù)集的快速處理。
通過(guò)增加節(jié)點(diǎn)的方式提升Hadoop集群的計(jì)算和存儲(chǔ)能力。通常在分布式并行處理數(shù)據(jù)時(shí),移動(dòng)計(jì)算代碼的成本會(huì)低于移動(dòng)數(shù)據(jù),所以Hadoop的MapReduce框架計(jì)算時(shí)會(huì)將計(jì)算代碼分發(fā)到每個(gè)數(shù)據(jù)節(jié)點(diǎn)上執(zhí)行,利用數(shù)據(jù)本地性較少的網(wǎng)絡(luò)交互提升性能。
過(guò)去Hadoop 2.0版本之前,Hadoop在設(shè)計(jì)上包含兩部分,第一部分是分布式存儲(chǔ)HDFS,另一部分是MapReduce 計(jì)算框架。自Hadoop2.0 版本之后,計(jì)算框架部分做了優(yōu)化升級(jí)變成了我們現(xiàn)在用的YARN (Yet Another Resource Negotiator) , YARN提供了分布式資源管理和作業(yè)調(diào)度的功能,同時(shí)提供了統(tǒng)一的編程模型,通過(guò)這個(gè)編程模型很多計(jì)算框架可以遷移到Y(jié)ARN上來(lái)。
從愿景上,Hadoop 致力于解決復(fù)雜數(shù)據(jù)的處理和運(yùn)算,處理結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ),提供分布式海量數(shù)據(jù)并行處理。
回想過(guò)去我們使用MPI、OpenMP去實(shí)現(xiàn)一個(gè)分布式處理程序,那時(shí)我們需要自己控制程序的遠(yuǎn)程啟動(dòng)與停止,同時(shí)要自己編寫(xiě)容錯(cuò)代碼?,F(xiàn)在Hadoop通過(guò)優(yōu)化和抽象將這些繁瑣的、能夠通用的功能都封裝到了框架中,讓開(kāi)發(fā)者只需要關(guān)注自己的業(yè)務(wù)邏輯代碼而不需要再寫(xiě)一些錯(cuò)誤重試和通訊相關(guān)的代碼,大大增加了開(kāi)發(fā)效率。同時(shí)使用那些并不太擅長(zhǎng)編寫(xiě)代碼的數(shù)據(jù)工程師也可以輕松使用Hadoop集群去實(shí)現(xiàn)自己的分布式處理分析程序。
在Hadoop 2.0 YARN 架構(gòu)下,主要有以下幾個(gè)組件:
京東Hadoop分布式資源管理與作業(yè)調(diào)度介紹
京東從很早之前就開(kāi)始使用Hadoop,踩了很多坑,從過(guò)去摸著石頭過(guò)河到現(xiàn)在小有所成,無(wú)論是業(yè)務(wù)問(wèn)題還是Hadoop框架本身的問(wèn)題,我們都遇到過(guò)。
通過(guò)解決這些問(wèn)題我們對(duì)Hadoop做了很多功能升級(jí)與修改,其中有一些功能回饋到了社區(qū),另外一些沉淀到了我們自己的分支版本中。今天我們的Hadoop大數(shù)據(jù)平臺(tái)提供了豐富的功能、完善的工具,為京東大數(shù)據(jù)業(yè)務(wù)保駕護(hù)航。
目前在京東大數(shù)據(jù)環(huán)境下,為滿足不同業(yè)務(wù)對(duì)運(yùn)行環(huán)境需求,我們利用Docker On YARN的模式把運(yùn)行環(huán)境隔離做了隔離,允許每個(gè)人定制自己的運(yùn)行環(huán)境安裝自己的算法庫(kù)。使用Linux CGroup的模式支持嚴(yán)格的計(jì)算資源隔離,保證每個(gè)作業(yè)的計(jì)算資源不受其他作業(yè)影響。另擴(kuò)展了資源與調(diào)度模型,增加了GPU和其他硬件的調(diào)度支持。為業(yè)務(wù)方統(tǒng)一了日志查詢工具幫助快速定位錯(cuò)誤。
過(guò)去大數(shù)據(jù)平臺(tái)這邊有各種小集群,如:Presto, Alluxio 等,每個(gè)小集群都有自己的一批機(jī)器,每臺(tái)機(jī)器上可能只部署一個(gè)服務(wù),這些服務(wù)對(duì)機(jī)器的利用率并不高,甚至是浪費(fèi)的,痛定思痛,我們決定利用YARN統(tǒng)一進(jìn)行資源管理與調(diào)度。經(jīng)過(guò)幾年的發(fā)展,我們將大部分的并行框架都移植到了YARN上運(yùn)行(如:Presto、Alluxio),利用YARN的優(yōu)勢(shì)和調(diào)度特點(diǎn)充分的利用這些機(jī)器資源,大大提升了集群資源利用率。
同時(shí)我們也自研了Tensorflow On YARN 、Caffe On YARN 等一系列的深度學(xué)習(xí)框架與工具幫助算法工程師直接使用Hadoop集群進(jìn)行算法處理。大大加快了算法與業(yè)務(wù)迭代速度。讓大數(shù)據(jù)平臺(tái)獲得了深度學(xué)習(xí)處理的能力。
后來(lái)為了更好的支持異地多活和跨地域擴(kuò)展能力,我們?cè)俅胃脑焐?jí)實(shí)現(xiàn)了萬(wàn)臺(tái)Hadoop集群分布式資源管理與調(diào)度系統(tǒng),解決了之前單集群擴(kuò)展瓶頸和無(wú)法有效支撐跨機(jī)房調(diào)度與災(zāi)備的問(wèn)題。該系統(tǒng)已經(jīng)在線上部署,并經(jīng)過(guò)了今年618的大促考驗(yàn),可以說(shuō)是穩(wěn)如磐石。
系統(tǒng)逐步鋪開(kāi)上線之后我們將京東跨地域的幾個(gè)大數(shù)據(jù)機(jī)房實(shí)現(xiàn)了互聯(lián),同時(shí)我們的HDFS也配套實(shí)現(xiàn)了同樣的跨機(jī)房功能,也在這時(shí)京東大數(shù)據(jù)處理平臺(tái)系統(tǒng)真正擁有了跨地域的部署與擴(kuò)展能力。
系統(tǒng)具有非常強(qiáng)的靈活性,可以通過(guò)修改調(diào)度路由策略和存儲(chǔ)數(shù)據(jù)映射表,輕松的做到跨機(jī)房的作業(yè)遷移和數(shù)據(jù)遷移。同機(jī)房?jī)?nèi)不同集群之間可以實(shí)現(xiàn)作業(yè)跨子集群運(yùn)行充分利用各集群資源,功能可隨時(shí)根據(jù)子集群負(fù)載動(dòng)態(tài)開(kāi)關(guān),無(wú)需用戶參與,對(duì)用戶完全透明。
為了使新的大數(shù)據(jù)平臺(tái)系統(tǒng)更友好更易于管理使用,團(tuán)隊(duì)開(kāi)啟了界面化項(xiàng)目。我們利用WEB技術(shù)實(shí)現(xiàn)了面向管理員的大數(shù)據(jù)平臺(tái)管理系統(tǒng),使用這套管理系統(tǒng)之后可以靈活方便的上下線子集群,實(shí)時(shí)管理和修改調(diào)度策略,不再需要像以前一樣登陸到對(duì)應(yīng)的物理服務(wù)器上執(zhí)行相關(guān)命令。通過(guò)標(biāo)準(zhǔn)化系統(tǒng)化,我們將運(yùn)維命令封裝在了代碼里,每個(gè)命令執(zhí)行前后都有相關(guān)的校驗(yàn)與權(quán)限認(rèn)證,減少人工操作時(shí)出現(xiàn)的誤操作,如果發(fā)生錯(cuò)誤系統(tǒng)將自動(dòng)回滾。
平臺(tái)提供了基于用戶級(jí)的權(quán)限管理,可以很靈活的管理集群中計(jì)算資源的權(quán)限,以實(shí)現(xiàn)控制每個(gè)用戶可以使用的計(jì)算資源量大小和資源池使用權(quán)限認(rèn)證。
真實(shí)生產(chǎn)環(huán)境中平臺(tái)會(huì)把資源按照一定的使用規(guī)則進(jìn)行劃分,并分配相關(guān)的權(quán)限給對(duì)應(yīng)的人或部門,從而避免某些用戶惡意提交作業(yè)到別人的資源池。同時(shí)平臺(tái)也細(xì)化了操作權(quán)限避免某些用戶惡意操作別人的作業(yè)(如:停止執(zhí)行)。
之前大數(shù)據(jù)平臺(tái)會(huì)存在多個(gè)集群,每個(gè)集群對(duì)應(yīng)自己的客戶端,每個(gè)客戶端對(duì)應(yīng)自己的配置文件,運(yùn)維起來(lái)麻煩不利于管理。
調(diào)度架構(gòu)修改升級(jí)完之后,從邏輯上可以理解為增加了一層調(diào)度抽象(Router),由原來(lái)的兩級(jí)調(diào)度變成了三級(jí)調(diào)度。也就是子集群的策略選擇?,F(xiàn)在的作業(yè)提交流程是:
在這種方式下,每個(gè)客戶端使用同樣的一套配置文件,保證了客戶端輕量級(jí),不再像之前一樣需要區(qū)分集群信息。所有的調(diào)度策略與邏輯都封裝在Router組件中。(所有的調(diào)度策略和控制信息我們保存在DBMS中)
增加了作業(yè)的動(dòng)態(tài)跨子集群借用資源功能,可以隨時(shí)控制某個(gè)隊(duì)列中的相關(guān)作業(yè)是否需要跨子群執(zhí)行。方便單個(gè)子集群在資源緊張時(shí)動(dòng)態(tài)去借用另一個(gè)空閑集群的資源。
增加了邏輯隊(duì)列名的概念,對(duì)于用戶來(lái)說(shuō)他們只需要關(guān)心自己的邏輯隊(duì)列名,而真正運(yùn)行作業(yè)是在哪個(gè)物理隊(duì)列則不需要他們關(guān)心,通過(guò)這個(gè)功能平臺(tái)端可以隨時(shí)控制邏輯隊(duì)列真正運(yùn)行在哪個(gè)子集群的哪個(gè)物理隊(duì)列。達(dá)到快速遷移或容災(zāi)的目的。
為了避免Router意外丟失或掛掉,在Router組件方面,我們單獨(dú)開(kāi)發(fā)了高可用和負(fù)載均衡功能,整個(gè)集群會(huì)部署多臺(tái)Router節(jié)點(diǎn),每個(gè)機(jī)房都會(huì)有一個(gè)或多個(gè)Router, 客戶端的請(qǐng)求會(huì)根據(jù)負(fù)載和距離從分散的多個(gè)Router服務(wù)器上選擇一個(gè)最合適的。同時(shí)我們支持任何時(shí)間點(diǎn)Router掛掉(如果Router的連接狀態(tài)不可用客戶端會(huì)自動(dòng)切換到另外一個(gè)Actvie的Router)
下面是這個(gè)架構(gòu)的邏輯框圖,包含了整個(gè)架構(gòu)中所有組件。其中新增是Router和State&Policy Store 兩個(gè)組件,前者直接對(duì)接Client 屏蔽后端RM子集群相關(guān)信息提供提交與作業(yè)信息查詢的功能,可以同時(shí)部署多臺(tái)對(duì)外提供服務(wù)。后者負(fù)責(zé)保存當(dāng)前所有子集群的狀態(tài)信息、Active RM 的地址信息和調(diào)度策略信息。(每隔一段時(shí)間子集群會(huì)以心跳的方式匯報(bào)自己當(dāng)前的服務(wù)狀態(tài)并存儲(chǔ)到StateStore中)目前我們支持多種調(diào)度策略可以滿足多種場(chǎng)景下的調(diào)度需求。
具體提交流程如下:
超大規(guī)模Hadoop集群優(yōu)化策略&優(yōu)化思路
原生的調(diào)度器,存在很多問(wèn)題。其中最主要的是性能問(wèn)題,為此我們自研了一個(gè)基于隊(duì)列鏡像的多路分配策略,大大提升了ResourceManager調(diào)度器的性能,讓我們單個(gè)YARN子集群擁有了超過(guò)萬(wàn)臺(tái)規(guī)模資源管理與調(diào)度能力。
另一方面豐富了調(diào)度器分配資源的算法邏輯,增加多個(gè)維度的排序篩選規(guī)則,多個(gè)規(guī)則之間可以組合使用,如:基于內(nèi)存、基于負(fù)載 、基于使用率等等。
還有其他一些ResourceManager性能相關(guān)的代碼優(yōu)化,如:簡(jiǎn)化資源計(jì)算流程,拆分鎖等等。
在MapReduce方面優(yōu)化了服務(wù)性能和框架功能。主要與Shuffle 服務(wù)相關(guān)。
優(yōu)化&分析&測(cè)試工具
Benchmark
HiBench https://github.com/intel-hadoop/HiBench
Hadoop 自帶 Benchmark
JVM分析工具
http://gceasy.io/
http://fastthread.io
Linux 性能分析
Perf
NMON
Google Tools
未來(lái)展望與期待
京東大數(shù)據(jù)平臺(tái)的實(shí)踐提供了一種可供參考的技術(shù)架構(gòu)與實(shí)施方式。未來(lái),京東大數(shù)據(jù)平臺(tái)依然會(huì)在電商級(jí)分布式架構(gòu)與技術(shù)方案演進(jìn)方向繼續(xù)前進(jìn)。對(duì)此我們也有一些新的功能即將上線。
一、如何利用集團(tuán)內(nèi)的資源節(jié)省成本
過(guò)去每年的大促都需要根據(jù)往年的流量進(jìn)行機(jī)器的采購(gòu),大促結(jié)束之后這些機(jī)器利用率很低浪費(fèi)了大量成本,為了解決這個(gè)問(wèn)題,目前的大數(shù)據(jù)平臺(tái)已經(jīng)與集團(tuán)內(nèi)的專有云-阿基米德完成了對(duì)接,平臺(tái)可以通過(guò)自動(dòng)伸縮的方式彈性使用云資源,未來(lái)的大促中將利用這個(gè)功能去承接一部分計(jì)算任務(wù)。
二、大數(shù)據(jù)平臺(tái)產(chǎn)品化
京東在大數(shù)據(jù)處理方面積累了豐富的經(jīng)驗(yàn),同時(shí)沉淀出了一些很優(yōu)秀的中間件和服務(wù)產(chǎn)品,未來(lái)我們將陸續(xù)把這些產(chǎn)品云化對(duì)外提供服務(wù)。
作者 | 吳怡燃
京東大數(shù)據(jù)平臺(tái)高級(jí)技術(shù)專家,擅長(zhǎng)大數(shù)據(jù)平臺(tái)的資源管理與調(diào)度系統(tǒng)的開(kāi)發(fā)與建設(shè)。目前專注于以萬(wàn)臺(tái)分布式調(diào)度系統(tǒng)及深度學(xué)習(xí)平臺(tái)的開(kāi)發(fā)與建設(shè)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。