博客 大数据大厂之TeZ 大数据计算框架实战:高效处理大规模数据

大数据大厂之TeZ 大数据计算框架实战:高效处理大规模数据

   数栈君   发表于 2024-10-11 14:33  354  0

在之前对大数据相关主题的探索中,我们已经深入了解了数据质量评估的重要性以及数据导入导出工具(如 Sqoop)的应用技巧,这些内容就像一块块基石,构建起我们对大数据处理基础环节的认知。然而,随着数据规模的持续增长和数据处理需求的日益复杂,我们迫切需要更为高效、灵活的大数据计算框架。这就引出了我们接下来要深入探讨的 TeZ 大数据计算框架。

一、TeZ 框架简介
1.1 什么是 TeZ
TeZ 是构建于 Hadoop 之上的强大的大数据计算框架,旨在提升 MapReduce 作业的性能。其核心机制是采用有向无环图(DAG,Directed Acyclic Graph)执行模式。形象地说,DAG 就如同一个精密的任务规划蓝图,明确地描绘出各个任务之间的先后顺序和依赖关系。在 TeZ 框架中,复杂的大数据处理作业被拆解为多个子任务,这些子任务依据 DAG 所规划的路径进行高效调度。

这一调度方式相较于传统的 MapReduce 有着显著的改进。传统 MapReduce 往往按照相对固定的顺序依次处理任务,期间中间结果需多次进行磁盘读写存储,而 TeZ 能够直接在内存中传递数据给下一个任务,避免了不必要的磁盘 I/O 操作。根据 Apache 官方技术文档以及诸多学术研究表明,这种基于内存的数据传递方式在大规模数据处理场景下,相比传统 MapReduce 可带来显著的性能提升。

具体而言,在数据密集型的应用场景中,例如处理海量的日志数据或者大规模的用户行为分析数据时,传统 MapReduce 由于其设计架构的限制,在每一个 Map 和 Reduce 阶段之间,中间结果需要频繁地写入磁盘,这一过程涉及大量的磁盘 I/O 操作。磁盘 I/O 操作的速度相较于内存读写速度要慢几个数量级,从而导致整体的数据处理速度受到极大的限制。

而 TeZ 框架采用的基于内存的数据传递方式则避免了这种频繁的磁盘 I/O 操作。当一个任务处理完数据后,数据直接在内存中传递给下一个任务,大大减少了数据传输的延迟。以一个处理 10 亿条网络日志数据的任务为例,假设每条日志数据大小为 1KB,在传统 MapReduce 框架下,由于中间结果的多次磁盘写入和读取,整个处理过程可能需要花费数小时。而在 TeZ 框架下,得益于内存数据传递,处理相同的数据量可能仅需几十分钟,性能提升达到数倍甚至更多。

这种性能提升在实际的企业级应用中具有重要意义。对于互联网企业来说,能够更快地处理用户数据意味着可以更及时地获取用户行为信息,从而进行精准的广告投放、用户体验优化等操作;对于金融机构而言,快速处理大量的交易数据有助于及时发现异常交易、进行风险评估等关键业务操作。

1.2 TeZ 的优势
1.2.1 性能提升
以某大型电商公司的数据分析任务为例,该公司每天需要处理海量的用户交易数据。经过严格的性能测试,在使用传统 MapReduce 时,数据处理时间较长。然而,切换到 TeZ 框架后,数据处理时间缩短了约 30%。这一显著的性能提升主要得益于 TeZ 的 DAG 执行模式。

具体而言,TeZ 框架能更有效地利用集群资源。在处理大规模数据时,传统 MapReduce 由于频繁的磁盘 I/O 操作,会消耗大量时间在数据的读写上。而 TeZ 避免了这种情况,它直接在内存中传递数据,减少了磁盘操作的延迟。例如,对于一个包含数十亿条交易记录的数据集,TeZ 能够更快地完成数据处理任务,这在电商行业的实时数据分析、库存管理等场景中具有极大的价值。

为了更清晰地对比 TeZ 和传统 MapReduce 在处理大规模数据时的性能,我们列出以下表格(表 1:TeZ 与传统 MapReduce 处理大规模数据性能对比):
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/5552221e4fc22eda3e6968648eda587f..png

1.2.2 灵活性
TeZ 赋予用户更精细地控制作业执行流程的能力。在实际的数据处理场景中,这种灵活性尤为关键。例如,在数据清洗和转换环节,常常需要依据不同的业务规则动态调整处理逻辑。

与传统 MapReduce 相对固定的作业流程不同,TeZ 框架下的任务就像可灵活组合的模块。以金融行业的风险评估为例,根据不同的风险模型和业务需求,可能需要对数据进行不同方式的清洗、转换和分析。TeZ 允许根据这些复杂多变的需求轻松定制任务流程,比如针对不同类型的客户(如个人客户、企业客户)或者不同的交易类型(如转账、消费)制定差异化的处理逻辑。

二、TeZ 实战
2.1 环境搭建
首先,我们需要搭建 TeZ 的运行环境。假设我们已经有一个 Hadoop 集群,以下是安装 TeZ 的详细步骤:

