轉(zhuǎn)自:https://blog.csdn.net/maobaolong/article/details/79337538
京東大數(shù)據(jù)平臺(tái)
集群規(guī)模?
服務(wù)器規(guī)模30000臺(tái)+答捕,離線(xiàn)集群總規(guī)模18000+ , 用戶(hù)6000+
計(jì)算能力?
離線(xiàn)數(shù)據(jù)日處理40PB+,日運(yùn)行Job數(shù)100萬(wàn)+
存儲(chǔ)能力?
總數(shù)據(jù)量400PB+佳窑,日增數(shù)據(jù)量500TB+
業(yè)務(wù)能力?
業(yè)務(wù)主題40+崖蜜,數(shù)據(jù)模型450+
Alluxio(之前的Tachyon)。是世界上第一個(gè)以?xún)?nèi)存速度統(tǒng)一不同存儲(chǔ)系統(tǒng)的系統(tǒng)识埋。在大數(shù)據(jù)生態(tài)中树埠,Alluxio位于計(jì)算框架和各種存儲(chǔ)系統(tǒng)之間稽荧。此外年碘,Alluxio存儲(chǔ)為中心的架構(gòu)澈歉,使數(shù)據(jù)訪(fǎng)問(wèn)速度的數(shù)量級(jí)比現(xiàn)有解決方案快得多。
Alluxio社區(qū)的以下優(yōu)勢(shì)使得Alluxio越來(lái)越多的被很多知名企業(yè)所應(yīng)用屿衅,也吸引越來(lái)越多的貢獻(xiàn)者埃难。
活躍開(kāi)源社區(qū)?
開(kāi)源是大勢(shì)所趨。800多Contributor涤久,1723次fork涡尘。6000多次PR。社區(qū)Maintainer活躍度高响迂,提出的PR很快就有回復(fù)
創(chuàng)始人為華人?
華人contributor特別多考抄,中文文檔資料特別多。加入門(mén)檻底蔗彤,還有新手教程川梅,對(duì)于新contributor非常友好。
CI完備?
alluxio-bot(PR title)幕与、 AmplabJenkins作為PR builder(License header\Checkstyle\findbugs\test)
Alluxio在京東的應(yīng)用主要在JDPresto、Kylin镇防、HDFS啦鸣。本文主要介紹JDPresto在京東的應(yīng)用。
Alluxio作為可插拔的容錯(cuò)組件應(yīng)用于京東體系內(nèi)諸多計(jì)算框架来氧。
利用Alluxio優(yōu)秀的緩存能力提供對(duì)ADHOC诫给, 實(shí)時(shí)流計(jì)算天生的支撐香拉,降低集群對(duì)于網(wǎng)絡(luò)消耗的依賴(lài)。
JDPresto on Alluxio已經(jīng)帶來(lái)了10倍平均性能提升中狂。Alluxio作為可插拔的優(yōu)化組件凫碌,當(dāng)Alluxio服務(wù)不可用時(shí),JDPresto可以直接訪(fǎng)問(wèn)HDFS胃榕。我們的工作是擴(kuò)展Alluxio盛险,增強(qiáng)Alluxio和HDFS的一致性。
Alluxio已經(jīng)在我們的生產(chǎn)環(huán)境運(yùn)行1年多了勋又。
優(yōu)勢(shì)
可插拔
容錯(cuò)
增強(qiáng)本地性
架構(gòu)和流程介紹
下圖可以看出用Alluxio與不用Alluxio的Presto集群增加了隔離性和本地性
下圖可以看出Presto會(huì)優(yōu)先讀取本地的緩存苦掘,如果讀取Alluxio異常,則會(huì)直接讀HDFS
下圖是部署圖
下圖為使用JDPresto楔壤、JDPresto on alluxio鹤啡、 JDPresto混合模式的對(duì)比圖
下圖是測(cè)試5次Presto讀時(shí)間用Alluxio和不用Alluxio的對(duì)比
對(duì)比測(cè)試——sql查詢(xún)速度
下圖是在Presto的交互終端執(zhí)行sql查詢(xún)
下圖是在Presto的Web界面看到sql的執(zhí)行情況
通過(guò)上邊的查詢(xún)結(jié)果可以看出采用Alluxio進(jìn)行緩存,由于增加了本地性減少網(wǎng)絡(luò)消耗以及使用內(nèi)存進(jìn)行存儲(chǔ)減少I(mǎi)O蹲嚣,所以查詢(xún)sql速度提升顯著递瑰。需要說(shuō)明的是采用Alluxio進(jìn)行緩存,第一次查詢(xún)需要從底層文件系統(tǒng)讀取數(shù)據(jù)內(nèi)容并緩存到Alluxio的Worker中隙畜,并且當(dāng)時(shí)測(cè)試的版本Alluxio為1.4版本抖部,采用的是同步緩存,所以速度反而會(huì)慢禾蚕,1.5版本以后的Alluxio已經(jīng)采用異步緩存您朽,優(yōu)化了第一次讀取的速度。
性能壓測(cè)——轉(zhuǎn)發(fā)線(xiàn)上一天查詢(xún)請(qǐng)求
我們開(kāi)發(fā)了性能壓測(cè)工具换淆,轉(zhuǎn)發(fā)線(xiàn)上sql到兩個(gè)presto集群哗总,一個(gè)使用Alluxio,為測(cè)試倍试,另一個(gè)不使用Alluxio為對(duì)照讯屈。兩個(gè)Presto集群在同一個(gè)HDFS集群中。
通過(guò)上圖可以看出县习,紅色線(xiàn)(使用Alluxio)在40分鐘時(shí)已經(jīng)執(zhí)行完所有sql涮母,而綠色線(xiàn)在60分鐘也沒(méi)有執(zhí)行完。
我們的工作
為了讓Alluxio在JD更好的發(fā)揮其作用躁愿,我們?cè)贏(yíng)lluxio叛本、Presto以及on Yarn方面做的工作如下圖所示:
ItemCount
PMC1
Contributor6
PR53
Merged PR50
Merged Commit221
Additions / Deletions+4153 / -2254
基于ui-grid
支持排序、分頁(yè)彤钟、過(guò)濾
可以指定位置顯示文件或文件夾內(nèi)容
很遺憾来候,新界面Patch沒(méi)有合并到主分支了,需要的話(huà)逸雹,可以自行打PATCH营搅。ALLUXIO-2557
啟動(dòng)檢查:在啟動(dòng)的時(shí)候進(jìn)行一致性檢查云挟,將不一致的文件或文件夾重新加載元數(shù)據(jù)
每次訪(fǎng)問(wèn)都檢查:每次訪(fǎng)問(wèn)文件或文件夾時(shí),都會(huì)與底層文件系統(tǒng)進(jìn)行比對(duì)转质,不一致則更新元數(shù)據(jù)园欣。已經(jīng)演變成目前的指紋(FingerPrint)功能。
當(dāng)Alluxio存儲(chǔ)空間不足時(shí)休蟹,需要采用一定的空間回收策略進(jìn)行回收沸枯。同步回收是舊版的回收實(shí)現(xiàn)。它當(dāng)客戶(hù)請(qǐng)求比當(dāng)前在worker上可用空間更多空間時(shí)啟動(dòng)回收程序釋放足夠的空間來(lái)滿(mǎn)足要求鸡挠。 這導(dǎo)致許多小的回收嘗試辉饱,并不高效。而采用基于高低水位的異步空間回收器拣展,當(dāng)空間空閑達(dá)到高水位時(shí)彭沼,進(jìn)行空間釋放,釋放到空間空閑達(dá)到低水位時(shí)停止釋放空間备埃。
這是一個(gè)監(jiān)視JVM暫停情況的服務(wù)姓惑。該服務(wù)建立一個(gè)簡(jiǎn)單的線(xiàn)程。在此線(xiàn)程中按脚,在循環(huán)中運(yùn)行sleep一段時(shí)間方法于毙,如果sleep花費(fèi)的時(shí)間比傳遞給sleep方法的時(shí)間長(zhǎng),就意味著JVM或者宿主機(jī)已經(jīng)出現(xiàn)了停頓處理現(xiàn)象辅搬,可能會(huì)導(dǎo)致其它問(wèn)題唯沮,如果這種停頓被監(jiān)測(cè)出來(lái)達(dá)到一定的閾值,線(xiàn)程會(huì)打印相應(yīng)級(jí)別的消息堪遂。還可以把額外sleep的時(shí)間進(jìn)行metrics統(tǒng)計(jì)介蛉,外部的監(jiān)控系統(tǒng)可以監(jiān)控Alluxio的健康狀態(tài)以及進(jìn)行報(bào)警。
由于現(xiàn)有的Shell命令不能滿(mǎn)足我們的需求溶褪,于是改進(jìn)了現(xiàn)有的命令以及實(shí)現(xiàn)了一些新的實(shí)用的shell命令币旧。
整合CopyFromLocal、CopyToLocal猿妈、Cp
ls命令增加?-h?參數(shù)顯示帶單位的文件大小吹菱,默認(rèn)顯示字節(jié)大小,與標(biāo)準(zhǔn)的文件系統(tǒng)命令實(shí)用習(xí)慣一致彭则。
修改bin/alluxio鳍刷,支持-debug參數(shù)開(kāi)啟的時(shí)候,增加ALLUXIO_USER_DEBUG_JAVA_OPTS環(huán)境變量的值到JVM參數(shù)中俯抖,該環(huán)境變量可以定位成遠(yuǎn)程調(diào)試參數(shù)输瓜,例如ALLUXIO_SHELL_DEBUG_JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5603"
修改load命令,增加--local參數(shù),如果該文件已經(jīng)存在在A(yíng)lluxio中前痘,設(shè)置了--local選項(xiàng),并且有本地worker担忧,則數(shù)據(jù)將移動(dòng)到該worker上芹缔。原有的邏輯如果其它worker已經(jīng)存在該文件,則不會(huì)將文件load在本地worker瓶盛。
修改rm命令最欠,增加-alluxioOnly參數(shù)只刪除Alluxio的元數(shù)據(jù)和緩存數(shù)據(jù),并不會(huì)刪除底層文件系統(tǒng)內(nèi)容惩猫。
日志庫(kù)將日志分為5 個(gè)級(jí)別芝硬,分別為DEBUG、INFO轧房、WARN拌阴、ERROR 和FATAL。這5 個(gè)級(jí)別對(duì)應(yīng)的日志信息重要程度不同奶镶,它們的重要程度由低到高依次為DEBUG < INFO < WARN < ERROR < FATAL迟赃。日志輸出規(guī)則為:只輸出級(jí)別不低于設(shè)定級(jí)別的日志信息。比如厂镇,級(jí)別設(shè)定為INFO纤壁,則INFO、WARN捺信、ERROR和FATAL 級(jí)別的日志信息都會(huì)被輸出酌媒,但級(jí)別比INFO 低的DEBUG 則不會(huì)被輸出。
我們有時(shí)希望在不重啟服務(wù)的情況下動(dòng)態(tài)設(shè)置某個(gè)Logger的日志級(jí)別迄靠。
所以秒咨,我們實(shí)現(xiàn)了Alluxio shell的一個(gè)logLevel命令,可以在特定實(shí)例上獲取或更改特定類(lèi)的日志級(jí)別梨水。
語(yǔ)法是alluxio logLevel --logName = NAME [--target = ] [--level = LEVEL]拭荤,其中l(wèi)ogName表示日志的名稱(chēng),target列出了需要設(shè)定的Alluxio master或worker列表 疫诽。 如果提供了參數(shù)level舅世,則命令更改日志級(jí)別,否則將獲取并顯示當(dāng)前日志級(jí)別奇徒。
例如雏亚,以下命令將foo.Bar類(lèi)的日志級(jí)別在master和192.168.100.100:30000的worker上設(shè)置為調(diào)試級(jí)別。
alluxio logLevel --loggerName = foo.Bar --target = master摩钙,192.168.100.100:30000--level = DEBUG
1
以下命令獲取foo.Bar類(lèi)的所有worker的日志級(jí)別
alluxio logLevel --loggerName = foo.Bar --target = workers
1
修改了若干問(wèn)題罢低,不一一列舉。
跟蹤Alluxio社區(qū)PATCH,向Alluxio提高代碼
完善壓測(cè)工具
完善監(jiān)控和預(yù)警
穩(wěn)定性提升
可調(diào)試支持
擴(kuò)展其他框架使用
Fix Bug