MapReduce——数据切片与MapTask并行度决定机制

devtools/2024/12/22 18:44:08/

MapReduce——数据切片与MapTask并行度决定机制


MapReduce 数据切片和 Map 任务的并行度决定机制是 MapReduce 框架中两个重要的概念,它们直接影响作业的执行效率和性能。

1.数据切片(Data Splits

  • 数据切片是指将输入数据拆分成更小的块或片段,以便并行处理。

  • 在 MapReduce 中,数据切片是由 InputFormat 定义的,InputFormat 是负责将输入数据逻辑上分成独立的块并交给 Map 任务处理的组件。

  • 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

  • 数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储

  • 数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask

  • 数据切片的大小取决于多个因素,包括文件的大小、输入格式以及 Hadoop 配置中的一些参数。

  • 通常情况下,数据切片的大小会被设置为 HDFS 块大小的整数倍,以便尽可能地利用 Hadoop 分布式文件系统的数据复制和数据本地性特性。


2.并行度问题

MapTask 的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度。

思考:

  • 1G的数据,启动8个MapTask,可以提高集群的并发处理能力。
  • 那么1K的数据,也启动8个MapTask,会提高集群性能吗?
  • MapTask并行任务是否越多越好呢?
  • 哪些因素影响了MapTask并行度?

3.Map 任务的并行度决定机制

  • Map 任务的并行度取决于数据切片的数量和集群的可用资源。

  • 在运行时,MapReduce 框架会为每个数据切片启动一个 Map 任务,这些任务可以并行执行。

  • 但是,并不是每个数据切片都会有一个独立的 Map 任务,因为有时候数据切片的数量可能会超过集群中可用的 Map 任务槽(slots)数量

  • 在 Hadoop 中,默认情况下,一个数据切片会有一个 Map 任务来处理,但是这个规则并不是绝对的。

  • 有时候,框架可能会选择将多个数据切片分配给一个 Map 任务,以减少任务启动和管理的开销。这种情况下,一个 Map 任务会处理多个数据切片,但是任务的处理时间可能会更长。

  • Map 任务的并行度也受到集群资源的限制,包括可用的计算节点数量、每个节点的 CPU 和内存资源等。

  • 如果集群资源有限,那么可能无法同时启动足够数量的 Map 任务,这样就会影响作业的并行度和执行效率。


4.TextInputFormat

FileInputFormat 实现类

  • 思考:在运行MapReduce 程序时,输入的文件格式包括:基于行的日志文件、二进制格式文件、数据库表等。
  • 那么,针对不同的数据类型,MapReduce是如何读取这些数据的呢?
  • FileInputFormat 常见的接口实现类包括TextInputFormatKeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat 和自定义 InputFormat 等。

TextInputFormat 是 Hadoop 中的一种输入格式类,用于处理文本文件。它将文本文件视为一系列的行(即文本文件中的每一行都作为一个记录),并将每行作为一个键值对的键,其中键是文件中的偏移量(即行在文件中的位置),值是文本行内容。

工作原理

TextInputFormat 的工作原理如下:

  1. 切片: 切片是输入数据在 MapReduce 作业中的基本处理单元。TextInputFormat 默认按文件进行切片,每个文件作为一个切片。(大量小文件则处理效率很低)因此,如果输入目录包含多个文件,每个文件将会被视为一个独立的切片。

  2. 记录读取: 在每个切片内部,TextInputFormat 会将文本文件按行进行读取。它将每一行文本作为一个记录,并将文件中的偏移量作为记录的键。因此,每个键值对的键是一个长整型数值,表示文本行在文件中的位置;值是一个字符串,表示文本行的内容。

  3. 生成键值对: TextInputFormat 将每一行文本转换为一个键值对,其中键是文件中的偏移量,值是文本行内容。

  4. 传递给 Mapper: 生成的键值对将会作为 Mapper 的输入。Mapper 将会按照用户定义的逻辑对每个键值对进行处理,并生成中间结果。

示例

假设有一个文本文件包含以下内容:

Hello, world!
This is a sample text file.

使用 TextInputFormat 作为输入格式,该文件将被切分为两个记录(即两行文本),每个记录将被表示为一个键值对:

  • 键:0,值:“Hello, world!”
  • 键:15,值:“This is a sample text file.”

这些键值对将作为 Mapper 的输入,并根据用户定义的逻辑进行处理。例如,可以编写一个 Mapper,计算每个单词出现的次数,然后将结果传递给 Reducer 进行进一步处理。


5.CombineTextInputFormat 切片机制

框架默认的TextInputFormat 切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个 MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。

CombineTextInputFormat 是 Hadoop 中的一个输入格式类,用于处理文本文件。CombineTextInputFormat 用于小文件过多的场景,它的主要特点是将小文件进行合并,并生成更大的数据块,从而减少作业的 Map 任务数量,提高作业的执行效率。

与普通的 TextInputFormat 不同,CombineTextInputFormat 旨在减少由于小文件过多而导致的 Map 任务数量过多、任务启动慢、作业执行效率低下等问题。

切片机制详解

CombineTextInputFormat 的切片机制主要有以下特点:

  1. 按文件大小切片: 与普通的 TextInputFormat 类似,CombineTextInputFormat 也是按文件为单位进行切片的。每个输入文件都被视为一个独立的切片。

  2. 按行切片: 在文件内部,CombineTextInputFormat 将文件按行进行切片,与 TextInputFormat 相同。每行文本将被视为一个记录,并生成一个键值对。

  3. 合并小文件: CombineTextInputFormat 的一个关键特性是它会尝试合并小文件生成更大的切片。这样可以减少作业中 Map 任务的数量,提高作业的执行效率。合并小文件的具体方式取决于两个参数的配置:

    • mapreduce.input.fileinputformat.split.minsize:指定切片的最小大小。如果一个小文件的大小小于该阈值,它将会被合并到其他切片中。
    • mapreduce.input.fileinputformat.split.maxsize:指定切片的最大大小。如果一个文件过大,超过了该阈值,它将被拆分成更小的切片。
  4. 根据输入目录中文件的大小动态调整切片: CombineTextInputFormat 会根据输入目录中文件的大小动态调整切片的大小和数量,以尽可能地合并小文件。

示例

假设有一个输入目录包含了多个小文件,每个文件都是几百 KB 大小。如果使用 CombineTextInputFormat 作为输入格式,并设置了合适的参数,那么它会将这些小文件合并成更大的切片,并将其作为一个整体交给 Map 任务进行处理。这样做可以大大减少作业中 Map 任务的数量,提高作业的执行效率。

总之,CombineTextInputFormat 的切片机制通过合并小文件,生成更大的切片,从而减少作业的 Map 任务数量,提高作业的执行效率,特别适用于处理大量小文件的场景。

通过合并小文件并生成更大的切片,CombineTextInputFormat 可以减少作业中 Map 任务的数量,从而提高作业的执行效率。同时,它也能够更好地利用 Hadoop 分布式文件系统的数据本地性特性,减少数据传输的开销。


http://www.ppmy.cn/devtools/2008.html

相关文章

使用go和消息队列优化投票功能

文章目录 1、优化方案与主要实现代码1.1、原系统的技术架构1.2、新系统的技术架构1.3、查看和投票接口实现1.4、数据入库MySQL协程实现1.5、路由配置1.6、启动程序入口实现 2、压测结果2.1、设置Jmeter线程组2.2、Jmeter聚合报告结果,支持11240/秒吞吐量2.3、Jmeter…

vscode 配置go环境

https://www.zhihu.com/question/486786946/answer/2723663432 注意一定要安装最新版,否则不容易debug //main.go package main //说明hello.go这个文件在main这个包中import "fmt" //导入内置包,可以使用其中函数等func main() {fmt.Println("Hello…

自然语言处理NLP:文本预处理Text Pre-Processing

大家好,自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向,其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将介绍文本预处理的本质、原理、应用等内容,助力自然语言处理和模型的生成使用。 1.文本…

C++11的更新介绍(lamada、包装器)

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 lambda表达式 C98中的一个…

C++格式化输出开源库fmt入手教程

fmt项目快速上手指南 1. cmake环境配置 include(FetchContent) FetchContent_Declare(fmtGIT_REPOSITORY https://github.com/fmtlib/fmtGIT_TAG 10.0.0GIT_SHALLOW TRUE) # 1. 下载fmt库 FetchContent_MakeAvailable(fmt)add_executable(fmt_guide main.cpp) # 2. 链接fmt库…

云计算:OVS 集群 使用VXLAN 流表

目录 一、实验 1.环境 2. OVS 集群 使用VXLAN 流表(单租户) 3. OVS 集群 使用VXLAN 流表(多租户) 二、问题 1.如何添加VXLAN接⼝ 2.virsh修改云主机MAC报错 一、实验 1.环境 (1) 主机 表1 宿主机 主机架构软件IP网卡备…

大话设计模式之访问者模式

访问者模式是一种行为设计模式,它允许你在不修改对象结构的前提下定义作用于这些对象结构元素的新操作。 在访问者模式中,有两个核心概念: 访问者(Visitor):定义了对对象结构中每个元素的访问操作。每个访…

2023androidstudio

终于下定决心将studio升级到新版本使用了,在这总结下和之前的差别 问题一: 创建java类型的项目 在新版本studio中,创建android项目时,语言选择中没有java选项了,这让一直使用java开发的我摸索了好久,终于…