Hive on Spark安裝配置詳解及避坑指南

個(gè)人主頁(yè):http://www.linbingdong.com

簡(jiǎn)介

本文主要記錄如何安裝配置Hive on Spark,在執(zhí)行以下步驟之前,請(qǐng)先確保已經(jīng)安裝Hadoop集群,Hive,MySQL,JDK,Scala,具體安裝步驟不再贅述。

背景

Hive默認(rèn)使用MapReduce作為執(zhí)行引擎,即Hive on mr。實(shí)際上,Hive還可以使用Tez和Spark作為其執(zhí)行引擎,分別為Hive on Tez和Hive on Spark。由于MapReduce中間計(jì)算均需要寫(xiě)入磁盤(pán),而Spark是放在內(nèi)存中,所以總體來(lái)講Spark比MapReduce快很多。因此,Hive on Spark也會(huì)比Hive on mr快。為了對(duì)比Hive on Spark和Hive on mr的速度,需要在已經(jīng)安裝了Hadoop集群的機(jī)器上安裝Spark集群(Spark集群是建立在Hadoop集群之上的,也就是需要先裝Hadoop集群,再裝Spark集群,因?yàn)镾park用了Hadoop的HDFS、YARN等),然后把Hive的執(zhí)行引擎設(shè)置為Spark。

Spark運(yùn)行模式分為三種1、Spark on YARN 2、Standalone Mode 3、Spark on Mesos。
Hive on Spark默認(rèn)支持Spark on YARN模式,因此我們選擇Spark on YARN模式。Spark on YARN就是使用YARN作為Spark的資源管理器。分為Cluster和Client兩種模式。

一、環(huán)境說(shuō)明

本教程Hadoop相關(guān)軟件全部基于CDH5.5.1,用yum安裝,系統(tǒng)環(huán)境如下:

  • 操作系統(tǒng):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

各節(jié)點(diǎn)規(guī)劃如下:

192.168.117.51     Goblin01           nn1  jn1  rm1  worker  master  hive  metastore  mysql
192.168.117.52     Goblin02    zk2    nn2  jn2  rm2  worker          hive
192.168.117.53     Goblin03    zk3    dn1  jn3       worker          hive
192.168.117.54     Goblin04    zk4    dn2            worker          hive

說(shuō)明:Goblin01~04是每臺(tái)機(jī)器的hostname,zk代表zookeeper,nn代表hadoop的namenode,dn代表datanode,jn代表journalnode,rm代表resourcemanager,worker代表Spark的slaves,master代表Spark的master

二、編譯和安裝Spark(Spark on YARN)

2.1 編譯Spark源碼

要使用Hive on Spark,所用的Spark版本必須不包含Hive的相關(guān)jar包,hive on spark 的官網(wǎng)上說(shuō)“Note that you must have a version of Spark which does not include the Hive jars”。在spark官網(wǎng)下載的編譯的Spark都是有集成Hive的,因此需要自己下載源碼來(lái)編譯,并且編譯的時(shí)候不指定Hive。

我們這里用的Spark源碼是spark-1.5.0-cdh5.5.1版本,下載地址如下:

http://archive.cloudera.com/cdh5/cdh/5/spark-1.5.0-cdh5.5.1-src.tar.gz

下載完后用 tar xzvf 命令解壓,進(jìn)入解壓完的文件夾,準(zhǔn)備編譯。

注意:編譯前請(qǐng)確保已經(jīng)安裝JDK、Maven和Scala,maven為3.3.3及以上版本,并在/etc/profile里配置環(huán)境變量。

命令行進(jìn)入在源碼根目錄下,執(zhí)行

  ./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"

若編譯過(guò)程出現(xiàn)內(nèi)存不足的情況,需要在運(yùn)行編譯命令之前先運(yùn)行:

export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

來(lái)設(shè)置Maven的內(nèi)存。

編譯過(guò)程由于要下載很多Maven依賴的jar包,需要時(shí)間較長(zhǎng)(大概一兩個(gè)小時(shí)),要保證網(wǎng)絡(luò)狀況良好,不然很容易編譯失敗。若出現(xiàn)以下結(jié)果,則編譯成功:

編譯成功.jpg

編譯成功后,會(huì)在源碼根目錄下多出一個(gè)文件(紅色部分):

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

編譯完生成的文件.png

2.2 安裝Spark

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

  • 配置環(huán)境變量

    $vim /etc/profile
    export SPARK_HOME=spark安裝路徑
    $source /etc/profile
    

2.3 配置Spark