# 1. 下载TeZ安装包
# 确保网络连接稳定,因为网络中断可能导致下载不完整。如果网络不稳定,可以使用支持断点续传的下载工具,如axel。
wget -P /opt/tez https://tez.apache.org/releases/tez - 0.9.2.tar.gz

# 2. 解压安装包
# 解压操作需要足够的磁盘空间,如果空间不足可能会解压失败。可以提前使用命令 'df -h' 检查目标磁盘的可用空间。
tar -zxvf /opt/tez/tez - 0.9.2.tar.gz -C /opt/tez/

# 3. 设置环境变量
export TEZ_HOME=/opt/tez/tez - 0.9.2
export PATH=$TEZ_HOME/bin:$PATH
# 设置完成后,可以通过命令 'echo $TEZ_HOME' 检查是否设置成功。如果没有成功,需要检查环境变量配置文件(如.bashrc或.bash_profile)中的语法是否正确。同时,还需注意环境变量的生效范围,如果是在当前终端设置,可能仅在当前终端有效,若要全局生效,可能需要修改系统级别的配置文件。

# 4. 兼容性检查
# 在安装TeZ之前,需要确保其与现有的Hadoop版本兼容。不同版本的TeZ可能对Hadoop版本有不同的要求,可以参考TeZ官方文档中的兼容性列表。例如,TeZ 0.9.2版本通常与Hadoop 2.7.x及以上版本兼容。如果存在兼容性问题,可能需要升级或降级Hadoop版本,或者选择其他版本的TeZ。

2.2 一个简单的 WordCount 示例
下面我们通过一个经典的 WordCount 示例来展示 TeZ 框架的使用。

import org.apache.tez.client.TezClient;
import org.apache.tez.dag.api.DAG;
import org.apache.tez.dag.api.Edge;
import org.apache.tez.dag.api.ProcessorDescriptor;
import org.apache.tez.dag.api.TezConfiguration;
import org.apache.tez.dag.api.Vertex;
import org.apache.tez.mapreduce.hadoop.MRInputFormat;
import org.apache.tez.mapreduce.hadoop.MRJobConfig;
import org.apache.tez.mapreduce.hadoop.MROutputFormat;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.StringTokenizer;

public class TeZWordCount {

public static class WordCountMapper extends Mapper {

private final static IntWritable one = new IntWritable(1);
private Text word = new Text();

public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}

public static class WordCountReducer extends Reducer {

private IntWritable result = new IntWritable();

public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}

public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
TezConfiguration tezConf = new TezConfiguration(conf);
TeZClient tezClient = new TeZClient("TeZWordCount", tezConf);
tezClient.start();

// 构建DAG(有向无环图)
// DAG是整个任务的逻辑架构,它定义了各个顶点(Vertex)之间的依赖关系,通过边(Edge)连接这些顶点,从而确定任务的执行顺序。
DAG dag = new DAG("word_count_dag");

Vertex inputVertex = Vertex.create("input", ProcessorDescriptor.create(new MRInputFormat()), 1);
Vertex mapVertex = Vertex.create("map", ProcessorDescriptor.create(new WordCountMapper()), 1);
Vertex reduceVertex = Vertex.create("reduce", ProcessorDescriptor.create(new WordCountReducer()), 1);
Vertex outputVertex = Vertex.create("output", ProcessorDescriptor.create(new MROutputFormat()), 1);

Edge inputToMap = Edge.create(inputVertex, mapVertex);
Edge mapToReduce = Edge.create(mapVertex, reduceVertex);
Edge reduceToOutput = Edge.create(reduceVertex, outputOutputVertex);

dag.addVertex(inputVertex);
dag.addVertex(mapVertex);
dag.addVertex(reduceVertex);
dag.addVertex(outputVertex);
dag.addEdge(inputToMap);
dag.addEdge(mapToReduce);
dag.addEdge(reduceToOutput);

Job job = Job.getInstance(conf, "TeZ WordCount");
job.setInputFormatClass(MRInputFormat.class);
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputFormatClass(MROutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setJarByClass(TeZWordCount.class);

Path inputPath = new Path("hdfs://input_path");
Path outputPath = new Path("hdfs://output_path");

MRInputFormat.addInputPath(job, inputPath);
MROutputFormat.setOutputPath(job, outputPath);

tezClient.submitDAG(dag);
tezClient.waitForCompletion();
tezClient.stop();
}
}


2.3 大规模数据处理中的优化
在处理大规模数据时,TeZ 框架还有一些优化技巧。

2.3.1 数据本地化
尽可能地让计算靠近数据存储位置,可以大大减少数据传输的开销。在 TeZ 中,可以通过合理配置任务调度策略来实现数据本地化。

在 TeZ 的配置文件(如 tez - site.xml)中,有一些关键的参数需要设置。对于一般的大规模数据处理场景:


tez.am.node - locality - enabled
true



tez.am.resource - memory - mb
4096



