1. 程式人生 > >偽分散式Spark + Hive on Spark搭建

偽分散式Spark + Hive on Spark搭建

  Spark大資料平臺有使用一段時間了,但大部分都是用於實驗而搭建起來用的,搭建過Spark完全分散式,也搭建過用於測試的偽分散式。現在是寫一遍隨筆,記錄一下曾經搭建過的環境,免得以後自己忘記了。也給和初學者以及曾經挖過坑的人用作參考。

   Hive on Spark是Hive跑在Spark上,用的是Spark執行引擎,而不是預設的MapReduce。

  可以查閱官網的資源Hive on Spark: Getting Started。

一 、安裝基礎環境

1.1 Java1.8環境搭建

  1) 下載jdk1.8並解壓:

# tar -zxvf  jdk-8u201-linux-i586.tar.gz  -C /usr/local

  2) 新增Java環境變數,在/etc/profile中新增:

export JAVA_HOME=/usr/local/jdk1.8.0_201 
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

  3) 儲存後重新整理環境變數:

# source /etc/profile

  4) 檢查Java是否配置成功,成功配置會有如下圖所示。

# java -version

 

1.2 Scala環境搭建 

  1)下載Scala安裝包並解壓

# tar -zxf scala-2.11.12.tgz -C /usr/local

  2) 新增Scala環境變數,在/etc/profile中新增:

export SCALA_HOME=/usr/local/scala-2.11.12
export PATH=${SCALA_HOME}/bin:$PATH

  3) 儲存後重新整理環境變數

# source /etc/profile

  4) 檢查Scala是否配置成功,成功配置會有如下圖所示。

# scala -version

 

1.3 Maven安裝

  1)下載安裝Maven

# tar -zxf  apache-maven-3.6.1-bin.tar.gz -C /usr/local

  2)新增到環境變數中

export MAVEN_HOME=/usr/local/maven-3.6.1
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH 

  3) 儲存後重新整理環境變數

# source /etc/profile

  4)檢查Maven是否配置成功,成功配置會有如下圖所示

# mvn -version

  5)更換中央倉庫映象為阿里雲中央倉庫映象

# vim /usr/local/maven-3.6.1/conf/settings.xml

  找到mirrors元素, 在它裡面新增子元素mirror:

   <!-- 阿里雲中央倉庫 -->
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>

  新增結果如下: 

 

 

 二、Spark2.3.3原始碼編譯

   由官方文件可知Hive on Spark只使用特定版本的Spark進行測試,所以給定版本的Hive只能保證使用特定版本的Spark。其他版本的Spark可能適用於給定版本的Hive,但這並不能保證。下面是Hive版本及其相應的相容Spark版本的列表。

  在本文中,小編搭建的版本為:Hive 3.1.1,Spark 2.3.3,在這裡預設Hive已經成功安裝好。

  1)下載並解壓Spark原始碼

# wget https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.3.3/spark-2.3.3.tgz   
# tar -zxf spark-2.3.3.tgz

  2)編譯Spark原始碼

  下面是參考Spark官方文件給出的教程而定製的命令,因為Spark要結合Hadoop(偽分散式Hadoop部署可以參考我之前的文件)與Hive一起使用,下面命令是Spark自帶的Maven編譯的指令碼:

# ./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided,orc-provided"

   也可以直接通過Maven命令進行編譯:

# ./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package

  出現下圖所示也就代表著編譯成功:

  將編譯後的Spark壓縮包解壓到/usr/local路徑並改名:

# tar -zxf spark-2.3.3-bin-hadoop2-without-hive.tgz -C  /usr/local
# mv spark-2.3.3-bin-hadoop2-without-hive spark-2.3.3

  3)配置偽分散式Spark

  配置SPARK_HOME環境變數後並重新整理:

export SPARK_HOME=/usr/local/spark-2.3.3
export PATH=$PATH:$SPARK_HOME/bin

  進入Spark根目錄下conf目錄並生成slaves檔案:

# cd $SPARK_HOME/conf
# cp slaves.template slaves  //複製模板生成slaves檔案,偽分散式不用修改該檔案

  接下來修改spark-env.sh檔案,修改前先複製後重命名:

# cp spark-env.sh.template spark-env.sh
# vim spark-env.sh

  新增如下內容:

export JAVA_HOME=/usr/local/jdk1.8.0_201
export SCALA_HOME=/usr/local/scala-2.11.12
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_WORKER_MEMORY=2048m
export SPARK_MASTER_IP=hadoop
export SPARK_WORKER_CORES=2
export SPARK_HOME=/usr/local/spark-2.3.3
export SPARK_LIBRARY_PATH=/usr/local/spark-2.3.3/lib
export SPARK_DIST_CLASSPATH=${hadoop classpath} //hadoop classpath在終端上輸入即可檢視

  

  4)啟動Spark

  第一步,啟動之前要保證Hadoop啟動成功,先使用jps看下程序資訊:

  

  五個程序都啟動並沒有自動斷開,說明Hadoop啟動成功。

  第二步,啟動Spark:

     進入Spark的sbin目錄下執行start-all.sh啟動Spark,啟動後,通過jps檢視最新的程序資訊:

   

  訪問http://ip:8080

  

  從頁面可以看到一個Worker節點資訊。

  通過訪問http://ip:4040進入spark-shell web控制檯頁面(需先使用命令./bin/spark-shell啟動SparkContext),出現下面的Web介面資訊:

  

  如果某臺機器上執行多個SparkContext,它的Web埠會自動連續加一,例如4041,4042,4043等。為了瀏覽持久的事件日誌,設定spark.eventLog.enabled就可以了。

  5)驗證Spark是否配置成功

  注意:在啟動Spark之前,要確保Hadoop叢集和YARN均已啟動

    • 在$SPARK_HOME目錄下啟動Spark:
