Hadoop是否基于程序中设置的映射器数量来切分数据?也就是说,如果有一个大小为500MB的数据集,如果映射器数为200(假设Hadoop集群同时允许200个映射器),则每个映射器会被分配2.5MB的数据吗?
此外,所有映射器是否都同时运行,还是有一些可能会串行运行?
Hadoop是否基于程序中设置的映射器数量来切分数据?也就是说,如果有一个大小为500MB的数据集,如果映射器数为200(假设Hadoop集群同时允许200个映射器),则每个映射器会被分配2.5MB的数据吗?
此外,所有映射器是否都同时运行,还是有一些可能会串行运行?
InputFormat
应该创建这些拆分,因此在确定拆分数之前,你不知道映射器的数量。而且,并不总是基于HDFS块大小来创建拆分。这完全取决于getSplits()
方法内部的逻辑。DBInputFormat
所做的事情,一种从关系型数据库中读取数据的InputFormat)。比如说你有100行数据,那么你可能会有5个包含每个20行的拆分。FileInputFormat
(用于处理存储在文件中的数据)的InputFormats才会根据输入文件的总大小(以字节为单位)创建拆分。但是,输入文件的FileSystem块大小被视为输入拆分的上限。如果你有一个小于HDFS块大小的文件,你将只得到一个映射器。如果你想要一些不同的行为,你可以使用mapred.min.split.size。但这又完全取决于你的InputFormat中的getSplits()方法。split
和HDFS的block
之间有根本的区别,人们经常对此感到困惑。一个块是实际的数据块,而拆分只是将要提供给映射器的逻辑块。拆分不包含输入数据,它只是对数据的引用。那么什么是拆分呢?拆分基本上有两个东西:以字节为单位的长度和一组存储位置,这些位置只是主机名字符串。回到您的问题。Hadoop允许使用超过200个mapper。话虽如此,对于只有500MB数据的情况下,拥有200个mapper并没有太多意义。请时刻记住,当涉及到Hadoop时,您处理的是非常庞大的数据。向每个mapper发送仅2.5MB的数据会导致过度运行。如果没有可用的CPU插槽,则某些mapper可能会在当前mapper完成后运行。但是MR框架非常智能,并尽力避免这种情况。如果需要处理的数据所在的机器没有任何可用的CPU插槽,则数据将转移到附近的有空闲插槽的节点进行处理。
希望对您有所帮助。
不,这不是。
一项工作的映射器数量由框架定义。
请查看 Apache MapReduce 教程链接。
多少个映射?
映射数通常由输入数据的总大小(即输入文件块的总数)驱动。
映射的正确并行级别似乎在每个节点的10-100个映射之间,尽管已经为非常轻的 CPU 映射任务设置了高达300个映射。任务设置需要一段时间,因此最好让映射器执行时间至少为一分钟。
因此,如果您预计有 10TB 的输入数据,并且块大小为 128MB,则除非使用 Configuration.set(MRJobConfig.NUM_MAPS, int)(它仅向框架提供提示)将其设置得更高,否则您将获得 82,000 个映射。
回到您的查询:
假设Hadoop集群允许200个Mapper同时运行,那么如果数据集大小为500MB,每个Mapper是否会获得2.5MB的数据?