Input 节点本地映射减少作业

Input 节点本地映射减少作业,input,hadoop,mapreduce,hdfs,localityofreference,Input,Hadoop,Mapreduce,Hdfs,Localityofreference,我目前正在尝试编写一个map reduce作业,其中输入数据不在HDFS中,基本上无法加载到HDFS中,因为使用该数据的程序无法使用来自HDFS的数据,并且有太多数据无法复制到HDFS中,每个节点至少1TB 因此,我在集群中的4个节点上各有4个目录。理想情况下,我希望我的映射程序只接收这4个本地目录的路径,并使用类似file:///var/mydata/... 然后1个映射器可以处理每个目录。i、 e.共有16名制图员 但是,为了能够做到这一点,我需要确保每个节点恰好有4个映射器,并且恰好有4个

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

因此,我在集群中的4个节点上各有4个目录。理想情况下,我希望我的映射程序只接收这4个本地目录的路径,并使用类似file:///var/mydata/... 然后1个映射器可以处理每个目录。i、 e.共有16名制图员

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

基本上,我所希望的就是能够在集群中的每个节点上准确地抓取本地目录结构一次,处理这些目录中的sstable集合并发出行(在映射器上),并将结果(在reduce步骤中)减少到HDFS中以进行进一步的批量处理

我注意到inputSplits提供了一个getLocations函数,但我认为这并不能保证执行的局部性,只有在我尝试使用时才能对其进行优化file:///some_path 在每个映射器中,我需要确保精确的位置,否则我可能会重复读取某些目录,而其他目录则根本不读取


任何帮助都将不胜感激。

我知道有三种方法可以帮助您

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

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

file://192.168.2.3/usr/rags/data/DFile1.xyz
.......
您将这些文件加载到HDFS中,并在这些文件上编写程序,以使用这些URL访问数据并处理数据。如果将NLineInputFormat与1行一起使用。您将处理16个映射程序,每个映射程序处理一个独占文件。这里唯一的问题是,一个节点上的数据很可能在另一个节点上处理,但是不会有任何重复处理

3.)您可以通过分别加载带有URL的上述四个文件来进一步优化上述方法。加载这些文件时,您可以删除其他三个节点,以确保文件准确地到达数据文件在本地存在的节点。加载时,选择复制为1,以便不复制块。此过程将在很大程度上增加启动地图处理本地文件的可能性

干杯
Rags

感谢您的建议,1不好,需要不断更新,以便数据只在一天左右的时间内有用,并且由于我正在读取的文件是活动数据库的一部分,因此数据将更加陈旧。2很有趣,NLineInputFormat听起来像答案的一部分,但正如您所指出的,并不能保证位置。3.听起来似乎有道理,但是你说的删除其他3个节点是什么意思,我不能让集群的一部分离线如果这是你的意思,集群也需要能够响应其他作业,考虑到可能的运行时间,这必须是一项后台任务。嗨,Feldoh,你说得对。脱机参与群集。现在我明白了这是不可能的,因为它是一个生产集群。使用上述方法时,确保它在本地运行的一种方法是检查映射中的文件位置,如果它是远程的,则抛出异常以使任务失败。作业跟踪器将一直尝试,直到任务成功为止,这意味着它将在本地找到文件。但这是一种粗糙的方法。为了使工作继续下去,您可能需要将映射任务的最大尝试次数增加到一个较高的数字。我已经考虑过这种方法,正如您所说,它有点粗糙,理论上仍然可能永远不会选择某些节点,但如果这是我所能做的,那么就是这样,感谢您的建议,我非常感谢您花时间。