前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Hive on Spark实战:深入理解与配置Spark集群

Hive on Spark实战:深入理解与配置Spark集群

原创
作者头像
TASKCTL 任务调度平台
发布2024-11-12 14:36:13
发布2024-11-12 14:36:13
32500
代码可运行
举报
文章被收录于专栏:Hadoop大数据运维
运行总次数:0
代码可运行

主要记录如何安装配置 Hive on Spark,在执行以下步骤之前,请先确保已经安装 Hadoop 集群,Hive,MySQL,JDK,Scala,具体安装看之前内容《深度挖掘|Cloudera安装不再难!基础环境搭建全解析》

背景

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

各节点规划如下:

代码语言:javascript
代码运行次数:0
复制
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-src.tar.gz

下载完后用 tar xzvf 命令解压,进入解压完的文件夹,准备编译。

注意:编译前请确保已经安装 JDK、Maven 和 Scala,maven 为 3.3.3 及以上版本,并在/etc/profile 里配置环境变量。

命令行进入在源码根目录下,执行

代码语言:javascript
代码运行次数:0
复制
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"

若编译过程出现内存不足的情况,需要在运行编译命令之前先运行:

代码语言:javascript
代码运行次数:0
复制
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 等

代码语言:javascript
代码运行次数:0
复制
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 节点)

代码语言:javascript
代码运行次数:0
复制
Goblin01
Goblin02
Goblin03
Goblin04

spark-defaults.conf

代码语言:javascript
代码运行次数:0
复制
 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)

代码语言:javascript
代码运行次数:0
复制
<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

代码语言:javascript
代码运行次数:0
复制
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 引擎用不了,在后面会有详细的错误说明。

代码语言:javascript
代码运行次数:0
复制
<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 目录,执行:

代码语言:javascript
代码运行次数:0
复制
./sbin/start-all.sh

用 jps 命令查看 51 节点上的 master 和 worker,52、53、54 节点上的 worker 是否都启动了

同样在 $SPARK_HOME 目录下,提交计算 Pi 的任务,验证 Spark 集群是否能正常工作,运行如下命令

代码语言:javascript
代码运行次数:0
复制
./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 配置成功。

遇到的问题

编译 spark 基于 maven 有两种方式

用 mvn 命令编译

代码语言:javascript
代码运行次数:0
复制
./build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package 

编译到倒数 MQTT 模块一直报错,而且编译出的文件比较大,不适合安装集群,因此不推荐。

使用 Intellij IDEA maven 插件报错如下:

使用 spark 提供的预编译脚本,网络状况稳定,会编译出需要的安装版本,推荐。命令

代码语言:javascript
代码运行次数:0
复制
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"

结果如上文所述。

1.运行:

代码语言:javascript
代码运行次数:0
复制
./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 报错

代码语言:javascript
代码运行次数:0
复制
spark.eventLog.enabled           true
spark.eventLog.dir              hdfs://Goblin01:8021/spark-log

解决:配置 spark-default.conf 中的 spark.eventLog.dir 为本地路径,也就是不持久化日志到 hdfs 上,也就没有和 hdfs 的通行

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

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

由于配置的 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;

报错:

代码语言:javascript
代码运行次数:0
复制
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,比较麻烦,不建议)

代码语言:javascript
代码运行次数:0
复制
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 添加配置(简单、推荐)

代码语言:javascript
代码运行次数:0
复制
<property>
<name>hive.enable.spark.execution.engine</name>
<value>true</value>
</property>

3.终端输入 hive 无法启动 hive CLI

原因:namenode 挂了

解决:重启 namenode

4.运行:

代码语言:javascript
代码运行次数:0
复制
./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,重启 ResourceManager 和 NodeManager。

代码语言:javascript
代码运行次数:0
复制
service hadoop-yarn-resourcemanager start;
service hadoop-yarn-nodemanager start;

对于原因 2,解决办法是在 hadoop 配置文件中设置 yarn 的并行度,在/etc/hadoop/conf/capacity-scheduler.xml文件中配置 yarn.scheduler.capacity.maximum-am-resource-percent from 0.1 to 0.5

代码语言:javascript
代码运行次数:0
复制
 <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>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 环境说明
    • 编译和安装 Spark(Spark on YARN)
      • 编译 Spark 源码
      • 安装 Spark
      • 配置 Spark
      • 配置 YARN
      • 配置 Hive
    • 验证是否安装配置成功
      • 验证 Spark 集群
      • 验证 Hive on Spark 是否可用
    • 遇到的问题
      • 编译 spark 基于 maven 有两种方式
      • 1.运行:
      • 2.运行:
      • 3.终端输入 hive 无法启动 hive CLI
      • 4.运行:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档