Hive 执行引擎
前面我们已经搭建起了Hive 的基础环境,每次当你使用客户端的时候,你就会看到这样的一串日志,提示我们不要再使用MR 去执行hive sql 了
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Tez
tez 是基于hive 之上,可以将sql翻译解析成DAG计算的引擎。基于DAG 与mr 架构本身的优缺点,tez 本身经过测试一般小任务在hive mr 的2-3倍速度左右,大任务7-10倍左右,根据情况不同可能不一样。
Tez 安装配置
因为我用的是idea ,所以我先将源代码导入到了idea 中去,代码的git 地址https://github.com/apache/tez
然后使用hadoop version 看了一下我的版本,调整了一下pom 中的版本配置,本来是3.1.3 的
然后直接打包命令mvn clean package -DskipTests 然后就报错了
Failed to execute goal org.apache.hadoop:hadoop-maven-plugins:3.2.1:protoc (compile-protoc) on project tez-api: org.apache.maven.plugin.MojoExecutionException: protoc version is 'libprotoc 3.11.4', expected version is '2.5.0' ->
我查看了一下我的protoc的版本
果然我们的版本和期望的版本不一致,既然问题找到了,那就开始解决
wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
tar -xzf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0/
./autogen.sh
./configure --prefix=/usr/local/protobuf2.5
make
sudo make install
一顿操作安装好了,接下来我们再看一下版本,好像没生效啊, 执行这个命令找到了原因 which protoc /Applications/anaconda3/bin/protoc
也就是到目前为止我的电脑上装了两个版本的protoc,但是我又不打算动电脑自带的那个版本,因为我怕会有其他的影响,所以我只能对Tez 的配置动点脑筋了
然后我搜索了一下protoc 关键字,然后在maven 的pom 文件里发现了这个<protoc.path>${env.PROTOC_PATH}</protoc.path> 然后我就将其改成了,我刚才的安装路径,<protoc.path>/usr/local/protobuf2.5/bin</protoc.path> 但是后来打包的时候发现不对,然后我发现应该是<protoc.path>/usr/local/protobuf2.5/bin/protoc.path</protoc.path> 就可以了,继续打包 mvn clean package -DskipTests -rf :tez-api
其实你也可以通过执行brew install protobuf250 来安装你要的特定版本的protobuf
打包好的文件在tez-dist/target/ 文件夹下,然后将其传到Hdfs 上去
hdfs dfs -mkdir /app/tez
hdfs dfs -put tez-dist/target/tez-0.10.1-SNAPSHOT.tar.gz /app/tez
然后在hive的配置目录下创建tez-site.xml 配置文件
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.defaultFS}/app/tez/tez-0.10.1-SNAPSHOT.tar.gz</value>
</property>
</configuration>
配置环境变量
export TEZ_HOME=/usr/local/tez/apache-tez-0.10.1
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${TEZ_HOME}/*:${TEZ_HOME}/lib/*
执行hadoop classpath 发现 tez 的 jar 包已经被引入进来了
接下来就可以使用Tez 引擎了set hive.execution.engine=tez;
Spark
Hive从1.1之后,支持使用Spark作为执行引擎,配置使用Spark On Yarn作为Hive的执行引擎,首先需要注意以下两个问题:
Hive的版本和Spark的版本要匹配;
具体来说,你使用的Hive版本编译时候用的哪个版本的Spark,那么就需要使用相同版本的Spark,可以在Hive的pom.xml中查看spark.version来确定;
Hive root pom.xml’s <spark.version> defines what version of Spark it was built/tested with.
Spark使用的jar包,必须是没有集成Hive的;
也就是说,编译时候没有指定-Phive.
一般官方提供的编译好的Spark下载,都是集成了Hive的,因此这个需要另外编译。
Note that you must have a version of Spark which does not include the Hive jars. Meaning one which was not built with the Hive profile.
如果不注意版本问题,则会遇到各种错误,比如:
- Caused by: java.lang.NoClassDefFoundError: org/apache/hive/spark/client/Job
- Caused by: java.lang.ClassNotFoundException: org.apache.hive.spark.client.Job
我这里使用的环境信息如下:
hadoop-2.3.0-cdh5.0.0
apache-hive-2.0.0-bin
spark-1.5.0-bin-hadoop2.3
其中,Spark使用了另外编译的spark-assembly-1.5.0-hadoop2.3.0.jar。编译很简单,下载spark-1.5.0的源码,使用命令:
mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0-cdh5.0.0 -DskipTests -Dscala-2.10 clean package
首先在hive-site.xml中添加spark.home:
<property>
<name>spark.home</name>
<value>/usr/local/spark/spark-1.5.0-bin-hadoop2.3</value>
</property>
同时也配置了环境变量
export SPARK_HOME=/usr/local/spark/spark-1.5.0-bin-hadoop2.3
这两块应该只需要配置一处即可。
进入hive-cli命令行,使用set的方式设置以下参数:
set spark.master=yarn-cluster; //默认即为yarn-cluster模式,该参数可以不配置
set hive.execution.engine=spark;
set spark.eventLog.enabled=true;
set spark.eventLog.dir=hdfs://cdh5/tmp/sparkeventlog;
set spark.executor.memory=1g;
set spark.executor.instances=50; //executor数量,默认貌似只有2个
set spark.driver.memory=1g;
set spark.serializer=org.apache.spark.serializer.KryoSerializer;
以上参数不是必须的,这个参数必须:set hive.execution.engine=spark;。
当然,这些参数也可以配置在hive-site.xml中。接下来就可以执行HQL查询试试了.
总结
Hive 支持3中执行引擎MR、Tez、Spark 优化hive 优秀的设计,使得支持多种执行引擎成为了可能,当然随着技术的发展我们可能也会看到支持其他的优秀引擎