假设我有 N 个文件要使用 hadoop map-reduce 处理,假设它们很大,远远超出块大小,并且只有几百个。现在我想处理这些文件中的每一个,让我们假设字数统计示例。
我的问题是:创建一个输入是包含每个文件路径的文本文件的map-reduce作业与将每个文件直接发送到map函数(即连接所有文件并推送它们)有什么区别进入不同的映射器 [编辑]。
这些都是有效的方法吗?他们有什么缺点吗?
感谢您的及时回答,因为我的抽象可能遗漏了一些重要主题,所以我已经详细描述了我的问题:
我的应用程序中的 Hadoop HDFS 上有 N 个小文件,我只需要处理每个文件。因此,我使用 map 函数将 python 脚本应用于每个文件(实际上是图像 [我已经查看了那里的所有 hadoop 图像处理链接]),我知道小文件问题,典型的建议是将较小的文件分组,这样我们就可以避免移动文件的开销(基本建议使用序列文件或创建自己的数据结构,如 HIPI 的情况)。
这让我想知道我们不能告诉每个映射器查找他本地的文件并对其进行操作吗?
我还没有找到解决该问题的方法,这就是为什么我正在考虑将文件路径发送到每个映射器或它自己的文件。
为每个图像集合创建一个路径名列表似乎没问题,但正如评论中提到的,我失去了数据局部性属性。
现在,当我查看 hadoop 流接口时,它提到不同的部分基于通常用于文本文件的标准输入和标准输出进行通信。这就是我感到困惑的地方,如果我只是发送一个路径名列表,这不应该是一个问题,因为每个映射器只会尝试找到它分配的图像集合。但是当我查看字数统计示例时,输入是文件,然后在映射器中拆分,所以我很困惑是否应该将图像连接成组,然后像文本文档一样将这些连接的组发送到不同的映射器,或者如果我应该将图像连接起来,将它们留在hadoop HDFS中,然后将它们的路径传递给映射器......我希望这是有道理的......也许我完全离开了这里......
再次感谢!