节点 - 本地映射减少了作业

时间:2013-03-27 12:04:46

标签: input hadoop mapreduce hdfs localityofreference

我目前正在尝试编写一个map-reduce作业,其中输入数据不在HDFS中,并且基本上无法加载到HDFS,因为使用数据的程序无法使用来自HDFS的数据,并且将其复制到HDFS中太多了,每个节点至少1TB。

所以我的集群中的每个节点都有4个目录。理想情况下,我希望我的映射器只接收这4个本地目录的路径并使用类似file:/// var / mydata / ...的方式读取它们,然后1个映射器可以处理每个目录。总共16个Mappers。

但是为了能够做到这一点,我需要确保每个节点准确地获得4个映射器,并且确切地说已经为该机器分配了本地路径的4个映射器。这些路径是静态的,因此可以硬编码到我的fileinputformat和recordreader中,但是我如何保证给定的拆分最终在具有已知主机名的给定节点上。如果它在HDFS中,我可以在FileInputFormat设置上使用varient将isSplittable设置为false,而hadoop会处理它,但由于所有数据都是本地的,这会导致问题。

基本上我只想要能够在我的集群中的每个节点上只抓取一次本地目录结构,在这些目录中处理SSTables的集合并发出行(在mapper上),并减少结果(在reduce中)步骤)进入HDFS进行进一步的批量处理。

我注意到inputSplits提供了一个getLocations函数,但我相信这并不能保证执行的局部性,只是优化它并且清楚如果我尝试在每个映射器中使用file:/// some_path我需要确保精确的局部性我可能会反复阅读一些目录,而其他目录则完全没有。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我看到有三种方法可以做到。

1。)只需将数据加载到HDFS中,您不想这样做。但值得尝试,因为它对将来的处理有用

2.。)您可以使用NLineInputFormat。使用每个节点中输入文件的URL创建四个不同的文件。

file://192.168.2.3/usr/rags/data/DFile1.xyz
.......

您将这些文件加载​​到HDFS并在这些文件上编写程序,以使用这些URL访问数据数据并处理您的数据。如果您使用带有1行的NLineInputFormat。您将处理16个映射器,每个映射器处理一个独占文件。这里唯一的问题是,很可能一个节点上的数据可能在另一个节点上处理,但不会有任何重复处理

3.)您可以通过单独加载上述四个文件来进一步优化上述方法。在加载任何这些文件时,您可以删除其他三个节点,以确保文件完全转到数据文件本地存在的节点。加载时选择复制为1,以便不复制块。此过程将增加映射启动处理本地文件的可能性。

干杯 碎布