配置spark-env.sh、slaves和spark-defaults.conf三個(gè)文件

  • spark-env.sh

主要配置JAVA\_HOME、SCALA\_HOME、HADOOP\_HOME、HADOOP\_CONF\_DIR、SPARK\_MASTER\_IP等

export JAVA_HOME=/usr/lib/jvm/java
export SCALA_HOME=/root/scala
export HADOOP_HOME=/usr/lib/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop 
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_LAUNCH_WITH_SCALA=0
export SPARK_WORKER_MEMORY=1g
export SPARK_DRIVER_MEMORY=1g
export SPARK_MASTER_IP=192.168.117.51
export SPARK_LIBRARY_PATH=/root/spark-without-hive/lib
export SPARK_MASTER_WEBUI_PORT=18080
export SPARK_WORKER_DIR=/root/spark-without-hive/work
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_PORT=7078
export SPARK_LOG_DIR=/root/spark-without-hive/log
export SPARK_PID_DIR='/root/spark-without-hive/run'
  • slaves(將所有節(jié)點(diǎn)都加入,master節(jié)點(diǎn)同時(shí)也是worker節(jié)點(diǎn))
Goblin01
Goblin02
Goblin03
Goblin04
  • spark-defaults.conf
 spark.master                     yarn-cluster
 spark.home                       /root/spark-without-hive
 spark.eventLog.enabled           true
 spark.eventLog.dir               hdfs://Goblin01:8020/spark-log
 spark.serializer                 org.apache.spark.serializer.KryoSerializer
 spark.executor.memory            1g
 spark.driver.memory              1g
 spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

spark.master指定Spark運(yùn)行模式,可以是yarn-client、yarn-cluster...

spark.home指定SPARK_HOME路徑

spark.eventLog.enabled需要設(shè)為true

spark.eventLog.dir指定路徑,放在master節(jié)點(diǎn)的hdfs中,端口要跟hdfs設(shè)置的端口一致(默認(rèn)為8020),否則會(huì)報(bào)錯(cuò)

spark.executor.memory和spark.driver.memory指定executor和dirver的內(nèi)存,512m或1g,既不能太大也不能太小,因?yàn)樘∵\(yùn)行不了,太大又會(huì)影響其他服務(wù)

三、配置YARN

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

<property>
  <name>yarn.resourcemanager.scheduler.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

四、配置Hive

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

進(jìn)入SPARK\_HOME

cp spark-assembly-1.5.0-cdh5.5.1-hadoop2.6.0.jar /usr/lib/hive/lib
  • 配置hive-site.xml

配置的內(nèi)容與spark-defaults.conf相同,只是形式不一樣,以下內(nèi)容是追加到hive-site.xml文件中的,并且注意前兩個(gè)配置,如果不設(shè)置hive的spark引擎用不了,在后面會(huì)有詳細(xì)的錯(cuò)誤說(shuō)明。


<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>/root/spark-without-hive</value>
</property>
<property>
  <name>spark.master</name>
  <value>yarn-client</value>
</property>
<property>
  <name>spark.enentLog.enabled</name>
  <value>true</value>
</property>
<property>
  <name>spark.enentLog.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>

五、驗(yàn)證是否安裝配置成功

1.驗(yàn)證Spark集群

注意:在啟動(dòng)Spark集群之前,要確保Hadoop集群和YARN均已啟動(dòng)

  • 進(jìn)入$SPARK_HOME目錄,執(zhí)行:
./sbin/start-all.sh

用jps命令查看51節(jié)點(diǎn)上的master和worker,52、53、54節(jié)點(diǎn)上的worker是否都啟動(dòng)了

  • 同樣在$SPARK_HOME目錄下,提交計(jì)算Pi的任務(wù),驗(yàn)證Spark集群是否能正常工作,運(yùn)行如下命令
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client lib/spark-examples-1.5.0-cdh5.5.1-hadoop2.6.0.jar 10

若無(wú)報(bào)錯(cuò),并且算出Pi的值,說(shuō)明Spark集群能正常工作

2.驗(yàn)證Hive on Spark是否可用

  • 命令行輸入 hive,進(jìn)入hive CLI
  • set hive.execution.engine=spark; (將執(zhí)行引擎設(shè)為Spark,默認(rèn)是mr,退出hive CLI后,回到默認(rèn)設(shè)置。若想讓引擎默認(rèn)為Spark,需要在hive-site.xml里設(shè)置)
  • create table test(ts BIGINT,line STRING); (創(chuàng)建表)
  • select count(*) from test;
  • 若整個(gè)過(guò)程沒(méi)有報(bào)錯(cuò),并出現(xiàn)正確結(jié)果,則Hive on Spark配置成功。

