TEZ引擎简介

TEZ

我们在上一篇文章中提到过,MapReduce模型虽然很厉害,但是它不够的灵活,一个简单的join都需要很多骚操作才能完成,又是加标签又是笛卡尔积。那有人就说我就是不想这么干那怎么办呢?Tez应运起,图飞入MR。

Tez采用了DAG(有向无环图)来组织MR任务(DAG中一个节点就是一个RDD,边表示对RDD的操作)。它的核心思想是把将Map任务和Reduce任务进一步拆分,Map任务拆分为Input-Processor-Sort-Merge-Output,Reduce任务拆分为Input-Shuffer-Sort-Merge-Process-output,Tez将若干小任务灵活重组,形成一个大的DAG作业。

上图中蓝色框表示Map任务,绿色框表示Reduce任务,云图表示写动作,可以看出,Tez去除了MR中不必要的写过程和Map,形成一张大的DAG图,在数据处理过程中没有网hdfs写数据,直接向后继节点输出,从而提升了效率。

上图是Hadoop1到Hadoop2所做的改变,Hadoop1主要使用MapReduce引擎,到了Hadoop2,基于yarn,可以部署spark,tez等计算引擎,这里MapReduce作为一种引擎实现用的越来越少了,但是作为框架思路,tez本身也是MapReduce的改进。

TEZ的构成

Tez对外提供了6种可编程组件,分别是:

Input:对输入数据源的抽象,它解析输入数据格式,并吐出一个个Key/value

Output:对输出数据源的抽象,它将用户程序产生的Key/value写入文件系统

Paritioner:对数据进行分片,类似于MR中的Partitioner

Processor:对计算的抽象,它从一个Input中获取数据,经处理后,通过Output输出

Task:对任务的抽象,每个Task由一个Input、Ouput和Processor组成

Maser:管理各个Task的依赖关系,并按顺依赖关系执行他们

除了以上6种组件,Tez还提供了两种算子,分别是Sort(排序)和Shuffle(混洗),为了用户使用方便,它还提供了多种Input、Output、Task和Sort的实现,具体如下:

Input实现:LocalMergedInput(文件本地合并后作为输入),ShuffledMergedInput(远程拷贝数据且合并后作为输入)

Output实现:InMemorySortedOutput(内存排序后输出),LocalOnFileSorterOutput(本地磁盘排序后输出),OnFileSortedOutput(磁盘排序后输出)

Task实现:RunTimeTask(非常简单的Task,基本没做什么事)

Sort实现:DefaultSorter(本地数据排序),InMemoryShuffleSorter(远程拷贝数据并排序)

[执行引擎]Tez: 运行在YARN之上支持DAG作业的计算框架(下一代Hadoop上的执行引擎)​www.jianshu.com/p/9f2e4db14223icon-default.png?t=M0H8https://link.zhihu.com/?target=https%3A//www.jianshu.com/p/9f2e4db14223

Apache Tez最新进展​dongxicheng.org/mapreduce-nextgen/apache-tez-newest-progress/正在上传…重新上传取消icon-default.png?t=M0H8https://link.zhihu.com/?target=http%3A//dongxicheng.org/mapreduce-nextgen/apache-tez-newest-progress/

浅谈Apache Tez中的优化技术​dongxicheng.org/mapreduce-nextgen/apache-tez-optimizations/正在上传…重新上传取消icon-default.png?t=M0H8https://link.zhihu.com/?target=http%3A//dongxicheng.org/mapreduce-nextgen/apache-tez-optimizations/

Welcome to Apache TEZ®​tez.apache.org/正在上传…重新上传取消icon-default.png?t=M0H8https://link.zhihu.com/?target=http%3A//tez.apache.org/

===========================version 2==========================

一、前言


Hive默认计算引擎时MR,为了提高计算速度,我们可以改为Tez引擎。至于为什么提高了计算速度,可以参考下图:

用Hive直接编写MR程序,假设有四个有依赖关系的MR作业,上图中,绿色是Reduce Task,云状表示写屏蔽,需要将中间结果持久化写到HDFS。

Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。

二、安装包准备


1)下载tez的依赖包:http://tez.apache.org

2)拷贝apache-tez-0.9.1-bin.tar.gz到hadoop102的/opt/module目录

[root@hadoop102 module]$ ls
apache-tez-0.9.1-bin.tar.gz


3)解压缩apache-tez-0.9.1-bin.tar.gz

[root@hadoop102 module]$ tar -zxvf apache-tez-0.9.1-bin.tar.gz