# $SPARK_HOME/sbin/start-all.sh
    • 在$SPARK_HOME目錄下,提交計算Pi的任務,驗證Spark是否能正常工作,執行如下命令:
# ./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client ./examples/jars/spark-examples_2.11-2.3.3.jar 10

  若無報錯,並且算出Pi的值,說明Spark叢集能正常工作。

  

  6)關閉Spark

  進入Spark目錄,執行:

# cd $SPARK_HOME
# ./sbin/stop-all.sh

  7)關閉Hadoop

  進入Hadoop目錄,執行:

# cd $HADOOP_HOME
# ./sbin/stop-yarn.sh
# ./sbin/stop-dfs.sh

  (./sbin/stop-all.sh也可以執行上述的操作,但有警告該命令已被丟棄,應使用上面的兩個命令代替)

 

 三、Hive on Spark

  1)將編譯好的Spark依賴新增到$HIVE_HOME/lib目錄下

# cp $SPARK_HOME/jars/* $HIVE_HOME/lib

  2)配置hive-site.xml

   配置的內容與spark-defaults.conf相同,只是形式不一樣,以下內容是追加到hive-site.xml檔案中的,並且注意前兩個配置,如果不設定hive的spark引擎用不了,在後面會有詳細的錯誤說明。

<property>
  <name>hive.execution.engine</name>
  <value>spark</value>
</property>

<property>
  <name>hive.enable.spark.execution.engine</name>
  <value>true</value>
</property>
<property> <name>spark.home</name> <value>/usr/local/spark-2.3.1-bin-hadoop2.7</value> </property> <property> <name>spark.master</name> <value>yarn-client</value> </property> <property> <name>spark.eventLog.enabled</name> <value>true</value> </property> <property> <name>spark.eventLog.dir</name> <value>hdfs://Goblin01:8020/spark-log</value> </property> <property> <name>spark.serializer</name> <value>org.apache.spark.serializer.KryoSerializer</value> </property> <property> <name>spark.executor.memeory</name> <value>1g</value> </property> <property> <name>spark.driver.memeory</name> <value>1g</value> </property> <property> <name>spark.executor.extraJavaOptions</name> <value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"</value> </property>

   3)驗證Hive on Spark是否可用

   命令列輸入hive,進入hive CLI:

  

  set hive.execution.engine=spark; (將執行引擎設為Spark,預設是mr,退出hive CLI後,會回滾到預設設定。若想讓執行引擎預設為Spark,需要在hive-site.xml裡設定)

  接下來執行一條建立測試表語句:

hive> create table test(ts BIGINT,line STRING); 

  然後執行一條查詢語句:

hive> select count(*) from test;

  

  若上述整個過程都沒有報錯,並出現正確結果,則Hive on Spark搭建成功。

 

 四、遇到的問題

1. get rid of POM not found warning for org.eclipse.m2e:lifecycle-mapping

  stackoverflow印度阿三們的解決方案已成功解決上述的問題:參考網址:https://stackoverflow.com/questions/7905501/get-rid-of-pom-not-found-warning-for-org-eclipse-m2elifecycle-mapping/

2. Failed to execute goal net.alchim31.maven:scala-maven-plugin:3.2.2:testCompile

  這報錯主要出現在Spark-SQL編譯出錯,原因在maven本地倉庫中scala依賴衝突,第一次編譯的時候沒有配置scala版本,預設用了2.10版本,這次是編譯成功的,但後面再編譯的時候,我選擇了2.11版本,然後在spark-sql模組編譯失敗,然後去google找解決方案,連結如下所示: https://github.com/davidB/scala-maven-plugin/issues/215

  通過以下命令刪除maven本地倉庫(預設路徑)的scala依賴:

# rm -r ~/.m2/repository/org/scala-lang/scala-reflect/2.1*

  如果編譯還無法成功,則在原始碼根目錄pom.xml檔案新增依賴:

<dependency>
    <groupId>net.alchim31.maven</groupId>
  <artifactId>scala-maven-plugin</artifactId>
    <version>3.2.0</version>
</dependency>

3. Error: A JNI error has occurred, please check your installation and try again

  原因:啟動編譯好的Spark,出現如上的錯誤,是因為沒有在spark-env.sh匯入hadoop classpath

  解決方案:在shell終端上輸入hadoop classpath:

  然後再spark-env.sh新增上去:

 4. 啟動Hive時報錯,缺少spark-assembly-*.jar

  

  其主要的原因是:在hive.sh的檔案中,發現了這樣的命令,原來初始當spark存在的時候,進行spark中相關的JAR包的載入。而自從spark升級到2.0.0之後,原有的lib的整個大JAR包已經被分散的小JAR包的替代,所以肯定沒有辦法找到這個spark-assembly的JAR包。這就是問題所在。

  

  解決方案:將這個spark-assembly-*.jar`替換成jars/*.jar,就不會出現這樣的問題。

   

 

 參考資料:http://spark.apache.org/docs/2.3.3/building-spark.html

        https://www.cnblogs.com/xinfang520/p/7763328.html

        https://blog.csdn.net/m0_37065162/article/details/81015096

        https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Sta