目標(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隶校。
- 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主要包括兩個概念:
- SQLContext:封裝Spark中的所有關(guān)系型功能释簿。
- DataFrame:可轉(zhuǎn)換為RDD進(jìn)行操作。
-
小結(jié)
Hive / SparkSQL做的是解析SQL硼莽,是翻譯層庶溶;Spark/MapReduce在執(zhí)行引擎層。所以SparkSQL存在部分語法與Hive不兼容:https://blog.csdn.net/zhoudetiankong/article/details/50295709
討論的兩者對應(yīng)的就是Hive->Spark與SparkSQL->Spark懂鸵。前者只需要編寫SQL偏螺,后者可以結(jié)合spark寫代碼獲得更靈活的操作.
基于Spark的Hive能提供Hive的所有功能,因為它本身隸屬于Hive項目矾瑰。
SQL只是Spark SQL的一個功能而已砖茸,利用Dataframe來結(jié)合rdd操作會更加強大隘擎。
實驗
- 集群環(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)
- 開啟新的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+秒
- 對在分區(qū)字段上的map join進(jìn)行剪枝優(yōu)化
SET hive.spark.dynamic.partition.pruning.map.join.only=true;
- 使用更多的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兼容呵哨,這里做了如下測試。
能夠照常使用平臺公共的臨時UDF
create temporary function check_mobile as 'com.tal.hive.udf.CheckMobileNo';
select check_mobile('150');能夠正常查詢Parquet與Orc格式的表
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