1. 程式人生 > >Hive on Spark安裝配置詳解(都是坑啊)

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

各節點規劃如下:

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的相關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版本,下載地址如下:

下載完後用 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

2.2 安裝Spark

  • 將編譯完生成的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

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(將所有節點都加入,master節點同時也是worker節點)
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需要設為true

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

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

三、配置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

配置的內容與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>

五、驗證是否安裝配置成功

1.驗證Spark叢集

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

  • 進入$SPARK_HOME目錄,執行:
./sbin/start-all.sh

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

  • 同樣在$SPARK_HOME目錄下,提交計算Pi的任務,驗證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; (將執行引擎設為Spark,預設是mr,退出hive CLI後,回到預設設定。若想讓引擎預設為Spark,需要在hive-site.xml裡設定)
  • create table test(ts BIGINT,line STRING); (建立表)
  • select count(*) from test;
  • 若整個過程沒有報錯,並出現正確結果,則Hive on Spark配置成功。

六、遇到的問題

0

編譯spark基於maven有兩種方式

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

編譯到倒數MQTT模組一直報錯,而且編譯出的檔案比較大,不適合安裝叢集,因此不推薦。使用Intellij IDEA maven 外掛報錯如下:

  • 使用spark提供的預編譯指令碼,網路狀況穩定,會編譯出需要的安裝版本,推薦。命令
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"

結果如上文所述。

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埠,導致連線不上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的高可用模式解決)

2

執行:

在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>

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

問題:

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

原因:

  1. ResourceManager或者NodeManager掛掉,一直沒有NodeManager響應,任務無法執行,所有停不下來。
  2. 還有一種情況是spark有別的application在執行,導致本次spark任務的等待或者失敗

解決:

  1. 對於原因1,重啟ResourceManager和NodeManager。
service hadoop-yarn-resourcemanager start;
service hadoop-yarn-nodemanager start;
  1. 對於原因2,解決辦法是在hadoop配置檔案中設定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>

相關推薦

Hive on Spark安裝配置

簡介 本文主要記錄如何安裝配置Hive on Spark,在執行以下步驟之前,請先確保已經安裝Hadoop叢集,Hive,MySQL,JDK,Scala,具體安裝步驟不再贅述。 背景 Hive預設使用MapReduce作為執行引擎,即Hive on mr。實際上,H

CentOS 7.4 Tengine安裝配置

tengine nginx 一、安裝配置Tengine:Tengine是由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性。Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易

CentOS 7.4 Tengine安裝配置

