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