全面探究Hive on Spark

目標(biāo)

  • 在CDH集群的查詢client中(包括webUI如HUE)使用Spark作為Hive-SQL的執(zhí)行引擎鉴腻。
  • 調(diào)研版本、使用方法、性能與適用范圍量淌、是否有語法差異、對parquet/orc等的支持嫌褪、調(diào)優(yōu)呀枢、穩(wěn)定性、對集群壓力等問題笼痛。
  • 基于調(diào)研結(jié)果深入背后的原理裙秋,理解現(xiàn)象的原因

資料

官方文檔CDH5.13.x
官方文檔CDH5.13.x相關(guān)配置
Hive on Spark解析
Hive使用Spark on Yarn作為執(zhí)行引擎
Hive琅拌,Hive on Spark和SparkSQL區(qū)別
Hive on spark的架構(gòu)與解析SQL的過程
Spark SQL你不得不知道的那些事兒

Hive on Spark與Spark SQL

  • MR是基于進(jìn)程并行處理的,hive里面很多代碼并沒有注意線程安全問題摘刑,但spark基于線程进宝,導(dǎo)致Shark得用一套單獨維護(hù)打了補丁的hive的分支,沒有辦法合并到hive泣侮。之后停止維護(hù)即彪,形成了兩套方案,一個是從頭開始的Spark SQL活尊,一個是Hive on Spark隶校。


    Shark->SparkSQL與HiveOnSpark.png
  • Hive執(zhí)行引擎(Execution Backend)有MR、Tez蛹锰,以及后來的Spark深胳,即將Hive的Compiler生成的執(zhí)行計劃提交給Spark集群上運行,這是Hive的功能铜犬。

    tez和spark都是通用有向無環(huán)圖DAG引擎舞终,他們比MapReduce更加靈活,性能也更優(yōu)越癣猾,比如敛劝,在使用MapReduce時,中間作業(yè)的輸出會被物化儲存到hdfs上纷宇,tez和spark則不同夸盟,他們可以根據(jù)hive規(guī)劃器的請求,把中間結(jié)果寫在本地磁盤像捶,甚至是內(nèi)存中緩存上陕,以避免額外的復(fù)制開銷

  • 在Spark程序中通過hiveContext.sql()查詢Hive是Spark SQL的特性,讓Spark SQL除了從TextFile中讀取數(shù)據(jù)外還能直接讀取Hive表拓春。SparkSQL主要包括兩個概念

    1. SQLContext:封裝Spark中的所有關(guān)系型功能释簿。
    2. DataFrame:可轉(zhuǎn)換為RDD進(jìn)行操作。
  • 小結(jié)

    1. Hive / SparkSQL做的是解析SQL硼莽,是翻譯層庶溶;Spark/MapReduce在執(zhí)行引擎層。所以SparkSQL存在部分語法與Hive不兼容:https://blog.csdn.net/zhoudetiankong/article/details/50295709

    2. 討論的兩者對應(yīng)的就是Hive->Spark與SparkSQL->Spark懂鸵。前者只需要編寫SQL偏螺,后者可以結(jié)合spark寫代碼獲得更靈活的操作.

    3. 基于Spark的Hive能提供Hive的所有功能,因為它本身隸屬于Hive項目矾瑰。

    4. SQL只是Spark SQL的一個功能而已砖茸,利用Dataframe來結(jié)合rdd操作會更加強大隘擎。

