【发布时间】:2013-03-27 12:04:45
【问题描述】:
我目前正在尝试编写一个 map-reduce 作业,其中输入数据不在 HDFS 中,并且基本上无法加载到 HDFS 中,因为使用该数据的程序无法使用来自 HDFS 的数据,并且复制到 HDFS 中的数据太多,每个节点至少 1TB。
所以我在集群中的 4 个节点上都有 4 个目录。理想情况下,我希望我的映射器只接收这 4 个本地目录的路径并读取它们,使用类似 file:///var/mydata/... 的东西,然后 1 个映射器可以处理每个目录。即总共 16 个映射器。
但是,为了能够做到这一点,我需要确保每个节点正好有 4 个映射器,并且正好有 4 个映射器被分配到该机器的本地路径。这些路径是静态的,因此可以硬编码到我的文件输入格式和记录读取器中,但是我如何保证给定的拆分最终出现在具有已知主机名的给定节点上。如果它在 HDFS 中,我可以使用 FileInputFormat 的变体设置 isSplittable 为 false,hadoop 会处理它,但由于所有数据都是本地的,这会导致问题。
基本上,我想要的只是能够在集群中的每个节点上抓取一次本地目录结构,处理这些目录中的 SSTable 集合并发出行(在映射器上),并减少结果(在 reduce step) 进入 HDFS 进行进一步的批量处理。
我注意到 inputSplits 提供了一个 getLocations 函数,但我相信这并不能保证执行的位置,只会优化它,如果我尝试在每个映射器中使用 file:///some_path 我需要确保准确的位置否则很明显我可能最终会反复阅读一些目录,而另一些则根本没有。
任何帮助将不胜感激。
【问题讨论】:
标签: input hadoop mapreduce hdfs localityofreference