Hive on Spark 实战:深入理解与配置 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
各节点规划如下:
说明: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 里配置环境变量。
命令行进入在源码根目录下,执行
若编译过程出现内存不足的情况,需要在运行编译命令之前先运行:
来设置 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 等
slaves(将所有节点都加入,master 节点同时也是 worker 节点)
spark-defaults.conf
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)
配置 Hive
添加 spark 依赖到 hive(将 spark-assembly-1.5.0-cdh5.5.1-hadoop2.6.0.jar 拷贝到 $HIVE_HOME/lib 目录下)
进入 SPARK_HOME
配置 hive-site.xml
配置的内容与 spark-defaults.conf 相同,只是形式不一样,以下内容是追加到 hive-site.xml 文件中的,并且注意前两个配置,如果不设置 hive 的 spark 引擎用不了,在后面会有详细的错误说明。
验证是否安装配置成功
验证 Spark 集群
注意:在启动 Spark 集群之前,要确保 Hadoop 集群和 YARN 均已启动
进入 $SPARK_HOME 目录,执行:
用 jps 命令查看 51 节点上的 master 和 worker,52、53、54 节点上的 worker 是否都启动了
同样在 $SPARK_HOME 目录下,提交计算 Pi 的任务,验证 Spark 集群是否能正常工作,运行如下命令
若无报错,并且算出 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 命令编译
编译到倒数 MQTT 模块一直报错,而且编译出的文件比较大,不适合安装集群,因此不推荐。
使用 Intellij IDEA maven 插件报错如下:
使用 spark 提供的预编译脚本,网络状况稳定,会编译出需要的安装版本,推荐。命令
结果如上文所述。
1.运行:
报错:
原因:hdfs 的默认端口为 8020 ,而我们在 spark-default.conf 中配置成了 8021 端口,导致连接不上 HDFS 报错
解决:配置 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;
报错:
解决:这是因为 CDH 版的 Hive 默认运行支持 Hive on Spark(By default, Hive on Spark is not enabled).需要用 cloudera manager(cloudera 官网给的的方法,但是要装 cloudera manager,比较麻烦,不建议)
或者在 hive-site.xml 添加配置(简单、推荐)
3.终端输入 hive 无法启动 hive CLI
原因:namenode 挂了
解决:重启 namenode
4.运行:
问题:没有报错,但是出现以下情况,停不下来
原因:
ResourceManager 或者 NodeManager 挂掉,一直没有 NodeManager 响应,任务无法执行,所有停不下来。
还有一种情况是 spark 有别的 application 在运行,导致本次 spark 任务的等待或者失败
解决:
对于原因 1,重启 ResourceManager 和 NodeManager。
对于原因 2,解决办法是在 hadoop 配置文件中设置 yarn 的并行度,在
/etc/hadoop/conf/capacity-scheduler.xml
文件中配置 yarn.scheduler.capacity.maximum-am-resource-percent from 0.1 to 0.5
以上就是今天分享的全部内容。
如果你想了解更多关于:Cloudera 系统环境准备、基础环境安装、集群部署以及应用组件安装等全方位的技术的问题。例如:从环境搭建/集群部署,内存扩容/问题排查,数据迁移等助你轻松应对数据管理的复杂性。可以联系我:15928721005
感谢你的阅读,如果喜欢我的文字,可以持续关注我,会陆续为你更新更多干货小知识。
评论