博客 / 詳情

返回

Spark與Hive的完美結合:如何在Spark上部署Hive

主要記錄如何安裝配置 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)

編譯 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 版本,下載地址如下:http://archive.cloudera.com/cdh5/cdh/5/spark-1.5.0-cdh5.5.1-s...

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

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

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

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

注意: 在啓動 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 集羣能正常工作

驗證 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 配置成功。

以上就是今天分享的全部內容。

如果你想了解更多關於:Cloudera 系統環境準備、基礎環境安裝、集羣部署以及應用組件安裝等全方位的技術的問題。例如: 從環境搭建/集羣部署,內存擴容/問題排查,數據遷移等助你輕鬆應對數據管理的複雜性。

可以聯繫我:15928721005

圖片

感謝你的閲讀,如果喜歡我的文字,可以持續關注我,會陸續為你更新更多幹貨小知識。

user avatar daimajiangxin 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.