通常Hadoop拆分文件并将每个拆分发送到每台机器,但我想让每台机器处理相同的文件(不是文件的拆分),然后将结果发送到reduce,并在reduce过程中将它们汇总所有的结果。我怎样才能做到这一点?任何人都可以帮助我吗?
答案 0 :(得分:0)
好的..这可能不是确切的解决方案,但实现这一目标的一种肮脏方式是:
set FileInputFormat.setMaxInputSplitSize(job, size)
其中size参数的值必须大于输入文件大小(以字节为单位),可以使用java length()
类的File
方法计算。它确保每个文件只有一个映射器,并且您的fie不会被拆分。
现在为每台机器使用MultipleInputs.addInputPath(job, input_path, InputFormat.class)
,这些机器将在每台机器上运行单个映射器。
根据您的要求,减少功能不需要任何更改。
脏部件这里是 - MultipleInputs.addInputPath
需要唯一的路径。因此,您可能必须将相同的文件复制到您想要的映射器的数量,并为它们提供唯一的名称,并将其提供给MultipleInputs.addInputPath
的参数。如果您提供相同的路径,它将被忽略。
答案 1 :(得分:0)
您的问题是您遇到了多个问题。我想(你想)做什么:
我将这些分解为两个单独的简单地图/缩小。 mapreduce用于生成随机样本。第二步分别对每个样本求和。
现在可能有一种聪明的方法可以一次完成这一切,但除非你有一些不寻常的限制,否则我会感到惊讶,如果它值得额外的复杂性。