個人主頁:http://www.linbingdong.com
簡介
本文主要記錄如何安裝配置Hive on Spark氧敢,在執(zhí)行以下步驟之前泞遗,請先確保已經(jīng)安裝Hadoop集群,Hive展懈,MySQL,JDK供璧,Scala存崖,具體安裝步驟不再贅述。
背景
Hive默認使用MapReduce作為執(zhí)行引擎睡毒,即Hive on mr来惧。實際上,Hive還可以使用Tez和Spark作為其執(zhí)行引擎演顾,分別為Hive on Tez和Hive on Spark供搀。由于MapReduce中間計算均需要寫入磁盤,而Spark是放在內(nèi)存中钠至,所以總體來講Spark比MapReduce快很多葛虐。因此,Hive on Spark也會比Hive on mr快棕洋。為了對比Hive on Spark和Hive on mr的速度挡闰,需要在已經(jīng)安裝了Hadoop集群的機器上安裝Spark集群(Spark集群是建立在Hadoop集群之上的,也就是需要先裝Hadoop集群掰盘,再裝Spark集群摄悯,因為Spark用了Hadoop的HDFS、YARN等)愧捕,然后把Hive的執(zhí)行引擎設(shè)置為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兩種模式禾进。
一豁跑、環(huán)境說明
本教程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é)點規(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
說明:Goblin01~04是每臺機器的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)上說“Note that you must have a version of Spark which does not include the Hive jars”治力。在spark官網(wǎng)下載的編譯的Spark都是有集成Hive的,因此需要自己下載源碼來編譯勃黍,并且編譯的時候不指定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 命令解壓,進入解壓完的文件夾覆获,準(zhǔn)備編譯马澈。
注意:編譯前請確保已經(jīng)安裝JDK、Maven和Scala弄息,maven為3.3.3及以上版本痊班,并在/etc/profile里配置環(huán)境變量。
命令行進入在源碼根目錄下摹量,執(zhí)行
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
若編譯過程出現(xiàn)內(nèi)存不足的情況涤伐,需要在運行編譯命令之前先運行:
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
來設(shè)置Maven的內(nèi)存。
編譯過程由于要下載很多Maven依賴的jar包缨称,需要時間較長(大概一兩個小時)凝果,要保證網(wǎng)絡(luò)狀況良好,不然很容易編譯失敗睦尽。若出現(xiàn)以下結(jié)果器净,則編譯成功:
編譯成功后,會在源碼根目錄下多出一個文件(紅色部分):
spark-1.5.0-cdh5.5.1-bin-hadoop2-without-hive.tgz
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三個文件
- 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é)點都加入朴则,master節(jié)點同時也是worker節(jié)點)
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運行模式权纤,可以是yarn-client、yarn-cluster...
spark.home指定SPARK_HOME路徑
spark.eventLog.enabled需要設(shè)為true
spark.eventLog.dir指定路徑,放在master節(jié)點的hdfs中妖碉,端口要跟hdfs設(shè)置的端口一致(默認為8020),否則會報錯
spark.executor.memory和spark.driver.memory指定executor和dirver的內(nèi)存芥被,512m或1g欧宜,既不能太大也不能太小,因為太小運行不了拴魄,太大又會影響其他服務(wù)
三冗茸、配置YARN
配置yarn-site.xml,跟hdfs-site.xml在同一個路徑下($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目錄下)
進入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文件中的,并且注意前兩個配置,如果不設(shè)置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>/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>
五、驗證是否安裝配置成功
1.驗證Spark集群
注意:在啟動Spark集群之前服赎,要確保Hadoop集群和YARN均已啟動
- 進入$SPARK_HOME目錄葵蒂,執(zhí)行:
./sbin/start-all.sh
用jps命令查看51節(jié)點上的master和worker,52重虑、53践付、54節(jié)點上的worker是否都啟動了
- 同樣在$SPARK_HOME目錄下,提交計算Pi的任務(wù)缺厉,驗證Spark集群是否能正常工作永高,運行如下命令
./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
若無報錯,并且算出Pi的值提针,說明Spark集群能正常工作
2.驗證Hive on Spark是否可用
- 命令行輸入 hive命爬,進入hive CLI
- set hive.execution.engine=spark; (將執(zhí)行引擎設(shè)為Spark,默認是mr辐脖,退出hive CLI后遇骑,回到默認設(shè)置。若想讓引擎默認為Spark揖曾,需要在hive-site.xml里設(shè)置)
- create table test(ts BIGINT,line STRING); (創(chuàng)建表)
- select count(*) from test;
- 若整個過程沒有報錯落萎,并出現(xiàn)正確結(jié)果,則Hive on Spark配置成功炭剪。
六练链、遇到的問題
0
編譯spark基于maven有兩種方式
- 用mvn 命令編譯
./build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
編譯到倒數(shù)MQTT模塊一直報錯,而且編譯出的文件比較大奴拦,不適合安裝集群媒鼓,因此不推薦。使用Intellij IDEA maven 插件報錯如下:
- 使用spark提供的預(yù)編譯腳本,網(wǎng)絡(luò)狀況穩(wěn)定绿鸣,會編譯出需要的安裝版本疚沐,推薦。命令
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
結(jié)果如上文所述潮模。
1
運行:
./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
報錯:
原因:
hdfs的默認端口為8020 亮蛔,而我們在spark-default.conf中配置成了8021端口,導(dǎo)致連接不上HDFS報錯
spark.eventLog.enabled true
spark.eventLog.dir hdfs://Goblin01:8021/spark-log
解決:
配置spark-default.conf中的spark.eventLog.dir 為本地路徑擎厢,也就是不持久化日志到hdfs上究流,也就沒有和hdfs的通行
or
spark-default.conf 注釋掉 spark.eventLog.enabled true
or
在spark-default.conf里配置的eventLog端口跟hdfs的默認端口(8020)一致
or
由于配置的hdfs是高可用的,51,52都可以作為namenode,我們的spark集群的主節(jié)點在51上动遭,當(dāng)51上的namenode變成standby芬探,導(dǎo)致無法訪問hdfs的8020端口(hdfs默認端口),也就是說在51上讀不出hdfs上spark-log的內(nèi)容厘惦,在spark-default.conf中配置為spark.eventLog.dir hdfs://Goblin01:8021/spark-log偷仿,如果發(fā)生這種情況,直接kill掉52宵蕉,讓namenode只在51上運行炎疆。(這個后面要搭建spark的高可用模式解決)
2
運行:
在hive里設(shè)置引擎為spark,執(zhí)行select count(*) from a;
報錯:
Failed to execute spark task, with exception 'org.apache.hadoop.hive.ql.metadata.HiveException(Unsupported execution engine: Spark. Please set hive.execution.engine=mr)'
解決:
這是因為CDH版的Hive默認運行支持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添加配置(簡單缝左、推薦)
<property>
<name>hive.enable.spark.execution.engine</name>
<value>true</value>
</property>
3
終端輸入hive無法啟動hive CLI
原因:namenode掛了
解決:重啟namenode
4
運行:
./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
問題:
沒有報錯亿遂,但是出現(xiàn)以下情況,停不下來
原因:
- ResourceManager或者NodeManager掛掉渺杉,一直沒有NodeManager響應(yīng)蛇数,任務(wù)無法執(zhí)行,所有停不下來是越。
- 還有一種情況是spark有別的application在運行耳舅,導(dǎo)致本次spark任務(wù)的等待或者失敗
解決:
- 對于原因1,重啟ResourceManager和NodeManager倚评。
service hadoop-yarn-resourcemanager start;
service hadoop-yarn-nodemanager start;
- 對于原因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>
參考資料
- https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark:+Getting+Started
- http://www.cloudera.com/documentation/enterprise/5-5-x/topics/admin_hos_config.html
- http://spark.apache.org/docs/latest/building-spark.html
- http://stackoverflow.com/questions/31743586/apache-spark-running-locally-giving-refused-connection-error
- http://stackoverflow.com/questions/30828879/application-report-for-application-state-accepted-never-ends-for-spark-submi
- http://www.voidcn.com/blog/tianyiii/article/p-5986990.html
- http://www.imooc.com/article/8613
- http://lxw1234.com/archives/2016/05/673.htm
可進入我的博客查看原文
歡迎關(guān)注公眾號: FullStackPlan 獲取更多干貨哦~