1. 程式人生 > >Mark :Hive使用Spark on Yarn作為執行引擎

Mark :Hive使用Spark on Yarn作為執行引擎

原文:http://lxw1234.com/archives/2016/05/673.htm

Hive從1.1之後,支援使用Spark作為執行引擎,配置使用Spark On Yarn作為Hive的執行引擎,首先需要注意以下兩個問題:

Hive的版本和Spark的版本要匹配;

具體來說,你使用的Hive版本編譯時候用的哪個版本的Spark,那麼就需要使用相同版本的Spark,可以在Hive的pom.xml中檢視spark.version來確定;

Hive root pom.xml’s <spark.version> defines what version of Spark it was built/tested with.

Spark使用的jar包,必須是沒有整合Hive的;

也就是說,編譯時候沒有指定-Phive.

一般官方提供的編譯好的Spark下載,都是集成了Hive的,因此這個需要另外編譯。

Note that you must have a version of Spark which does not include the Hive jars. Meaning one which was not built with the Hive profile.

如果不注意版本問題,則會遇到各種錯誤,比如:

  1. Causedby: java.lang.NoClassDefFoundError: org/apache/hive/spark
    /client/Job
  2. Causedby: java.lang.ClassNotFoundException: org.apache.hive.spark.client.Job

我這裡使用的環境資訊如下:

hadoop-2.3.0-cdh5.0.0

apache-hive-2.0.0-bin

spark-1.5.0-bin-hadoop2.3

其中,Spark使用了另外編譯的spark-assembly-1.5.0-hadoop2.3.0.jar。編譯很簡單,下載spark-1.5.0的原始碼,使用命令:

mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0-cdh5.0.0 -DskipTests -Dscala-2.10 clean package

首先在hive-site.xml中新增spark.home:

<property>

<name>spark.home</name>

<value>/usr/local/spark/spark-1.5.0-bin-hadoop2.3</value>

</property>

同時也配置了環境變數

export SPARK_HOME=/usr/local/spark/spark-1.5.0-bin-hadoop2.3

這兩塊應該只需要配置一處即可。

進入hive-cli命令列,使用set的方式設定以下引數:

  1. set spark.master=yarn-cluster;//預設即為yarn-cluster模式,該引數可以不配置
  2. set hive.execution.engine=spark;
  3. set spark.eventLog.enabled=true;
  4. set spark.eventLog.dir=hdfs://cdh5/tmp/sparkeventlog;
  5. set spark.executor.memory=1g;
  6. set spark.executor.instances=50;//executor數量,預設貌似只有2個
  7. set spark.driver.memory=1g;
  8. set spark.serializer=org.apache.spark.serializer.KryoSerializer;

當然,這些引數也可以配置在hive-site.xml中。

接下來就可以執行HQL查詢試試了:

hive

hive

可以看到,已經使用Spark作為執行引擎了。

hive

在Yarn的WEB頁面上也看到了對應的Application。

在進入hive-cli命令列,第一次執行查詢之後,Hive向Yarn申請Container資源,即引數spark.executor.instances指定的數量,另外加一個Driver使用的Container。該Application便會一直執行,直到退出hive-cli,該Application便會成功結束,期間佔用的叢集資源不會自動釋放和回收。如果在hive-cli中修改和executor相關的引數,再次執行查詢時候,Hive會結束上一次在Yarn上執行的Application,重新申請資源提交執行。