天天看點

Hive on Spark安裝配置詳解

本文主要記錄如何安裝配置hive on spark,在執行以下步驟之前,請先確定已經安裝hadoop叢集,hive,mysql,jdk,scala,具體安裝步驟不再贅述。

hive預設使用mapreduce作為執行引擎,即hive on mr。實際上,hive還可以使用tez和spark作為其執行引擎,分别為hive on tez和hive on spark。由于mapreduce中間計算均需要寫入磁盤,而spark是放在記憶體中,是以總體來講spark比mapreduce快很多。是以,hive on spark也會比hive on mr快。為了對比hive on spark和hive on mr的速度,需要在已經安裝了hadoop叢集的機器上安裝spark叢集(spark叢集是建立在hadoop叢集之上的,也就是需要先裝hadoop叢集,再裝spark叢集,因為spark用了hadoop的hdfs、yarn等),然後把hive的執行引擎設定為spark。

spark運作模式分為三種1、spark on yarn 2、standalone mode 3、spark on mesos。

hive on spark預設支援spark on yarn模式,是以我們選擇spark on yarn模式。spark on yarn就是使用yarn作為spark的資料總管。分為cluster和client兩種模式。

本教程hadoop相關軟體全部基于cdh5.5.1,用yum安裝,系統環境如下:

作業系統:centos 7.2

hadoop 2.6.0

hive1.1.0

spark1.5.0

mysql 5.6

jdk 1.8

maven 3.3.3

scala 2.10

各節點規劃如下:

說明:goblin01~04是每台機器的hostname,zk代表zookeeper,nn代表hadoop的namenode,dn代表datanode,jn代表journalnode,rm代表resourcemanager,worker代表spark的slaves,master代表spark的master

要使用hive on spark,所用的spark版本必須不包含hive的相關jar包,hive on spark 的官網上說“note that you must have a version of spark which does not include the hive jars”。在spark官網下載下傳的編譯的spark都是有內建hive的,是以需要自己下載下傳源碼來編譯,并且編譯的時候不指定hive。

我們這裡用的spark源碼是spark-1.5.0-cdh5.5.1版本,下載下傳位址如下:

<a href="http://archive.cloudera.com/cdh5/cdh/5/spark-1.5.0-cdh5.5.1-src.tar.gz">http://archive.cloudera.com/cdh5/cdh/5/spark-1.5.0-cdh5.5.1-src.tar.gz</a>

下載下傳完後用 tar xzvf 指令解壓,進入解壓完的檔案夾,準備編譯。

注意:編譯前請確定已經安裝jdk、maven和scala,maven為3.3.3及以上版本,并在/etc/profile裡配置環境變量。

指令行進入在源碼根目錄下,執行

若編譯過程出現記憶體不足的情況,需要在運作編譯指令之前先運作:

來設定maven的記憶體。

編譯過程由于要下載下傳很多maven依賴的jar包,需要時間較長(大概一兩個小時),要保證網絡狀況良好,不然很容易編譯失敗。若出現以下結果,則編譯成功:

Hive on Spark安裝配置詳解

編譯成功後,會在源碼根目錄下多出一個檔案(紅色部分):

spark-1.5.0-cdh5.5.1-bin-hadoop2-without-hive.tgz

Hive on Spark安裝配置詳解

将編譯完生成的spark-1.5.0-cdh5.5.1-bin-hadoop2-without-hive.tgz拷貝到spark的安裝路徑,并用 tar -xzvf 指令解壓

配置環境變量

配置spark-env.sh、slaves和spark-defaults.conf三個檔案

spark-env.sh

主要配置java\_home、scala\_home、hadoop\_home、hadoop\_conf\_dir、spark\_master\_ip等

slaves(将所有節點都加入,master節點同時也是worker節點)

spark-defaults.conf

spark.master指定spark運作模式,可以是yarn-client、yarn-cluster...

spark.home指定spark_home路徑

spark.eventlog.enabled需要設為true

spark.eventlog.dir指定路徑,放在master節點的hdfs中,端口要跟hdfs設定的端口一緻(預設為8020),否則會報錯

spark.executor.memory和spark.driver.memory指定executor和dirver的記憶體,512m或1g,既不能太大也不能太小,因為太小運作不了,太大又會影響其他服務

配置yarn-site.xml,跟hdfs-site.xml在同一個路徑下($hadoop_home/etc/hadoop)

添加spark依賴到hive(将spark-assembly-1.5.0-cdh5.5.1-hadoop2.6.0.jar拷貝到$hive\_home/lib目錄下)

進入spark\_home

