在最短的时间内处理多个文件

时间:2013-02-15 09:01:46

标签: hadoop mapreduce

我是hadoop的新手。基本上我正在编写一个程序,它需要两个超过3个GB的multifasta文件(ref.fasta,query.fasta).....

ref.fasta:

  

GI | 12345   ATATTATAGGACACCAATAAAATT ..

     

GI | 5253623   AATTATCGCAGCATTA ...

..等等..

query.fasta:

  

查询   ATTATTTAAATCTCACACCACATAATCAATACA   AATCCCCACCACAGCACACGTGATATATATACA   CAGACACA ...

对于每个映射器,我需要提供一部分ref文件和整个查询文件。 即

  

GI | 12345   ATATTATAGGACACCAATA ....   (来自ref文件的单个fasta序列)

和整个查询文件。因为我想在mapper中运行一个exe,它将这两个作为输入。

所以我在外面处理ref.fasta然后把它交给mapper?或者其他的东西.. ?? 我只需要花费最少时间的方法。

感谢。

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。

我建议您预处理您的ref文件并将其拆分为多个文件(每个序列一个)。 然后将这些文件复制到hdfs上的一个文件夹中,该文件夹将在main方法中设置为输入路径。 然后实现自定义输入格式类和自定义记录阅读器类。您的记录阅读器只会将本地文件分割路径的名称(作为文本值)传递给map方法的key或value参数。

对于所有map函数都需要的查询文件,再次将查询文件添加到hdfs,然后将其添加到main方法的DistributedCache中。 在map方法中,您将可以访问两个本地文件路径,并可以将它们传递给您的exe。

希望有所帮助。

我遇到了类似的问题并最终重新实现了blast exe文件的功能,因此我不需要处理我的map方法中的文件读取,而是可以处理整个Java对象(Genes和Genomes)。我的自定义记录阅读器从输入文件中解析,然后作为对象传递给我的地图函数。

干杯,韦恩。

答案 1 :(得分:0)

您的用例的最佳方法可能是将查询文件放在distributed cache中,并在configure() / setup()中准备好文件对象,以便在{{{3}}中使用1}}。并将ref文件作为正常输入。

您可以执行以下操作:

map()中将查询文件添加到分布式缓存中:

run()

现在让mapper类如下:

公共静态类MapJob扩展MapReduceBase实现Mapper {                 文件queryFile;

DistributedCache.addCacheFile(new URI(queryFile-HDFS-Or-S3-Path), conf);