Hive現有支持的執行引擎有mr和tez,默認的執行引擎是mr,Hive On Spark的目的是添加一個spark的執行引擎,讓hive能跑在spark之上;sql
在執行hive ql腳本以前指定執行引擎、spark.home、spark.mastersession
set hive.execution.engine=spark; set spark.home=/home/spark/app/spark-1.3.0-bin-spark-without-hive; set spark.master=yarn;
Hive On Spark與Spark SQL/Shark的區別:app
Spark SQL/Shark:優化
一、將sql語義翻譯成Spark RDD在Spark上執行;spa
二、Spark SQL是基於hive snapshot版本,雖然可以兼容hive,可是使用的版本早於當前hive的release版本,最新的一些特性則沒法使用;翻譯
三、Spark SQL使用Spark的transformation和action替換Hive sql的構建; 將會丟失一些hive自身構建實現的特性;code
Hive on Spark:orm
一、將hql語義翻譯成MapReduce在Spark上執行;對象
二、Hive On Spark則是與hive共同演化;blog
三、Hive On Spark使用的是Hive的構建,將包含Hive全部的特性,Spark僅僅是一個通用的執行引擎而已;
爲Hive添加一個spark執行引擎涉及到以下方面:
一、查詢計劃
將Hive的邏輯執行計劃進一步翻譯成Spark可以執行的Spark計劃;
二、查詢執行
獲得的Spark計劃真正在Spark集羣中運行;
三、監控、計數器、統計等
查詢計劃:
當hive接收到一個sql語句時,使用Hive的語法解析器解析成一個操做計劃;
對於On Spark引擎,引入了SparkComplier,相似於MapReduceCompiler和TezCompiler;
SparkComplier:
將從Hive中獲得的邏輯執行計劃轉成在Spark上能運行的計劃;
在產生Spark計劃的時候作一些物理執行計劃的優化;
SparkTask:在Spark集羣中執行的一個job
SparkWork:SparkTask的計劃,能夠經過explain查看
SparkComplier: 將Hive的執行計劃轉化成一個SparkWork
查詢執行:
SparkTask.execute()在SparkWork以外產出rdd以及相應的方法,經過Spark Client提交給Spark集羣執行;一旦SparkTask提交給了Spark集羣,Spark Client將監控job的執行狀況;
經過SparkJobMonitor來處理打印任務的執行狀態和最終的執行結果;Spark Job的提交是經過SparkContext對象完成的;當SparkTask被hive執行時,就會爲當前用戶session建立一個SparkContext;
Hive表相關的RDD將會被建立;MapFunction、ReduceFunction將會被SparkWork建立而且做用在RDD上;當在RDD上執行foreach方法時該RDD上的job就會被觸發執行。
監控、計數器、統計等:
監控:
Spark在每一個SparkContext運行時提供了WebUI,當時該UI中只能展示出運行時的Application信息;
爲了在Application運行完後也能從新渲染UI信息,須要在啓動Application以前設置spark.eventLog.enabled爲true;
Standalone模式運行時能夠經過WebUI展現,YARN/Mesos模式運行時,能夠經過Spark History Server來展示;
計數器/統計:
在Spark中提供了accumulator實現計數器,使用Metrics實現統計;