我有一个map-reduce作业,其输入是一个大数据集(假设大小为100GB)。这个map-reduce作业的作用是将大数据拆分为块并写入单独的文件,每个数据块一个。也就是说,作业的输出是多个文件,每个文件的大小为 64MB。
此 map-reduce 作业的输出将用作另一个 map-reduce 作业的输入。由于新输入由多个文件组成,每个文件的大小为 64MB,因此第二个 map-reduce 作业中的每个映射器是只读取一个文件还是可能读取多个文件?
默认情况下,JobTracker 会将映射任务分配给一个块。您可以使用 CombineFileInputFormat 来绕过此行为,并将多个块 blob 为一个输入拆分(但这不是您要要求的)。
在您的情况下,如果您的文件超过 64MB 并且您的默认块大小为 64MB,则每个 ~64MB 文件最终可能会有两个块,这可能很糟糕。如果所有文件都低于块大小,则应为每个块获取一个映射器。
我想知道为什么你有第一个mapreduce工作。你基本上是在免费重新创建Hadoop为你做的事情。如果你有一堆加起来高达100GB的大文件,让Hadoop的块为你做这种"拆分"。例如,使用 64MB 块大小的 140MB 文件将自动拆分为 64MB、64MB 和 12MB 块。将生成三个映射器来处理该文件。