Hadoop中数据是如何分割的

2024-02-26

Hadoop是否根据程序中设置的mapper数量来分割数据?也就是说,有一个大小为 500MB 的数据集,如果 Mapper 的数量为 200 个(假设 Hadoop 集群允许同时存在 200 个 Mapper),那么每个 Mapper 是否分配了 2.5 MB 的数据?

此外,所有映射器是同时运行还是其中一些可能串行运行?


恰恰相反。映射器的数量是根据分割的数量决定的。事实上,这是InputFormat,您正在使用它来创建分割。在决定分割数量之前,您对映射器的数量一无所知。而且,分割并不总是根据 HDFS 块大小创建。这完全取决于内部的逻辑getSplits()您的InputFormat 的方法。

为了更好地理解这一点,假设您正在使用 MR 处理存储在 MySQL 中的数据。由于这种情况下不存在块的概念,因此总是基于 HDFS 块创建分片的理论失败了。正确的?那么分裂创建又如何呢?一种可能性是根据 MySQL 表中的行范围创建拆分(这就是DBInputFormat是一种用于从关系数据库读取数据的输入格式)。假设您有 100 行。那么您可能有 5 个分区,每个分区 20 行。

它仅适用于基于的输入格式FileInputFormat(用于处理文件中存储的数据的输入格式),分割是根据输入文件的总大小(以字节为单位)创建的。但是,输入文件的文件系统块大小被视为输入拆分的上限。如果您的文件小于 HDFS 块大小,您将只能获得该文件的 1 个映射器。如果你想要一些不同的行为,你可以使用mapred.min.split.size。但它再次完全取决于您的 InputFormat 的 getSplits() 。

MR与MR有本质区别split和HDFSblock人们经常对此感到困惑。块是物理数据块,而分割只是将被馈送到映射器的逻辑块。拆分不包含输入数据,它只是对数据的引用。那什么是分裂呢?分裂基本上有两件事:length in bytes和一组storage locations,它们只是主机名字符串。

回到你的问题。 Hadoop 允许超过 200 个映射器。话虽如此,为 500MB 的数据配备 200 个映射器并没有多大意义。永远记住,当您谈论 Hadoop 时,您正在处理非常庞大的数据。仅向每个映射器发送 2.5 MB 数据就显得有些过分了。是的,如果没有空闲的 CPU 插槽,那么某些映射器可能会在当前映射器完成后运行。但MR框架非常智能,会尽力避免这种情况。如果要处理数据的计算机没有任何空闲 CPU 插槽,则数据将移动到附近有可用插槽的节点并进行处理。

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hadoop中数据是如何分割的 的相关文章

随机推荐