tez.task.resource - memory - mb
2048



为了更好地理解不同集群规模下数据本地化相关参数的设置,我们列出以下表格(表 2:不同集群规模下数据本地化参数设置参考):

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/4f691ddbf6566c65b56f0694a5960f26..png


2.3.2 内存管理
对于大规模数据处理,内存的合理使用至关重要。TeZ 允许用户根据作业的特点调整内存分配策略。

例如,对于数据缓存较多的作业,可以适当增加内存分配,以提高数据读取和处理的速度。在实际操作中,可以通过修改配置文件(如 tez - site.xml)中的内存相关参数来实现。


tez.runtime.io.sort.mb
512



tez.runtime.unordered.output.buffer.mb
1024



为了直观展示不同数据量下内存管理参数的设置,我们列出以下表格(表 3:不同数据量下内存管理参数设置参考):

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/aa9c4750f8f13b5f330bb370ba7aaf76..png


在调整这些参数时,需要综合考虑作业的特性、数据量大小以及集群的内存资源总量。如果设置不当,可能会导致内存溢出或者资源浪费。例如,如果作业的数据量较小,但设置了过大的内存参数,就会造成内存资源的浪费;而如果数据量很大,但内存参数设置过小,就可能导致内存溢出,从而使任务失败。同时,还可以参考集群的历史任务执行情况以及内存使用监控数据来优化这些参数的设置。

三、TeZ 在不同行业的应用
3.1 金融行业
在金融行业,每天都会产生海量的交易数据。TeZ 框架被广泛用于风险评估、市场趋势分析等任务。

例如,某银行利用 TeZ 对客户的交易历史数据进行分析,每天需要处理数百万笔交易记录。通过 TeZ 的高效数据处理能力,银行能够在短时间内完成对这些大量交易记录的分析,及时发现潜在的欺诈交易。

在这个过程中,TeZ 框架的性能提升和灵活性发挥了重要作用。从性能提升方面来看,TeZ 的 DAG 执行模式使得数据处理速度大大加快。由于金融交易数据的复杂性和规模庞大,传统的计算框架可能需要花费大量的时间来处理数据,而 TeZ 能够快速地在内存中传递数据,减少磁盘 I/O 操作,从而迅速处理大量的交易数据。根据行业研究表明,在处理金融交易数据时,TeZ 框架相比传统计算框架可将处理速度提高 3 - 5 倍。

为了更清晰地展示 TeZ 在金融行业数据处理速度上的优势,我们列出以下表格(表 4:TeZ 与传统计算框架处理金融交易数据速度对比):

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/ce55813eea675672813f429a2a429015..png

从灵活性方面来看,银行在进行风险评估和欺诈检测时,需要根据不同的业务规则和风险模型来分析数据。TeZ 框架允许银行根据这些复杂多变的需求灵活调整数据处理流程。例如,银行可以根据不同类型的客户(如个人客户、企业客户)或者不同的交易类型(如转账、消费)制定不同的风险评估规则,并在 TeZ 框架下轻松实现这些规则的定制化处理。此外,银行还可以根据市场动态和监管要求的变化,快速调整数据处理逻辑,以确保风险评估和欺诈检测的准确性和及时性。

3.2 医疗行业
医疗行业也面临着大量的数据处理需求,如电子病历分析、疾病预测等。TeZ 框架可以帮助医疗机构整合来自不同数据源的医疗数据,如患者的基本信息、诊断记录、治疗方案等。

例如,某大型医院利用 TeZ 框架分析了大量的糖尿病患者病历数据,包括患者的年龄、性别、血糖水平、并发症等信息。通过分析这些大规模数据,医院发现了一些之前未被注意到的疾病发展规律。

在这个过程中,TeZ 框架的性能提升有助于快速处理大量的病历数据。由于医疗数据的规模往往很大,而且需要及时处理以便为患者提供准确的医疗建议,TeZ 的高效数据处理能力能够满足这一需求。根据医院内部的统计数据,使用 TeZ 框架后,病历数据的处理时间缩短了约 40%。为了对比使用 TeZ 框架前后病历数据处理时间的变化,我们列出以下表格(表 5:使用 TeZ 框架前后病历数据处理时间对比):

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/0b2dcd476a4b6c48c707fd404d948432..png

同时,TeZ 的灵活性也为医疗数据的分析提供了便利。不同的疾病分析可能需要不同的处理逻辑,例如,对于糖尿病患者的分析可能需要关注血糖波动与并发症之间的关系,而对于心血管疾病患者则需要关注血压、血脂等指标。TeZ 框架可以根据这些不同的需求灵活调整数据处理流程,从而为医生提供更准确、更个性化的治疗方案建议。此外,随着医疗研究的不断发展和新的诊断方法的出现,医疗机构可以利用 TeZ 框架快速适应这些变化,对数据处理逻辑进行调整。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/atgfg/article/details/142676263



免责申明:
本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!
《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu
《数栈V6.0产品白皮书》下载地址:https://
fs80.cn/cw0iw1
想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs
同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群