我的主页:http://www.linbingdong.com
简书地址:http://www.jianshu.com/p/a7f75b868568html
本文主要记录如何安装配置Hive on Spark,在执行如下步骤以前,请先确保已经安装Hadoop集群,Hive,MySQL,JDK,Scala,具体安装步骤再也不赘述。java
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。node
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两种模式。mysql
本教程Hadoop相关软件所有基于CDH5.5.1,用yum安装,系统环境以下:sql
各节点规划以下:apache
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的mastervim
要使用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版本,下载地址以下:app
http://archive.cloudera.com/cdh5/cdh/5/spark-1.5.0-cdh5.5.1-src.tar.gzyii
下载完后用 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-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-env.sh、slaves和spark-defaults.conf三个文件
主要配置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'
Goblin01 Goblin02 Goblin03 Goblin04
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_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集群以前,要确保Hadoop集群和YARN均已启动
./sbin/start-all.sh
用jps命令查看51节点上的master和worker,5二、5三、54节点上的worker是否都启动了
./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集群能正常工做
编译spark基于maven有两种方式
./build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
编译到倒数MQTT模块一直报错,并且编译出的文件比较大,不适合安装集群,所以不推荐。使用Intellij IDEA maven 插件报错以下:
./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的通行
or
spark-default.conf 注释掉 spark.eventLog.enabled true
or
在spark-default.conf里配置的eventLog端口跟hdfs的默认端口(8020)一致
or
因为配置的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>
终端输入hive没法启动hive CLI
缘由: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
问题:
没有报错,可是出现如下状况,停不下来
缘由:
解决:
service hadoop-yarn-resourcemanager start; service hadoop-yarn-nodemanager start;
/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>
https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark:+Getting+Started
欢迎进入博客 :linbingdong.com 获取最新文章哦~
欢迎关注公众号: FullStackPlan 获取更多干货哦~