Hive默认引擎是MapReduce,性能更好的引擎是Spark、Tez。内存大的且集群只运行Spark的可以使用Spark引擎,因为Spark占用资源较多,不适合与其他计算引擎一起在一个集群启动。内存较少可以在一个集群和其他计算引擎同时启动,所以用的也挺多。
Tez引擎:是运行在YARN上的DAG,传统MapReduce必须一个Map一个Reduce,然后再接一个Map一个Reduce,每个Map和Reduce都有输入和输出,输出都是以文件的形式。Tez能把多个Map和Reduce任意组合,其实是将Map拆解成Input、Processor、Sort、Merge、Output,Reduce拆解成Input、Shuffle、Sort、Merge、Processor、Output等,拆解出的元操作可以任意组合,形成一个大的DAG,组合更加合理,减少了中间过程文件输出,所以性能大大提升。
使用Tez引擎时,下载解压到指定目录下,然后上传到hadoop的指定目录下,这里是/tez目录,在/etc/hadoop下增加tez-site.xml文件如下:
<configuration>
<property>
<name>tez.lib.uris</name><!-- 对应hdfs的目录 -->
<value>${fs.defaultFS}/tez/tez-0.5.3.tar.gz</value>
</property>
<!-- 后面的几项可以不要 -->
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>true</value>
</property>
<property>
<name>tez.am.resource.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>tez.am.resource.cpu.vcores</name>
<value>1</value>
</property>
<property>
<name>tez.container.max.java.heap.fraction</name>
<value>0.4</value>
</property>
<property>
<name>tez.task.resource.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>tez.task.resource.cpu.vcores</name>
<value>1</value>
</property>
</configuration>
配置方式可以不用修改Hive,直接修改Hadoop即可,将tez的jar包拷贝到hadoop的classpath下,然后在hadoop-env.sh文件中添加(导入Tez的jar包到HADOOP_CLASSPATH变量中):
export TEZ_HOME=/oneapm/local/tez-0.5.3 # 是你的tez的解压目录
for jar in `ls $TEZ_HOME |grep jar`; do
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/$jar
done
for jar in `ls $TEZ_HOME/lib`; do
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/lib/$jar
done
在mapred-site.xml中修改:
<property>
<name>mapreduce.framework.name</name>
<value>yarn-tez</value>
</property>
将修改的配置文件同步到其他节点。这种方式是MapReduce被tez替换,Hadoop集群都将使用Tez。
第二种方式(建议采用)是修改hive-site.xml文件:
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
<!-- 后面的可以不要 -->
<property>
<name>hive.tez.container.size</name>
<value>1024</value>
</property>
也可set hive.execution.engine=tez临时生效。
Hive的存放路径默认是使用当前用户名的,在/user/${user}下。