我的主頁:http://www.linbingdong.com
簡書地址:http://www.jianshu.com/p/a7f75b868568html
本文主要記錄如何安裝配置Hive on Spark,在執行如下步驟以前,請先確保已經安裝Hadoop集羣,Hive,MySQL,JDK,Scala,具體安裝步驟再也不贅述。java
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。node
Spark運行模式分爲三種一、Spark on YARN 二、Standalone Mode 三、Spark on Mesos。
Hive on Spark默認支持Spark on YARN模式,所以咱們選擇Spark on YARN模式。Spark on YARN就是使用YARN做爲Spark的資源管理器。分爲Cluster和Client兩種模式。mysql
本教程Hadoop相關軟件所有基於CDH5.5.1,用yum安裝,系統環境以下:sql
各節點規劃以下:apache
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的mastervim
要使用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版本,下載地址以下:app
http://archive.cloudera.com/cdh5/cdh/5/spark-1.5.0-cdh5.5.1-src.tar.gzyii
下載完後用 tar xzvf 命令解壓,進入解壓完的文件夾,準備編譯。
注意:編譯前請確保已經安裝JDK、Maven和Scala,maven爲3.3.3及以上版本,並在/etc/profile裏配置環境變量。
命令行進入在源碼根目錄下,執行
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
若編譯過程出現內存不足的狀況,須要在運行編譯命令以前先運行:
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
來設置Maven的內存。
編譯過程因爲要下載不少Maven依賴的jar包,須要時間較長(大概一兩個小時),要保證網絡情況良好,否則很容易編譯失敗。若出現如下結果,則編譯成功:
編譯成功後,會在源碼根目錄下多出一個文件(紅色部分):
spark-1.5.0-cdh5.5.1-bin-hadoop2-without-hive.tgz
將編譯完生成的spark-1.5.0-cdh5.5.1-bin-hadoop2-without-hive.tgz拷貝到Spark的安裝路徑,並用 tar -xzvf 命令解壓
配置環境變量
$vim /etc/profile export SPARK_HOME=spark安裝路徑 $source /etc/profile
配置spark-env.sh、slaves和spark-defaults.conf三個文件
主要配置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'
Goblin01 Goblin02 Goblin03 Goblin04
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須要設爲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)
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property>
進入SPARK_HOME
cp spark-assembly-1.5.0-cdh5.5.1-hadoop2.6.0.jar /usr/lib/hive/lib
配置的內容與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>/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>
注意:在啓動Spark集羣以前,要確保Hadoop集羣和YARN均已啓動
./sbin/start-all.sh
用jps命令查看51節點上的master和worker,5二、5三、54節點上的worker是否都啓動了
./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集羣能正常工做
編譯spark基於maven有兩種方式
./build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
編譯到倒數MQTT模塊一直報錯,並且編譯出的文件比較大,不適合安裝集羣,所以不推薦。使用Intellij IDEA maven 插件報錯以下:
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
結果如上文所述。
運行:
./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端口,致使鏈接不上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集羣的主節點在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;
報錯:
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官網給的的方法,可是要裝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>
終端輸入hive沒法啓動hive CLI
緣由:namenode掛了
解決:重啓namenode
運行:
./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
問題:
沒有報錯,可是出現如下狀況,停不下來
緣由:
解決:
service hadoop-yarn-resourcemanager start; service hadoop-yarn-nodemanager start;
/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
歡迎進入博客 :linbingdong.com 獲取最新文章哦~
歡迎關注公衆號: FullStackPlan 獲取更多幹貨哦~