本地化級(jí)別
PROCESS_LOCAL
進(jìn)程本地化,代碼和數(shù)據(jù)在同一個(gè)進(jìn)程中,也就是在同一個(gè)executor中;計(jì)算數(shù)據(jù)的task由executor執(zhí)行,數(shù)據(jù)在executor的BlockManager中;性能最好
NODE_LOCAL
節(jié)點(diǎn)本地化,代碼和數(shù)據(jù)在同一個(gè)節(jié)點(diǎn)中;比如說(shuō),數(shù)據(jù)作為一個(gè)HDFS block塊,就在節(jié)點(diǎn)上,而task在節(jié)點(diǎn)上某個(gè)executor中運(yùn)行;或者是,數(shù)據(jù)和task在一個(gè)節(jié)點(diǎn)上的不同executor中;數(shù)據(jù)需要在進(jìn)程間進(jìn)行傳輸
NO_PREF
對(duì)于task來(lái)說(shuō),數(shù)據(jù)從哪里獲取都一樣,沒(méi)有好壞之分
RACK_LOCAL
機(jī)架本地化,數(shù)據(jù)和task在一個(gè)機(jī)架的兩個(gè)節(jié)點(diǎn)上;數(shù)據(jù)需要通過(guò)網(wǎng)絡(luò)在節(jié)點(diǎn)之間進(jìn)行傳輸
ANY
數(shù)據(jù)和task可能在集群中的任何地方,而且不在一個(gè)機(jī)架中,性能最差。
我們多數(shù)優(yōu)化最高做到NODE_LOCAL級(jí)別。為了達(dá)到這一級(jí)別,走以下步驟。
1,判斷hdfs本地化是否生效
使用命令hadoop checknative -a

如上圖1.png所示,已經(jīng)正確載入本地化
2,spark配置
在spark-env.sh文件里配置變量
export LD_LIBRARY_PATH=/home/dmp/hadoop/lib/native/:$LD_LIBRARY_PATH
在spark-default.conf里配置
spark.locality.wait 10
是對(duì)于運(yùn)行級(jí)別檢查的時(shí)間設(shè)置,單位是秒
3,啟動(dòng)spark,查看日志
Unable to load native-hadoop library for your platform
或者可以使用spark-shell腳本來(lái)查看配置項(xiàng)的問(wèn)題
也是看此日志是否出現(xiàn)。
4,使用beeline進(jìn)行測(cè)試
beeline -u jdbc:hive2://host:10000 -n root
select count(*) from tablename where time=20170211;
查看頁(yè)面spark運(yùn)行級(jí)別。
問(wèn)題發(fā)現(xiàn)與解決方式(spark 對(duì)于hostname與ip解析有區(qū)別)
使用spark sbin下面的腳本start-all.sh啟動(dòng)之后,頁(yè)面顯示的master是hostname,但是對(duì)于worker來(lái)說(shuō),顯示的卻是ip,其實(shí)它應(yīng)該像hadoop一樣,去顯示hostname,這塊不知道它內(nèi)部是怎么設(shè)置的。請(qǐng)看下圖

再看hadoop的圖

此種情況之下,spark本地化失效??聪聢D運(yùn)行級(jí)別。全部是any

跑完這條sql語(yǔ)句需要2.6*10=26min之久。

以上是一種效果。
現(xiàn)在先啟動(dòng)master,sbin/start-master.sh
然后手動(dòng)啟動(dòng)worker,指定worker的名字與master
/home/dmp/spark/sbin/start-slave.sh -h dmp3 spark://dmp8:7077
此時(shí)頁(yè)面worker情況

然后進(jìn)行sql語(yǔ)句查詢(xún)
select count(*) from tablename where time=20170211;
此時(shí)頁(yè)面的運(yùn)行級(jí)別

此種情況下查詢(xún)時(shí)間為:

速度提高10倍。對(duì)比原來(lái)的26分鐘。
這就是spark 運(yùn)行級(jí)別的奧妙。