主要记录如何安装配置 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 运行模式分为三种
- Spark on YARN
- Standalone Mode
- 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
感谢你的阅读,如果喜欢我的文字,可以持续关注我,会陆续为你更新更多干货小知识。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。