基於Spark 2.0.0搭建Hive on Spark環境

一、運行環境

CentOS 7.2

Hadoop 2.7

Hive 2.2.0

Spark 2.0.0

JDK 1.7

Scala 2.11.8

Maven 3.3.9

說明:Scala 2.11.8以後的版本只支持JDK1.8,如果環境原本是使用JDK1.7的就不需要安裝最新版本。


二、開始配置前的排坑

很多人都會參考Hive on spark的官方手冊https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started來配置,但其中還是有很多坑的,下面就說一下官方手冊上的坑及沒有提到一些細節。

1)版本兼容問題

HIVE官方指引說Spark一定要安裝沒有HIVE jar包的版本。原文“Note that you must have a version of Spark which does not include the Hive jars.”除此之外就沒有其他的說明了。但實際情況是HIVE最新發布版2.1.1(截止我寫這篇博客的時間點官網上的下載頁面最新版本)是沒辦法運行在Spark2.0.0之上的,強行運行的話會出現java.lang.ClassNotFoundException: org.apache.spark.JavaSparkListener的錯誤。原因是由於從Spark2.0.0開始JavaSparkListener已移除,改爲了SparkListener。

如果想使用Hive2.X版本搭配Spark2.X版本的話可以使用Hive-14029的修復版本:

https://github.com/apache/hive/pull/103/commits/f14f5a6d0d255d52e99ecbf5a232706cb1f63142

Hive對應的Spark版本可根據源碼目錄中的pom.xml的<spark.version>確認。

2)spark編譯時scala版本需要更改

官方指引的編譯命令

[plain] view plain copy
  1.   
[html] view plain copy
  1. ./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided"  
根據spark官方指引實際操作的編譯命令

[plain] view plain copy
  1. ./dev/change-scala-version.sh 2.11  
  2. ./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided,-Dscala-2.11"  

3)啓動Hive時java.lang.NoClassDefFoundError: org/slf4j/Logger錯誤

原因是沒有導入hadoop的jar包,在spark-env.sh加入下面的變量即可:

[html] view plain copy
  1. export SPARK_DIST_CLASSPATH=$(hadoop classpath)  


4)Spark on Yarn不需要啓動spark集羣

官方手冊原文是在編譯後就要求啓動spark集羣——“Start Spark cluster”,但這種用是要配置master和worker的,有點像配置resourcemanager和nodemanager。而實際上如果是Spark on Yarn則不需要配置也不需要啓動spark集羣。Spark會自動讀取Yarn配置文件,如果不是用了Spark on Yarn,那在Yarn的webUI上是看不到Spark任務的。

Spark on Yarn需要在spark-env.sh加入下面的變量

[html] view plain copy
  1. export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop  
  2. export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop  

5)Hive的spark.master參數

官方手冊上說spark.master參數是<Spark Master URL>,沒有詳細地說明,像我這樣的新手很容易犯暈,spark官方文檔上有詳細解釋http://spark.apache.org/docs/latest/submitting-applications.html#master-urls


三、配置過程

1)編譯spark和hive

[html] view plain copy
  1. 安裝scala和maven  
  2. 配置maven運行參數  
  3. <span style="font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;">export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m -XX:MaxPermSize=512m"</span>  
  4. 編譯spark  
  5. <div style="font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;">./dev/change-scala-version.sh 2.11</div><div style="font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;">./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided,-Dscala-2.11"</div>編譯hive  
  6. <span style="font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;">mvn clean package -Pdist -Dmaven.test.skip=true</span>  


2)把SPARK_HOME/jars下的spark-*和scala-*的jar包軟連接或拷到HIVE_HOME/lib下


3)在hive-site.xml中加入

[html] view plain copy
  1. <property>  
  2.   <name>spark.yarn.jars</name>  
  3.   <value>hdfs://xxxx:9000/spark-jars/*</value>  
  4. </property>  
並把SPARK_HOME/jars下所有jar包複製到此目錄下


4)在spark-env.sh中加入

[html] view plain copy
  1. export SPARK_DIST_CLASSPATH=$(hadoop classpath)  
  2. export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop  
  3. export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop  

5)啓動HIVE,配置參數

[html] view plain copy
  1. set hive.execution.engine=spark;  
  2. set spark.master=yarn;  
  3. set spark.submit.deployMode=client;  
  4. set spark.eventLog.enabled=true;  
  5. set spark.eventLog.dir=hdfs://xxxx:9000/spark-logs;  
  6. set spark.executor.memory=1024m;  
  7. set spark.serializer=org.apache.spark.serializer.KryoSerializer;  
這些參數可以配置在hive-site.xml或spark-defaults.conf中。


6)執行SQL,完成


四、說在最後

本文只是爲了記錄自己搭建Hive 2.2 on Spark 2.0.0時遇到的一些問題和解決步驟,因爲當時網上沒有什麼現成資料所以走了不少彎路,希望此文能幫助和我遇到同樣問題的人。關於性能調優還請參考spark官方手冊或者網上其他資料,如有錯誤歡迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章