【问题标题】:Hadoop: One mapper for each tar/zip fileHadoop:每个 tar/zip 文件一个映射器
【发布时间】:2015-05-22 18:47:56
【问题描述】:
我有几个要计算统计信息的目录。即我的映射器函数将一个文件夹树作为输入,并根据目录及其所有子目录的内容吐出一些静态数据。每个目录的计算都需要很长时间。没有减速器。
我可以为每个要处理的目录创建一个 tar/zip 文件并将其复制到 HDFS。但是如何确保为每个 tar 文件创建一个映射器,并将 tar 文件的全部内容发送到该映射器(以便我可以遍历 tar 文件的内容并为该文件生成统计信息)?
如果可能,我更愿意在 Hadoop Streaming 中执行此操作。可以这样做吗?
【问题讨论】:
标签:
hadoop
hadoop-streaming
【解决方案1】:
我认为您在 HDFS 中有许多 tar/zip 文件作为 map/reduce 作业的输入?
在这种情况下,您必须实现自己的InputFormat 来处理这些问题。输入格式实现 (getSplits()) 确定 splits 的数量,每个分割器都有一个单独的映射器。因此,如果您只为每个输入文件返回一个拆分,则一切就绪。
据我在文档中看到的,Hadoop Streaming 中没有任何内容阻止您指定自己的 InputFormat;不过,这需要您编写一个 Java 类。 (问题是 inputformat 和基于脚本的映射器应该如何交互:据我了解,Hadoop 流式传输需要映射器通过标准输入接收其输入,即您不能轻易传递 tar 文件本身以供脚本操作开。)