主要记录如何安装配置 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 安装,系统环境如下:
各节点规划如下:
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
要使用 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 里配置环境变量。
命令行进入在源码根目录下,执行
./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
$vim /etc/profile export SPARK_HOME=spark安装路径 $source /etc/profile
配置 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-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>
添加 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
配置 hive-site.xml
配置的内容与 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 集群之前,要确保 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 集群能正常工作
用 mvn 命令编译
./build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
编译到倒数 MQTT 模块一直报错,而且编译出的文件比较大,不适合安装集群,因此不推荐。
使用 Intellij IDEA maven 插件报错如下:
使用 spark 提供的预编译脚本,网络状况稳定,会编译出需要的安装版本,推荐。命令
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"
结果如上文所述。
./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 报错
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 的高可用模式解决)
在 hive 里设置引擎为 spark,执行 select count(*) from a;
报错:
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,比较麻烦,不建议)
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 添加配置(简单、推荐)
<property>
<name>hive.enable.spark.execution.engine</name>
<value>true</value>
</property>
原因:namenode 挂了
解决:重启 namenode
./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。
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
<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 删除。