共计 3593 个字符,预计需要花费 9 分钟才能阅读完成。
一、运行环境
- CentOS 7.2
- Hadoop 2.7
- Hive 2.2.0
- Spark 2.0.0
- JDK 1.7
- Scala 2.11.8
- Maven 3.3.9
说明:Scala 2.11.8 以后的版本只支持 JDK1.8,如果环境原本是使用 JDK1.7 的就不需要安装最新版本。
二、开始配置前的排坑
很多人都会参考 Hive on spark 的官方手册 https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started 来配置,但其中还是有很多坑的,下面就说一下官方手册上的坑及没有提到一些细节。
1)版本兼容问题
HIVE 官方指引说 Spark 一定要安装没有 HIVE jar 包的版本。原文“Note that you must have a version of Spark which does not include the Hive jars.”除此之外就没有其他的说明了。但实际情况是 HIVE 最新发布版 2.1.1(截止我写这篇博客的时间点官网上的下载页面最新版本)是没办法运行在 Spark2.0.0 之上的,强行运行的话会出现 Java.lang.ClassNotFoundException: org.apache.spark.JavaSparkListener 的错误。原因是由于从 Spark2.0.0 开始 JavaSparkListener 已移除,改为了 SparkListener。
如果想使用 Hive2.X 版本搭配 Spark2.X 版本的话可以使用 Hive-14029 的修复版本:
https://github.com/apache/hive/pull/103/commits/f14f5a6d0d255d52e99ecbf5a232706cb1f63142
Hive 对应的 Spark 版本可根据源码目录中的 pom.xml 的 <spark.version> 确认。
2)spark 编译时 scala 版本需要更改
官方指引的编译命令
./dev/make-distribution.sh –name “hadoop2-without-hive” –tgz “-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided”
根据 spark 官方指引实际操作的编译命令
./dev/change-scala-version.sh 2.11
./dev/make-distribution.sh –name “hadoop2-without-hive” –tgz “-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided,-Dscala-2.11”
3)启动 Hive 时 java.lang.NoClassDefFoundError: org/slf4j/Logger 错误
原因是没有导入 hadoop 的 jar 包,在 spark-env.sh 加入下面的变量即可:
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
4)Spark on Yarn 不需要启动 spark 集群
官方手册原文是在编译后就要求启动 spark 集群——“Start Spark cluster”,但这种用是要配置 master 和 worker 的,有点像配置 resourcemanager 和 nodemanager。而实际上如果是 Spark on Yarn 则不需要配置也不需要启动 spark 集群。Spark 会自动读取 Yarn 配置文件,如果不是用了 Spark on Yarn,那在 Yarn 的 webUI 上是看不到 Spark 任务的。
Spark on Yarn 需要在 spark-env.sh 加入下面的变量
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
5)Hive 的 spark.master 参数
官方手册上说 spark.master 参数是 <Spark Master URL>,没有详细地说明,像我这样的新手很容易犯晕,spark 官方文档上有详细解释 http://spark.apache.org/docs/latest/submitting-applications.html#master-urls
三、配置过程
1)编译 spark 和 hive
安装 scala 和 maven
配置 maven 运行参数
export MAVEN_OPTS=”-Xmx2g -XX:ReservedCodeCacheSize=512m -XX:MaxPermSize=512m”
编译 spark 05.
./dev/change-scala-version.sh 2.11
./dev/make-distribution.sh –name “hadoop2-without-hive” –tgz “-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided,-Dscala-2.11”
编译 hive
mvn clean package -Pdist -Dmaven.test.skip=true
2)把 SPARK_HOME/jars 下的 spark-* 和 scala-* 的 jar 包软连接或拷到 HIVE_HOME/lib 下
3)在 hive-site.xml 中加入
<property>
<name>spark.yarn.jars</name>
<value>hdfs://xxxx:9000/spark-jars/*</value>
</property>
并把 SPARK_HOME/jars 下所有 jar 包复制到此目录下
4)在 spark-env.sh 中加入
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
5)启动 HIVE,配置参数
set hive.execution.engine=spark;
set spark.master=yarn;
set spark.submit.deployMode=client;
set spark.eventLog.enabled=true;
set spark.eventLog.dir=hdfs://xxxx:9000/spark-logs;
set spark.executor.memory=1024m;
set spark.serializer=org.apache.spark.serializer.KryoSerializer; 这些参数可以配置在 hive-site.xml 或 spark-defaults.conf 中。
6)执行 SQL,完成
四、说在最后
本文只是为了记录自己搭建 Hive 2.2 on Spark 2.0.0 时遇到的一些问题和解决步骤,因为当时网上没有什么现成资料所以走了不少弯路,希望此文能帮助和我遇到同样问题的人。关于性能调优还请参考 spark 官方手册或者网上其他资料,如有错误欢迎指正。
更多 Spark 相关教程见以下内容:
CentOS 7.0 下安装并配置 Spark http://www.linuxidc.com/Linux/2015-08/122284.htm
Spark1.0.0 部署指南 http://www.linuxidc.com/Linux/2014-07/104304.htm
Spark2.0 安装配置文档 http://www.linuxidc.com/Linux/2016-09/135352.htm
Spark 1.5、Hadoop 2.7 集群环境搭建 http://www.linuxidc.com/Linux/2016-09/135067.htm
Spark 官方文档 – 中文翻译 http://www.linuxidc.com/Linux/2016-04/130621.htm
CentOS 6.2(64 位)下安装 Spark0.8.0 详细记录 http://www.linuxidc.com/Linux/2014-06/102583.htm
Spark2.0.2 Hadoop2.6.4 全分布式配置详解 http://www.linuxidc.com/Linux/2016-11/137367.htm
Ubuntu 14.04 LTS 安装 Spark 1.6.0(伪分布式)http://www.linuxidc.com/Linux/2016-03/129068.htm
Spark 的详细介绍:请点这里
Spark 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-04/142575.htm