tengine、虛擬主機、IP、訪問控制三、配置虛擬主機:1、配置基於端口的虛擬主機:(1)在http{}配置段中新增如下server:server {listen 8000;server_name localhost;access_log /usr/local/tengine/logs/localhost8

CentOS 7.4 Tengine安裝配置

location、echo、fancy九、根據HTTP響應狀態碼自定義錯誤頁:1、未配置前訪問一個不存在的頁面:http://192.168.1.222/abc/def.html,按F12後刷新頁面2、在server{}配置段中新增如下location:server {listen 80;server_nam

CentOS 7.4 Tengine安裝配置

tengine nginx https 十四、配置Tengine支持HTTPS1、演示環境:IP操作系統角色 192.168.1.222 CentOS 7.4 Tengine服務器 192.168.1.145 CentOS 6.9 自建CA服務器備註:Teng

CentOS 7.4 Tengine安裝配置

tengine 反向代理 十五、反向代理:1、演示環境:IP操作系統節點角色192.168.1.222CentOS 7.4node1Tengine服務器192.168.1.144CentOS 6.9node2Apache服務器2、node2安裝Apache服務,並創建測試頁:# yum -y inst

CentOS 7.4 Tengine安裝配置

tengine cache purge 十六、緩存及緩存清理1、修改node1配置文件nginx.conf:(1)在http配置段中增加如下代碼:proxy_cache_path /usr/local/tengine/cache levels=1:1:2 keys_zone=mycache:200

NGINX源碼安裝配置./configure,最全解析

unzip roo without rpc服務 所有 googl 版本 並且 大文件 NGINX ./configure詳解 在"./configure"配置中,"--with"表示啟用模塊,也就是說這些模塊在編譯時不會自動構建&qu

快速安裝Nginx及配置未完待續

導讀: Nginx (engine x) 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器,從2007年被德國人開發出來後可以說在市場的佔有率一路飆升,因為它支援高併發,而且還能阻止dos攻擊,它是當前較具影響力的一個http伺服器軟體,像百度等大廠都使用它,所以這是作為一

python中呼叫R語言通過rpy2 進行互動安裝配置R_USER、R_HOME配置

python中呼叫R語言通過rpy2 進行詳解 文章目錄 python中呼叫R語言通過rpy2 進行詳解 1.R語言的安裝: 2.Rpy2工具的安裝和配置 3.pycharm中使用R語言配置

nginx 的安裝和gcc gcc-c++配置新手必看

首先玩linux的話, gcc gcc-c++,fast-cgi,wget,yum 這些包請確保已經安裝好了, #下載nginx openssl,pcre,zlib  wget http://nginx.org/download/nginx-1.12.0.tar.gz&nb

使用LVS實現負載均衡原理及安裝配置

bin 瀏覽器 gate 裏的 高性能 target 相關 asq 空間 負載均衡集群是 load balance 集群的簡寫,翻譯成中文就是負載均衡集群。常用的負載均衡開源軟件有nginx、lvs、haproxy,商業的硬件負載均衡設備F5、Netscale。這裏主要是

ssh無密登入配置hadoop叢集搭建

ssh無密登入原理 注:私鑰和公鑰是每個使用者獨有的,而不是機器或者伺服器的,比如一臺電腦或者伺服器或者虛擬機器,可以同時存在多個使用者,但不同使用者需要遠端登入其他伺服器或者虛擬機器時,都必須配置各自的私鑰和公鑰,而且使用者之間的各不相同 常用命令 ssh ip(遠端登入也可

JVM引數配置包含JDK1.8

-XX:PrintHeapAtGC:列印GC前後的詳細堆疊資訊 輸出形式: 34.702: [GC {Heap before gc invocations=7:  def new generation   total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0

Struts2 零配置 struts-Convention-plugin

轉載請註明原出處(不是本文,是記錄在文最下方的原出處) 從struts2.1開始,struts2不再推薦使用Codebehind作為零配置外掛,而是改為使用Convention外掛來支援零配置,和Codebehind相比,Convention外掛更徹底,該外掛完全拋棄配置資訊,不僅不需要是使

阿里巴巴開發的德魯伊連線池 druid配置 號稱世界第一

java程式很大一部分要操作資料庫,為了提高效能操作資料庫的時候,有不得不使用資料庫連線池。資料庫連線池有很多選擇,c3p、dhcp、proxool等,druid作為一名後起之秀,憑藉其出色的效能,也逐漸印入了大家的眼簾。接下來本教程就說一下druid的簡單使用。 和dbcp類似,druid的配置項

docker如何最快速的方式建立映象並在建立時安裝配置好jdk()第五篇共五篇

Dockerfile製作映象步驟 在根目錄下建立dockerfile資料夾 mkdir dockfile 在資料夾下建立Dockerfile檔案 touch Dockerfile 編輯Dockerfile檔案 vim Dockerfile 檔案內容如下: #版本資訊 FROM centos

Linux下MongoDB安裝配置

一、MongoDB的安裝 1.下載安裝包 下載方式: curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.9.tgz 解壓縮壓縮包: tar zxvf mongodb-linux-x

[轉載]SourceTree安裝教程和GitLab配置附帶報錯解決辦法

連結:http://www.cnblogs.com/Lam7/p/6004737.html 補充:1.沒有vpn的支援,atlassian只註冊不了的,就算打得開頁面也沒辦法進行人機驗證。 2.安裝git,直接進行下一步,中間可以不用操作 3.安裝sour