本文主要是针对Hive 基于Spark 和MapReduce 驱动引擎,进行一些测试对比验证,其目的是让初步接触大数据批量处理的朋友有一个初步的直观认识。
测试环境:
- 服务器架构配置:
- 数据素材:
结构化数据,16个字段,总计108469690(约1亿800万)
- 节点部署详情
效率对比
1. select count(1 ) from t_sta_day_basic_2018_10_11;
小结:
hive on spark:执行 第一次查询结果时需要初始化环境和分配资源,因此查询速度较慢 78 s, 第二次查询时 46 s
hive on mr : 执行时间87 s,接近前者2倍。
2. insert overwrite local directory "/tmp/out" select ddate,channelid,modelid,version,orderno,scheduleid,spacecode,materialid,regionid,cityid,ip,count(distinct mac) from t_sta_day_basic_2018_10_11 group by ddate,channelid,modelid,version,orderno,scheduleid,spacecode,materialid,regionid,cityid,ip;
小结:
hive on spark:执行时间是80 s,
hive on mr : 执行时间 510 s,对于mr 来说,count(distinct mac)极易引起数据倾斜,引起内存溢出,但是相比于直接group by mac 来说其效率(519 s)稍高些,但是相比于hive on spark 执行效率却慢了很多
3.insert overwrite local directory "/tmp/out" select ddate,channelid,modelid,version,orderno,scheduleid,spacecode,materialid,regionid,cityid,count(distinct mac,ip) from t_sta_day_basic_2018_10_11 group by ddate,channelid,modelid,version,orderno,scheduleid,spacecode,materialid,regionid,cityid;
小结:
hive on spark:执行时间是136 s,
hive on mr : 执行时间 988 s,对于mr 来说,count(distinct mac,ip)更加容易引起数据倾斜,引起内存溢出
Hive on Spark 配置
- 准备工作
在配置hive on spark 之初的准备工作就是确认hive / spark /hadoop 的版本兼容问题,请参考官网:Hive on Spark: Getting Started
https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started
关于hive on spark 配置 其实就是将hive 执行引擎换为spark 即可,如下图,hive 的执行引擎默认是mr,我们可以人为配置为spark或是tez,
2.hive on spark 环境搭建
hive 、spark、 hadoop 版本确认好以后即可开始具体配置,例如选择hive 2.3.4、spark 2.0.2 、hadoop 2.75 。需要注意的是spark 的安装需要自己下载源码,然后自己编译安装(主要是不要依赖spark本身所带的hive 包),之前文章已经讲过如何搭建spark 和 hadoop集群,此处讲一下如何自己编译spark 包,并且搭建集群
- 官网下载spark 2.0.2源码
- 编译
将下载的spark 2.0.2 源码上传到服务器并且解压
执行编译脚本 ./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided"
其中,-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided 表示将对应版本的yarn 、hadoop 打包在内,由于我们不需要带有hive 的包,因此不能加上 -Phive
编译成功后会在根目录生成 spark-2.2.0-bin-hadoop2.7-without-hive.tgz 包
将编译好的 spark-2.0.2-bin-hadoop2.7-without-hive.tgz 拷贝到/opt下,解压并且重名名为 spark2.0_noHive
mv spark-2.0.2-bin-hadoop2.7-without-hive spark2.0_noHive
设置环境变量 export SPARK_HOME=/opt/spark2.0_noHive
PS:如果想了解更多的 依赖包版本关系,亲参考源码包下的pom 文件
- 配置hive
- 添加jar包
spark 官网指出,hive 2.2 前兼容spark 1.6 及以下版本,因此只需将编译好的spark-assembly jar 包拷贝到 ${HIVE_HOME}/lib 目录下即可,
对于2.2 以后的版本,兼容spark2.0 以上版本没有assembly jar,因此需要将${SPARK_HOME}/jars 下scala-library、spark-core、spark-network-common 拷贝到${HIVE_HOME}/lib
- 配置hive-site.xml,关于hive 的详细配置例如元数据库的安装配置等,请参考上篇文章。
<property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://master:3306/hive22?createDatabaseIfNotExist=true&characterEncoding=UTF-8</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hadoop</value> </property> <property> <name>hive.execution.engine</name> <value>spark</value> <description> </property> <property> <name>spark.home</name> <value>/opt/spark2.0_noHive</value> </property> <property> <name>spark.master</name> <!--<value>spark://master:7077</value> --> <value>yarn-client</value> </property> <property> <name>spark.yarn.jars</name> <value>hdfs://master:9000/opt/spark/spark-jars/*</value> </property> <property> <name>spark.executor.cores</name> <value>2</value> </property> <property> <name>spark.default.parallelism</name> <value>24</value> </property> <property> <name>spark.executor.memory</name> <value>2048m</value> </property> <property> <name>spark.serializer</name> <value>org.apache.spark.serializer.KryoSerializer</value> </property>
- 上传spark.yarn.jar
对于hive 2.2 以前版本,将spark-assembly.jar 上传到hd 目录下,对于hive 2.2 以后版本将${SPARK_HOME}/jars 下jar 包上传到hdfs 目录,并且在hive-site.xml 文件中配置。
- 配置spark
修改 ${SPARK_HOME}/conf/spark-env.sh ,添加相关的配置属性
export SCALA_HOME=/opt/scala-2.11.8
export JAVA_HOME=/usr/local/java
export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=6g
export HADOOP_CONF_DIR=/opt/hadoop/hadoop-2.7.5/etc/hadoop
export YARN_CONF_DIR=/opt/hadoop/hadoop-2.7.5/etc/hadoop
export SPARK_DIST_CLASSPATH=$(/opt/hadoop/hadoop-2.7.5/bin/hadoop classpath)
注意:配置SPARK_DIST_CLASSPATH 尤为重要,即将hadoop 的环境当做spark的classpath
修改${SPARK_HOME}/conf/slaves文件,将内容替换为
slave1
slave2
注意:前提是在每台机器的hosts文件中添加对应的host,如下
vim /etc/hosts
- 配置spark_noHive 集群
截止目前所有的配置都是在master 机器上进行的,现将已经配置好的spark 分发到两台slave 机器中,然后回spark集群的master 机器启动spark 集群
cd ${SPARK_HOME}/
./sbin/start-all.sh
以防出错,检查两台slave 的启动情况。从web 端通过spark web UI查看整个saprk集群的部署情况,确认无误后表示spark 集群启动成功。
- 验证hive on spark 安装情况
cd ${HIVE_HOME}/bin
初始化元数据库./schematool -initSchema -dbType mysql
执行成功后 启动hive
至此,测试安装成功。
3.hive on spark 过程中遇到的问题
- 版本不兼容和重新编译不带hive 的spark包,上文中提到
- org.apache.hadoop.ipc.RemoteException: User: root is not allowed to impersonate root
通过jdbc 连接hive时hdfs 系统下的root 账号不能执行其他group 下的账号权限,需要在每个hdfs 节点下修改core-site.xml 配置文件,添加如下属性
<property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property>
本文只是简单介绍了hive on spark 基础,给读者有一个大概的认识。后续将分享下源码解读,如有意见或是建议请帮忙指出,共勉。