在Hadoop中如何分割数据

在Hadoop中如何分割数据,hadoop,mapreduce,hadoop-partitioning,Hadoop,Mapreduce,Hadoop Partitioning,Hadoop是否根据程序中设置的映射器数量分割数据?也就是说,拥有一个大小为500MB的数据集,如果映射器的数量是200(假设Hadoop集群同时允许200个映射器),每个映射器是否都有2.5MB的数据 此外,是否所有映射器都同时运行,或者其中一些映射器可能以串行方式运行?当您将数据输入Hadoop分布式文件系统(HDFS)时,Hadoop会根据块大小(默认64 MB)拆分数据,并将块分布到集群中。因此,您的500 MB将分为8个块。它不取决于映射程序的数量,而是HDFS的属性 现在,当您运行M

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


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

当您将数据输入Hadoop分布式文件系统(HDFS)时,Hadoop会根据块大小(默认64 MB)拆分数据,并将块分布到集群中。因此,您的500 MB将分为8个块。它不取决于映射程序的数量,而是HDFS的属性

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

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


在您的例子中,假设将500 MB划分为8个块,即使您指定了200个映射器,也不是所有映射器都将处理数据,即使它们已初始化

我刚刚根据您的问题运行了一个示例MR程序,以下是我的发现

输入:小于该块大小的文件

案例1:映射器数量=1结果:启动了1个映射任务。输入拆分 每个映射器的大小(在本例中只有一个)与输入文件相同 尺寸

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

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

基于以上,对于小于块大小的文件

split size=总输入文件大小/启动的映射任务数。


注意:但请记住,映射任务的数量取决于输入拆分

相反。贴图器的数量取决于拆分的数量。实际上,您正在使用的是
InputFormat
的工作来创建拆分。在确定拆分的数量之前,您不知道映射器的数量。而且,并不总是根据HDFS块大小创建拆分。这完全取决于InputFormat的
getSplits()
方法内部的逻辑

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

只有基于
FileInputFormat
(用于处理存储在文件中的数据的InputFormat)的InputFormat才会根据输入文件的总大小(以字节为单位)创建拆分。但是,输入文件的文件系统块大小被视为输入拆分的上限。如果您有一个小于HDFS块大小的文件,则该文件只会得到一个映射器。如果希望有一些不同的行为,可以使用mapred.min.split.size。但这同样完全取决于InputFormat的getSplits()

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

回到你的问题上来。Hadoop允许200多个映射程序。话虽如此,仅仅500兆数据就有200个映射器是没有多大意义的。请始终记住,当您谈论Hadoop时,您正在处理非常庞大的数据。只向每个映射器发送2.5 MB数据将是一种过分的做法。是的,如果没有空闲的CPU插槽,那么某些映射程序可能会在当前映射程序完成后运行。但是MR框架非常智能,并且尽最大努力避免这种情况。如果要处理数据的机器没有任何空闲的CPU插槽,则数据将移动到附近有空闲插槽的节点,并进行处理


HTH

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

通常我们将较小的文件合并到较大的文件中(大小大于块大小)

不,不是这样

作业的映射器数量由框架定义

看看Apache教程链接

有多少张地图?

贴图的数量通常由输入的总大小决定,即输入文件的块总数

映射的正确并行级别似乎是每个节点大约10-100个映射,尽管已经为每个cpu灯光映射任务设置了300个映射。任务设置需要一段时间,因此最好至少花一分钟执行映射

因此,如果您希望输入10TB的数据,并且块大小为128MB,那么最终将得到82000个映射,除非使用Configuration.set(MRJobConfig.NUM_maps,int)(它仅向框架提供提示)将其设置得更高

回到您的问题:

也就是说,拥有一个500米大小的数据集