hdfs 中 Map Tas工作机制(Hadoop,hive,hdfs)

Map Tas

(1)Read阶段 :

Map Task通过用户编写的RecordReader ,从输入InputSplit中解析出一个个key/value。

(2)Map阶段:

该节点主要是将解析出的key/value交给用户编写map()函数处理 ,并产生一系列新的key/value。

(3)Collect收集阶段:

在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结 果。在该函数内部 ,它会将生成的key/value分区(调用Partitioner) ,并写入一个环形内存缓冲区中。

(4)Spill阶段 :

即"溢写" ,当环形缓冲区满后 ,MapReduce会将数据写到本地磁盘上 ,生成一个临时文件。需要 注意的是 ,将数据写入本地磁盘之前 ,先要对数据进行一次本地排序 ,并在必要时对数据进行合并、压缩等操作。

溢写阶段详情:

步骤1:

利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号partition进行排序,然后按照 key进行排序。这样 ,经过排序后 ,数据以分区为单位聚集在一起 ,且同一分区内所有数据按照key有序。

步骤2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N表示 当前溢写次数)中。如果用户设置了Combiner ,则写入文件之前 ,对每个分区中的数据进行一次聚集操作。

步骤3:将分区数据的元信息写到内存索引数据结构SpillRecord中 ,其中每个分区的元信息包括在临时文件中的偏 移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB ,则将内存索引写到文件 output/spillN.out.index中。

(5)Combine阶段 :

当所有数据处理完成后 ,MapTask对所有临时文件进行一次合并 ,以确保最终只会生成一个 数据文件。

End

当所有数据处理完后 ,MapTask会将所有临时文件合并成一个大文件 ,并保存到文件output/file.out中 ,同时生成 相应的索引文件output/file.out.index。

在进行文件合并过程中 ,MapTask以分区为单位进行合并。对于某个分区 ,它将采用多轮递归合并的方式。每轮合 并 io.sort.factor(默认100)个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到 最终得到一个大文件。

让每个MapTask最终只生成一个数据文件,可避免同时打开大量文件和同时读取大量小文件产生的随机读取带来的 开销。

相关推荐
William Dawson3 天前
【踩坑实录|Hive1\.2\.1数据服务接口5大疑难问题调试与全方位优化方案】
java·hive·spring boot
ha_lydms3 天前
Hologres 简介
大数据·hadoop·阿里云·mapreduce·yarn·dataworks·hologres
Francek Chen6 天前
【大数据处理与分析】实验5:MapReduce初级编程实践
大数据·hadoop·分布式·mapreduce
牛奶咖啡1310 天前
大数据Hadoop运维应用实践——HIVE与Hadoop实现整合_Hive的配置安装与使用
大数据·hive·hive的配置与安装·metastore服务的配置·hiveserver2服务配置·hive的常用sql操作·beeline的使用
Zhu75811 天前
在k8s集群环境部署高可用的Apache Hadoop3.1.1定制版集群
hadoop·kubernetes
还有你Y12 天前
软件工程架构
hadoop·架构·软件工程
向夏威夷 梦断明暄12 天前
基于Tez引擎的 Hive SQL 性能优化
hive·sql·性能优化
曾阿伦16 天前
Windows 下运行 Hadoop 并部署到 AWS EMR 指南
hadoop·windows·aws
极光代码工作室17 天前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化
liuxiaowei318 天前
Winform+WPF双框架实战:喷涂工艺SCADA上位机从0到1搭建(附采集监控源码+车间踩坑实录)
大数据·hadoop·wpf