你好,游客 登录 注册 搜索
背景:
阅读新闻

基于Spark 2.0.0搭建Hive on Spark环境

[日期:2017-04-06] 来源:Linux社区  作者:jsin31 [字体: ]

一、运行环境

  • 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

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款