六、遇到的問(wèn)題

0

編譯spark基于maven有兩種方式

  • 用mvn 命令編譯
./build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package 

編譯到倒數(shù)MQTT模塊一直報(bào)錯(cuò),而且編譯出的文件比較大,不適合安裝集群,因此不推薦。使用Intellij IDEA maven 插件報(bào)錯(cuò)如下:

spark-build-fail.png
  • 使用spark提供的預(yù)編譯腳本,網(wǎng)絡(luò)狀況穩(wěn)定,會(huì)編譯出需要的安裝版本,推薦。命令
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"

結(jié)果如上文所述。

1

運(yùn)行:

./bin/spark-submit --class org.apache.spark.examples.SparkPi  --master yarn  lib/spark-examples-1.5.0-cdh5.5.1-hadoop2.6.0.jar 10

報(bào)錯(cuò):

spark-fail.png

原因:

hdfs的默認(rèn)端口為8020 ,而我們?cè)趕park-default.conf中配置成了8021端口,導(dǎo)致連接不上HDFS報(bào)錯(cuò)

spark.eventLog.enabled           true
spark.eventLog.dir              hdfs://Goblin01:8021/spark-log

解決:

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

or

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

or

在spark-default.conf里配置的eventLog端口跟hdfs的默認(rèn)端口(8020)一致

or

由于配置的hdfs是高可用的,51,52都可以作為namenode,我們的spark集群的主節(jié)點(diǎn)在51上,當(dāng)51上的namenode變成standby,導(dǎo)致無(wú)法訪問(wèn)hdfs的8020端口(hdfs默認(rèn)端口),也就是說(shuō)在51上讀不出hdfs上spark-log的內(nèi)容,在spark-default.conf中配置為spark.eventLog.dir hdfs://Goblin01:8021/spark-log,如果發(fā)生這種情況,直接kill掉52,讓namenode只在51上運(yùn)行。(這個(gè)后面要搭建spark的高可用模式解決)

2

運(yùn)行:

在hive里設(shè)置引擎為spark,執(zhí)行select count(*) from a;

報(bào)錯(cuò):

Failed to execute spark task, with exception 'org.apache.hadoop.hive.ql.metadata.HiveException(Unsupported execution engine: Spark. Please set hive.execution.engine=mr)'

解決:

這是因?yàn)镃DH版的Hive默認(rèn)運(yùn)行支持Hive on Spark(By default, Hive on Spark is not enabled).

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

Go to the Hive service.
Click the Configuration tab.
Enter Enable Hive on Sparkin the Search field.
Check the box for Enable Hive on Spark (Unsupported).
Locate the Spark On YARN Service and click SPARK_ON_YARN.
Click Save Changes to commit the changes.

或者

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

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

3

終端輸入hive無(wú)法啟動(dòng)hive CLI

原因:namenode掛了

解決:重啟namenode

4

運(yùn)行:

./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client lib/spark-examples-1.5.0-cdh5.5.1-hadoop2.6.0.jar 10

問(wèn)題:

沒(méi)有報(bào)錯(cuò),但是出現(xiàn)以下情況,停不下來(lái)

停不下來(lái).png

原因:

  1. ResourceManager或者NodeManager掛掉,一直沒(méi)有NodeManager響應(yīng),任務(wù)無(wú)法執(zhí)行,所有停不下來(lái)。
  2. 還有一種情況是spark有別的application在運(yùn)行,導(dǎo)致本次spark任務(wù)的等待或者失敗

解決:

  1. 對(duì)于原因1,重啟ResourceManager和NodeManager。
service hadoop-yarn-resourcemanager start;
service hadoop-yarn-nodemanager start;
  1. 對(duì)于原因2,解決辦法是在hadoop配置文件中設(shè)置yarn的并行度,在/etc/hadoop/conf/capacity-scheduler.xml文件中配置yarn.scheduler.capacity.maximum-am-resource-percent from 0.1 to 0.5
 <property>
    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
    <value>0.5</value>
    <description>
      Maximum percent of resources in the cluster which can be used to run
      application masters i.e. controls number of concurrent running
      applications.
    </description>
  </property>

參考資料

可進(jìn)入我的博客查看原文

FullStackPlan

歡迎關(guān)注公眾號(hào): FullStackPlan 獲取更多干貨哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,505評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,017評(píng)論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,786評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,219評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,438評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,796評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,995評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,230評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,918評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,697評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容