配置hive-site.xml

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

注意:在啟動spark叢集之前,要確定hadoop叢集和yarn均已啟動

進入$spark_home目錄,執行:

用jps指令檢視51節點上的master和worker,52、53、54節點上的worker是否都啟動了

同樣在$spark_home目錄下,送出計算pi的任務,驗證spark叢集是否能正常工作,運作如下指令

若無報錯,并且算出pi的值,說明spark叢集能正常工作

指令行輸入 hive,進入hive cli

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

create table test(ts bigint,line string); (建立表)

select count(*) from test;

若整個過程沒有報錯,并出現正确結果,則hive on spark配置成功。

編譯spark基于maven有兩種方式

用mvn 指令編譯

編譯到倒數mqtt子產品一直報錯,而且編譯出的檔案比較大,不适合安裝叢集,是以不推薦。使用intellij idea maven 插件報錯如下:

Hive on Spark安裝配置詳解

使用spark提供的預編譯腳本,網絡狀況穩定,會編譯出需要的安裝版本,推薦。指令

結果如上文所述。

運作:

報錯:

Hive on Spark安裝配置詳解

原因:

hdfs的預設端口為8020 ,而我們在spark-default.conf中配置成了8021端口,導緻連接配接不上hdfs報錯

解決:

配置spark-default.conf中的spark.eventlog.dir 為本地路徑,也就是不持久化日志到hdfs上,也就沒有和hdfs的通行

or

spark-default.conf 注釋掉 spark.eventlog.enabled   true

在spark-default.conf裡配置的eventlog端口跟hdfs的預設端口(8020)一緻

由于配置的hdfs是高可用的,51,52都可以作為namenode,我們的spark叢集的主節點在51上,當51上的namenode變成standby,導緻無法通路hdfs的8020端口(hdfs預設端口),也就是說在51上讀不出hdfs上spark-log的内容,在spark-default.conf中配置為spark.eventlog.dir hdfs://goblin01:8021/spark-log,如果發生這種情況,直接kill掉52,讓namenode隻在51上運作。(這個後面要搭建spark的高可用模式解決)

在hive裡設定引擎為spark,執行select count(*) from a; 

這是因為cdh版的hive預設運作支援hive on spark(by default, hive on spark is not enabled).

需要用cloudera manager(cloudera官網給的的方法,但是要裝cloudera manager,比較麻煩,不建議)

或者

在hive-site.xml添加配置(簡單、推薦)

終端輸入hive無法啟動hive cli

原因:namenode挂了

解決:重新開機namenode

問題:

沒有報錯,但是出現以下情況,停不下來

Hive on Spark安裝配置詳解

resourcemanager或者nodemanager挂掉,一直沒有nodemanager響應,任務無法執行,所有停不下來。

還有一種情況是spark有别的application在運作,導緻本次spark任務的等待或者失敗

對于原因1,重新開機resourcemanager和nodemanager。

對于原因2,解決辦法是在hadoop配置檔案中設定yarn的并行度,在<code>/etc/hadoop/conf/capacity-scheduler.xml</code>檔案中配置yarn.scheduler.capacity.maximum-am-resource-percent from 0.1 to 0.5

<a href="https://cwiki.apache.org/confluence/display/hive/hive+on+spark:+getting+started">https://cwiki.apache.org/confluence/display/hive/hive+on+spark:+getting+started</a>

<a href="http://www.cloudera.com/documentation/enterprise/5-5-x/topics/admin_hos_config.html">http://www.cloudera.com/documentation/enterprise/5-5-x/topics/admin_hos_config.html</a>

<a href="http://spark.apache.org/docs/latest/building-spark.html">http://spark.apache.org/docs/latest/building-spark.html</a>

<a href="http://stackoverflow.com/questions/31743586/apache-spark-running-locally-giving-refused-connection-error">http://stackoverflow.com/questions/31743586/apache-spark-running-locally-giving-refused-connection-error</a>

<a href="http://stackoverflow.com/questions/30828879/application-report-for-application-state-accepted-never-ends-for-spark-submi">http://stackoverflow.com/questions/30828879/application-report-for-application-state-accepted-never-ends-for-spark-submi</a>

<a href="http://www.voidcn.com/blog/tianyiii/article/p-5986990.html">http://www.voidcn.com/blog/tianyiii/article/p-5986990.html</a>

<a href="http://www.imooc.com/article/8613">http://www.imooc.com/article/8613</a>

<a href="http://lxw1234.com/archives/2016/05/673.htm">http://lxw1234.com/archives/2016/05/673.htm</a>

Hive on Spark安裝配置詳解