Hive 执行引擎(20)

861 阅读3分钟

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.

hive-execution

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 的

image-20201227164730888

然后直接打包命令mvn clean package -DskipTests 然后就报错了

image-20201227161020312

 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的版本

image-20201227161354862

果然我们的版本和期望的版本不一致,既然问题找到了,那就开始解决

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

image-20201227163335568

也就是到目前为止我的电脑上装了两个版本的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

image-20201227164952968

打包好的文件在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.

如果不注意版本问题,则会遇到各种错误,比如:

  1. Caused by: java.lang.NoClassDefFoundError: org/apache/hive/spark/client/Job
  2. 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 优秀的设计,使得支持多种执行引擎成为了可能,当然随着技术的发展我们可能也会看到支持其他的优秀引擎