宣告:

此部落格參考了官網的配置方式,並結合筆者在實踐網上部分帖子時的踩坑經歷整理而成

這裡貼上官方配置說明:

[官方]: https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started

大前提:

從Hive1.1開始支援使用Spark作為執行引擎,我們配置使用Spark On Yarn時,一定要注意

  • Hive版本與Spark版本的適配,不適配的需要自己重新編譯使其適配

    這裡貼上官方推薦的對應版本

    Hive Version Spark Version
    master 2.3.0
    3.0.x 2.3.0
    2.3.x 2.0.0
    2.2.x 1.6.0
    2.1.x 1.6.0
    2.0.x 1.5.0
    1.2.x 1.3.1
    1.1.x 1.2.0

    筆者這裡使用的是hive-3.1.2,按理說應該使用spark-2.3.0作為對應,但出於業務要求需使用spark-3.1.2,故重新編譯hive-3.1.2原始碼使其適配spark-3.1.2

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

    因spark包自帶hive,其支援的版本與我們使用的版本衝突(如spark-3.1.2預設支援的hive版本為2.3.7),故我們只需spark自身即可,不需其自帶的hive模組



    兩種方式去獲得去hive的jar包

    • 從官網下載完整版的jar包,解壓後將其jars目錄下的hive相關jar包全部刪掉(本文即使用此種方法)
    • 重新編譯spark,但不指定-Phive

    注:網上部分帖子中所說使用“純淨版”,其實指的就是去hive版,而不是官方提供的without-hadoop版

下面進入正題

部署環境:CentOS 7.4 x86_64

Hive版本:3.1.2(重新編譯過,修改了Spark版本和Scala版本,替換修改了部分原始碼,如有需要後續會出編譯指導)

Spark版本:3.1.2(spark-3.1.2-bin-hadoop3.2.tgz,官網直接下載)

Hadoop版本:3.1.3(與Spark3.1.2自帶hadoop版本3.2只差一個小版本,可直接使用,不用重新編譯)

JDK版本:1.8.0_172

myql版本:5.7.32

步驟:

  1. 在機器上部署spark

解壓

tar -zxvf spark-3.1.2-bin-hadoop3.2.tgz

設定環境變數

echo '#SPARK_HOME' >> /etc/profile
echo 'export SPARK_HOME=/data/apps/spark-3.1.2-bin-hadoop3.2' >> /etc/profile
echo 'export PATH=$PATH:$SPARK_HOME/bin' >> /etc/profile

準備去hive版本的spark-jars(!!!除了hive-storage-api-2.7.2.jar這個包!!!,如果用的spark是重新編譯的且沒有指定-Phive,這步可以省略)

cd $SPARK_HOME                         //進目錄
mv jars/hive-storage-api-2.7.2.jar . //把這包先移出去
rm -rf jars/*hive* //刪
mv hive-storage-api-2.7.2.jar jars/ //再移回去

將剛做好的spark-jars上傳到hdfs

hdfs dfs -mkdir -p /spark-jars
hdfs dfs -put jars/* /spark-jars/

hdfs上建立spark-history存日誌

hdfs dfs -mkdir -p /spark-history

  1. 在機器上部署hive

解壓

tar -zxvf apache-hive-3.1.2-bin.tar.gz

注:解壓後的hive還需要一些額外的包放在lib下,比如因元資料庫換為mysql需要一個mysql-connector-java-5.1.48.jar,比如為了處理hive-3.1.2和hadoop-3.1.3中guava包版本衝突的問題需要把原lib下的guava19刪了放一個guava27,再比如為了處理slf4j包衝突問題將lib下面log4j-slf4j-impl-2.10.0.jar刪嘍,這裡都不做詳細說明(已經夠詳細了吧/doge);且這些問題都可以通過重新編譯hive解決,不過要費一番功夫

改名(非必要)

mv apache-hive-3.1.2-bin hive-3.1.2

設定環境變數

echo '#HIVE_HOME' >> /etc/profile
echo 'export HIVE_HOME=/data/apps/hive-3.1.2' >> /etc/profile
echo 'export PATH=$PATH:$HIVE_HOME/bin' >> /etc/profile

修改配置檔案

  • hive-site.xml

注:該檔案首先需要從hive-default.xml.template複製一份出來,裡面引數根據自己需要調整,這裡只講hive-on-spark需要修改或新增的引數

  <!--Spark依賴位置,上面上傳jar包的hdfs路徑-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://bdp3install:8020/spark-jars/*</value>
</property> <!--Hive執行引擎,使用spark-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property> <!--Hive連線spark-client超時時間-->
<property>
<name>hive.spark.client.connect.timeout</name>
<value>30000ms</value>
</property>

  • hive-env.sh

注:該檔案首先需要從hive-env.sh.template複製一份出來,裡面引數根據自己需要調整,這裡只講hive-on-spark需要修改或新增的引數

# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=${HADOOP_HOME:-/data/apps/hadoop-3.1.3} export HIVE_HOME=${HIVE_HOME:-/data/apps/hive-3.1.2} # Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=${HIVE_CONF_DIR:-/data/apps/hive-3.1.2/conf} export METASTORE_PORT=9083
export HIVESERVER2_PORT=10000

  • spark-default.conf

注:直接vim生成吧,不用從spark目錄再拷過來,更多的引數可以參考最上面的官方地址

spark.master             yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs://bdp3install:8020/spark-history
spark.executor.memory 4g
spark.driver.memory 4g
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.executor.cores 2
spark.yarn.driver.memoryOverhead 400m

  1. 啟動hive
cd $HIVE_HOME
nohup bin/hive --service metastore &
等metastore啟完(9083埠被監聽了) nohup bin/hive --service hiveserver2 &
等hiveserver2啟完(10000埠被監聽了)



4. 客戶端連線測試

beeline
!connect jdbc:hive2://localhost:10000 hive ""

執行一些insert,同時觀察下yarn,如果任務成功了,yarn上也有相應的application成功了,那就妥了





注:hive on spark任務是以每個spark session為單位提交到yarn的,每個yarn任務都有一次從hdfs載入spark-jars到容器中的過程,所以每次通過客戶端執行命令時,第一次執行的速度會比較慢(因為載入jars,大約有200M),後續就很快了。

常見問題:

  1. java.lang.NoClassDefFoundError: org/apache/hadoop/hive/ql/exec/vector/ColumnVector

原因:spark-jars裡少hive-storage-api-2.7.2.jar這個包



2. Could not load YARN classes. This copy of Spark may not have been compiled with YARN support.

原因:hiveserver2所在機器沒有部署spark或spark非完整版,或spark版本與hive版本不對應



3. 各種各樣的ClassNotFound,NoClassDefFoundError

原因:spark-jars不完整,一定要是去hive的完整版jar包(一般都是少hadoop的包)

此文章首發於部落格園,希望能對大家有所幫助,如有遺漏或問題歡迎補充指正。