我目前正在尝试编写一个map reduce作业,其中输入数据不在hdfs中,基本上无法加载到hdfs中,因为使用数据的程序无法使用hdfs中的数据,并且有太多数据要复制到hdfs中,每个节点至少1tb。
所以我在集群中的4个节点上各有4个目录。理想情况下,我希望我的Map程序只接收这4个本地目录的路径并读取它们,使用类似file:///var/mydata/。。。然后一个Map器可以处理每个目录。i、 e.总共16名制图员。
然而,为了能够做到这一点,我需要确保我得到准确的4Map器每个节点和准确的4Map器已分配的路径本地到该机器。这些路径是静态的,因此可以硬编码到fileinputformat和recordreader中,但是如何保证给定的拆分最终在具有已知主机名的给定节点上进行。如果是在hdfs中,我可以使用一个varient on fileinputformat设置isplittable to false,hadoop会处理它,但是由于所有的数据都是本地的,这会导致问题。
基本上,我所希望的就是能够对集群中每个节点上的本地目录结构准确地爬网一次,处理这些目录中的sstable集合并发出行(在Map器上),并将结果(在reduce步骤中)减少到hdfs中以进行进一步的批量处理。
我注意到inputsplits提供了一个getlocations函数,但我认为这并不能保证执行的局部性,只会优化它,而且如果我尝试使用file:///每个Map器中的一些路径,我需要确保精确的局部性,否则我可能会重复读取一些目录,而其他的根本不读取。
任何帮助都将不胜感激。
1条答案
按热度按时间mbyulnm01#
我知道有三种方法可以做到。
1.)只需将数据加载到hdfs中,这是它不想做的。但这是值得尝试的,因为它将有助于未来的处理
2.)可以使用nlineinputformat。用每个节点中输入文件的url创建四个不同的文件。
将这些文件加载到hdfs中,并在这些文件上编写程序,以使用这些url访问数据并处理数据。如果将nlineinputformat与一行一起使用。您将处理16个Map器,每个Map器处理一个独占文件。这里唯一的问题是,一个节点上的数据很可能在另一个节点上处理,但是不会有任何重复处理
3.)您可以通过分别加载带有URL的上述四个文件来进一步优化上述方法。在加载这些文件时,您可以删除其他三个节点,以确保文件准确地到达数据文件在本地存在的节点。加载时,选择复制为1,这样块就不会被复制。这个过程将极大地提高Map处理本地文件的概率。
干杯