如何在Hadoop中拆分数据

时间:2013-07-03 22:27:07

标签: hadoop mapreduce hadoop-partitioning

Hadoop是否根据程序中设置的映射器数量拆分数据?也就是说,如果映射器的数量为200(假设Hadoop集群同时允许200个映射器),则拥有大小为500MB的数据集,每个映射器是否给出了2.5 MB的数据?

此外,所有的映射器是否同时运行,或者其中一些可以串行运行?

5 个答案:

答案 0 :(得分:25)

反过来说。映射器的数量取决于分割的数量。实际上,您正在使用InputFormat来创建分割。在决定分割数量之前,您不知道映射器的数量。并且,并不总是根据HDFS块大小创建拆分。它完全取决于InputFormat的getSplits()方法中的逻辑。

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

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

MR split和HDFS block之间存在根本区别,人们常常对此感到困惑。块是物理数据,而拆分只是一个逻辑块,它将被送到映射器。拆分不包含输入数据,它只是对数据的引用。什么是拆分?拆分基本上有两件事:一个length in bytes和一组storage locations,它们只是主机名字符串。

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

HTH

答案 1 :(得分:6)

当您将数据输入Hadoop分布式文件系统(HDFS)时,Hadoop会根据块大小(默认为64 MB)拆分数据,并在整个群集中分配块。所以你的500 MB将分成8块。它不依赖于映射器的数量,而是HDFS的属性。

现在,当您运行MapReduce作业时,默认情况下Hadoop会为每个块分配1个映射器,因此如果您有8个块,则hadoop将运行8个映射任务。

但是,如果明确指定映射器的数量(即200),则每个映射处理的数据大小取决于块的分布以及映射器在哪个节点上运行。实际处理数据的映射器数量取决于您的输入拆分。

在您的情况下,假设500 MB分为8个块,即使您指定了200个映射器,并非所有这些都将处理数据,即使它们已初始化。

答案 2 :(得分:0)

我刚刚根据您的问题运行了一个样本MR程序,这是我的发现

输入:一个小于块大小的文件。

  

案例1:mapper的数量= 1结果:启动了1个地图任务。 Inputsplit   每个映射器的大小(在这种情况下只有一个)与输入文件相同   大小

     

案例2:映射器数量= 5结果:启动了5个映射任务。   每个映射器的Inputsplit大小是输入文件大小的五分之一。

     

案例3:地图制作者数量= 10结果:启动了10个地图任务。   每个映射器的Inputsplit大小是输入文件大小的十分之一。

基于以上所述,对于文件少于块大小,

拆分大小=总输入文件大小/启动的地图任务数量。

注意:但请记住,不。 map任务的基于输入拆分决定。

答案 3 :(得分:0)

如果200个映射器正在运行500mb的数据,那么您需要检查每个文件的大小。如果该文件大小小于块大小(64 mb),那么它将为每个文件运行map任务。

通常我们会合并大文件中的较小文件(大小超过块大小)

答案 4 :(得分:0)

没有。不是。

作业的Mapper数量由Framework定义。

查看Apache MapReduce教程链接。

有多少地图?

  

地图数量通常由输入的总大小驱动,即输入文件的总块数。

地图的正确并行度似乎是每个节点大约10-100个地图,尽管已经为非常cpu-light地图任务设置了300个地图。任务设置需要一段时间,因此最好是地图至少需要一分钟才能执行。

因此,如果你期望10TB的输入数据并且块大小为128MB,那么你将得到82,000个地图,除非Configuration.set(MRJobConfig.NUM_MAPS,int)(它只提供一个提示)框架)用于将其设置得更高

回复您的问题:

  

也就是说,如果映射器的数量是200(假设Hadoop集群同时允许200个映射器),那么拥有大小为500MB的数据集,每个映射器是否给出了2.5 MB的数据?

如果DFS阻止和输入拆分大小 128 MB ,则 500 MB 文件需要 4 Mappers 处理数据。在上面的例子中,Framework将运行4个Mapper任务。

  

所有映射器是否同时运行还是其中一些可以串行运行?

所有Mappers同时运行。但只有当所有Mapper的输出都被复制并可用时,Reducer才会运行。