4)修改名称

[root@hadoop102 module]$ mv apache-tez-0.9.1-bin/ tez-0.9.1


三、在Hive中配置Tez


1)进入到Hive的配置目录:/opt/module/hive/conf

[root@hadoop102 conf]$ pwd
/opt/module/hive/conf


2)在hive-env.sh文件中添加tez环境变量配置和依赖包环境变量配置

[root@hadoop102 conf]$ vim hive-env.sh


添加如下配置

# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/opt/module/hadoop-2.7.2
 
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/module/hive/conf
 
# Folder containing extra libraries required for hive compilation/execution can be controlled by:
export TEZ_HOME=/opt/module/tez-0.9.1    #是你的tez的解压目录
export TEZ_JARS=""
for jar in `ls $TEZ_HOME |grep jar`; do
    export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/$jar
done
for jar in `ls $TEZ_HOME/lib`; do
    export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/lib/$jar
done
 
export HIVE_AUX_JARS_PATH=/opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar$TEZ_JARS


3)在hive-site.xml文件中添加如下配置,更改hive计算引擎

<property>
    <name>hive.execution.engine</name>
    <value>tez</value>
</property>


四、配置Tez


1)在Hive的/opt/module/hive/conf下面创建一个tez-site.xml文件

[root@hadoop102 conf]$ pwd
/opt/module/hive/conf
[root@hadoop102 conf]$ vim tez-site.xml


添加如下内容

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
    <name>tez.lib.uris</name>    
    <value>${fs.defaultFS}/tez/tez-0.9.1,${fs.defaultFS}/tez/tez-0.9.1/lib</value>
</property>
<property>
    <name>tez.lib.uris.classpath</name>        
    <value>${fs.defaultFS}/tez/tez-0.9.1,${fs.defaultFS}/tez/tez-0.9.1/lib</value>
</property>
<property>
     <name>tez.use.cluster.hadoop-libs</name>
     <value>true</value>
</property>
<property>
     <name>tez.history.logging.service.class</name>                            
     <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value>
</property>
</configuration>


五、上传Tez到集群


1)将/opt/module/tez-0.9.1上传到HDFS的/tez路径

[root@hadoop102 conf]$ hadoop fs -mkdir /tez
[root@hadoop102 conf]$ hadoop fs -put /opt/module/tez-0.9.1/ /tez
[root@hadoop102 conf]$ hadoop fs -ls /tez
/tez/tez-0.9.1


六、测试


1)启动Hive

[root@hadoop102 hive]$ bin/hive


2)创建LZO表

hive (default)> create table student(
id int,
name string);


3)向表中插入数据

hive (default)> insert into student values(1,"zhangsan");


4)如果没有报错就表示成功了

hive (default)> select * from student;
1       zhangsan


七、小结


1)运行Tez时检查到用过多内存而被NodeManager杀死进程问题:

Caused by: org.apache.tez.dag.api.SessionNotRunning: TezSession has already shutdown. Application application_1546781144082_0005 failed 2 times due to AM Container for appattempt_1546781144082_0005_000002 exited with  exitCode: -103
For more detailed output, check application tracking page:http://hadoop103:8088/cluster/app/application_1546781144082_0005Then, click on links to logs of each attempt.
Diagnostics: Container [pid=11116,containerID=container_1546781144082_0005_02_000001] is running beyond virtual memory limits. Current usage: 216.3 MB of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used. Killing container.
这种问题是从机上运行的Container试图使用过多的内存,而被NodeManager kill掉了。

[摘录] The NodeManager is killing your container. It sounds like you are trying to use hadoop streaming which is running as a child process of the map-reduce task. The NodeManager monitors the entire process tree of the task and if it eats up more memory than the maximum set in mapreduce.map.memory.mb or mapreduce.reduce.memory.mb respectively, we would expect the Nodemanager to kill the task, otherwise your task is stealing memory belonging to other containers, which you don't want.


解决方法:

方案一:或者是关掉虚拟内存检查。我们选这个,修改yarn-site.xml

<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>
方案二:mapred-site.xml中设置Map和Reduce任务的内存配置如下:(value中实际配置的内存需要根据自己机器内存大小及应用情况进行修改)

<property>
  <name>mapreduce.map.memory.mb</name>
  <value>1536</value>
</property>
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx1024M</value>
</property>
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>3072</value>
</property>
<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx2560M</value>
</property>


原文链接:https://blog.csdn.net/young_0609/article/details/109275517

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值