我是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?或者其他的东西.. ?? 我只需要花费最少时间的方法。
感谢。
答案 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);