我有几个要计算统计信息的目录。即我的映射器函数将一个文件夹树作为输入,并根据目录及其所有子目录的内容吐出一些静态信息。每个目录的计算都需要很长时间。没有 reducer 。
我可以为每个要处理的目录创建一个 tar/zip 文件,并将其复制到 HDFS 中。但是我如何确保为每个 tar 文件创建一个映射器并将 tar 文件的全部内容发送到该映射器(以便我可以遍历 tar 文件的内容并生成该文件的统计信息)?
如果可能,我更愿意在 Hadoop Streaming 中执行此操作。可以这样做吗?
最佳答案
我认为您在 HDFS 中有许多 tar/zip 文件作为您的 map/reduce 作业的输入?
在这种情况下,您必须实现自己的 InputFormat来处理这些。输入格式实现 (getSplits()
) 决定了splits 的数量,每个都获得一个单独的映射器。因此,如果您只为每个输入文件返回一个拆分,您就万事大吉了。
据我在文档中所见,Hadoop Streaming 中没有任何内容阻止您指定自己的 InputFormat;不过,这需要您编写一个 Java 类。 (问题是输入格式和基于脚本的映射器应该如何交互:据我了解,Hadoop 流式传输要求映射器通过标准输入接收其输入,即您不能轻易地传递 tar 文件本身以供脚本运行上。)
关于Hadoop:每个 tar/zip 文件一个映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30403862/