實驗

  1. 集群環(huán)境
  • Hadoop版本:2.6.0-cdh5.13.1(hadoop version)
  • Hive版本:1.1.0 (file /opt/cloudera/parcels/CDH-5.13.1-1.cdh5.13.1.p0.2/jars/hive-common-1.1.0-cdh5.13.1.jar)
  • 集群位數(shù):ELF 64-bit LSB shared object, x86-64, version 1 (SYSV)
    (file /opt/cloudera/parcels/CDH/lib/hadoop/lib/native/libhadoop.so.1.0.0)
  • Spark版本:spark-1.6.0+cdh5.13.3+543(待驗證殴穴。目前只是從官網(wǎng)上看到的https://www.cloudera.com/documentation/enterprise/release-notes/topics/cdh_vd_cdh_package_tarball_513.html

2、安裝相關(guān)配置
很多教程中會讓在hive-site.xml中做相關(guān)配置,但CDH5.13環(huán)境下不會看到這些配置(理解為被寫死了采幌,版本也固定為1.6劲够,官方說尚未適配高版本spark)

3、使用方法

set hive.execution.engine=spark;
set hive.execution.engine;  //確認(rèn)設(shè)置成功

簡單配置后即可照常執(zhí)行HiveSQL

性能與調(diào)優(yōu)

  1. 開啟新的Hive on Spark會話后首次查詢緩慢
  • 現(xiàn)象:新Hive on Spark會話啟動后的首次查詢可能延遲休傍,在Spark on Yarn集群上
    要啟動時間征绎。
  • 原因:查詢需要等待Yarn containers初始化
  • 解決方法:無。接下來的查詢會快磨取。

大部分基于mr的調(diào)優(yōu)設(shè)置在Spark下依然有效人柿,這里說明一些特殊情況。

2忙厌、寫入語句
對10000行某表進(jìn)行create table 與insert overwrite操作凫岖,spark耗時20+秒,mr耗時30+秒

  1. 對在分區(qū)字段上的map join進(jìn)行剪枝優(yōu)化
SET hive.spark.dynamic.partition.pruning.map.join.only=true;
  1. 使用更多的executor
    測試一個包含大量join的復(fù)雜語句逢净,分別使用不同引擎與不同的如下設(shè)置
set spark.executor.instances=n; // 默認(rèn)值n=2 
mr spark n=2 spark n=4 spark n=8
6m10s 5m18s 2m52s 2m26s

基于目前集群資源情況哥放,該值最高取32。
可以看到Spark在數(shù)據(jù)量大爹土、join復(fù)雜情況下優(yōu)勢降低甥雕。并且該參數(shù)值有邊際遞減效應(yīng)。

集群相關(guān)參數(shù)

目前分析師共用user隊列胀茵,單個應(yīng)用申請CPU與內(nèi)存資源不宜超過隊列資源的1/3社露。
目前符合官網(wǎng)推薦規(guī)則,不建議手動修改

  • spark.driver.cores=1 //即am核數(shù)
  • spark.driver.memory=3.6Gb
  • yarn.nodemanager.resource.cpu-vcores=16
  • spark.executor.cores=4
  • yarn.nodemanager.resource.memory-mb=24Gb
  • spark.executor.memory=4G
  • spark.yarn.driver.memoryOverhead=409Mb

語法與功能

因為SQL解析引擎依然是Hive宰掉,語法與功能完全與Hive兼容呵哨,這里做了如下測試。

  1. 能夠照常使用平臺公共的臨時UDF
    create temporary function check_mobile as 'com.tal.hive.udf.CheckMobileNo';
    select check_mobile('150');

  2. 能夠正常查詢Parquet與Orc格式的表

  3. insert overwrite與create table as等寫入語句可以執(zhí)行轨奄。

問題

目前版本的cdh/HUE/Hive存在一個bug:為了讓用戶不用每次等待Spark Session的啟動(7.1中所述)孟害,Session會保留非常長的時間,即使HUE頁面關(guān)閉挪拟。
為了保證資源及時釋放挨务,請務(wù)必在關(guān)閉客戶端頁面前、長時間不使用時將當(dāng)前session的執(zhí)行引擎切換回mr:

set hive.execution.engine=spark;
...//用戶正常業(yè)務(wù)SQL
set hive.execution.engine=mr;// 務(wù)必注意`

相同現(xiàn)象問題與官方issue:https://stackoverflow.com/questions/46676323/spark-on-hive-progress-bar-stuck-at-10
大神Fayson的論述:https://cloud.tencent.com/developer/article/1176754

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玉组,一起剝皮案震驚了整個濱河市谎柄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惯雳,老刑警劉巖朝巫,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異石景,居然都是意外死亡劈猿,警方通過查閱死者的電腦和手機拙吉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揪荣,“玉大人筷黔,你說我怎么就攤上這事≌叹保” “怎么了佛舱?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挨决。 經(jīng)常有香客問我请祖,道長,這世上最難降的妖魔是什么脖祈? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任损拢,我火速辦了婚禮,結(jié)果婚禮上撒犀,老公的妹妹穿的比我還像新娘福压。我一直安慰自己,他們只是感情好或舞,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布荆姆。 她就那樣靜靜地躺著,像睡著了一般映凳。 火紅的嫁衣襯著肌膚如雪胆筒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天诈豌,我揣著相機與錄音仆救,去河邊找鬼。 笑死矫渔,一個胖子當(dāng)著我的面吹牛彤蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庙洼,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼顿痪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油够?” 一聲冷哼從身側(cè)響起蚁袭,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎石咬,沒想到半個月后揩悄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡鬼悠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年删性,在試婚紗的時候發(fā)現(xiàn)自己被綠了棉饶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡镇匀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袜啃,到底是詐尸還是另有隱情汗侵,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布群发,位于F島的核電站晰韵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏熟妓。R本人自食惡果不足惜雪猪,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望起愈。 院中可真熱鬧只恨,春花似錦、人聲如沸抬虽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阐污。三九已至休涤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笛辟,已是汗流浹背功氨。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留手幢,地道東北人捷凄。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像围来,于是被迫代替她去往敵國和親纵势。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354