主要记录如何安装配置 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
Goblin04spark-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) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。