我是hadoop的新手,我正在学习一些例子。我目前正在尝试传递一个随机整数的文件。对于每个数字,我希望它在运行时由用户指定的数字加倍。
3536 5806 2545 249 485 5467 1162 8941 962 6457 665 6754 889 5159 3161 5401 704 4897 135 907 8111 1059 4971 5195 3031 630 6265 827 5882 9358 9212 9540 676 3191 4995 8401 9857 4884 8002 3701 931 875 6427 6945 5483 545 4322 5120 1694 2540 9039 5524 872 840 8730 4756 2855 718 6612 4125
以上是文件样本。
例如,当用户在运行时指定
时 jar ~/dissertation/workspace/TestHadoop/src/DoubleNum.jar DoubleNum Integer Output 3
第一行的输出将是 3536 * 8 5806 * 8 2545 * 8 249 * 8 485 * 8 5467 * 8 1162 * 8 8941 * 8 962 * 8 6457 * 8
因为对于每次迭代,数字将是双倍的,因此对于3次迭代,它将是2 ^ 3。如何使用mapreduce实现这一目标?
答案 0 :(得分:0)
要将一份工作链接到下一份工作,请查看: Chaining multiple MapReduce jobs in Hadoop
此外,这可能是了解序列文件的好时机,因为它们提供了一种将数据从一个地图/减少作业传递到另一个地图的有效方法。
至于您的特定问题,此处不需要减速器,因此请将减速器的数量设置为零,以使其仅映射。将输出发送到reducer只会产生额外的网络开销。 (但是,请注意随着时间的推移创建的文件数量,最终NameNode将不会欣赏它。每个映射器将创建一个文件。)
我知道你试图用它作为一个更复杂的例子...但在这种情况下你可以使用一种常见的优化技术:如果你发现自己想要将一个仅映射器的任务链接到另一个映射/减少工作,你可以将两个地图集压缩在一起。例如,而不是乘以2,然后再增加2,再次为2,为什么不在乘以2和2乘以相同的映射器?基本上,如果所有操作都独立于一个数字或行,则可以在每个记录的同一映射器中应用迭代。这将显着减少开销。