-1

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

ref.fasta:

gi|12345 ATATTATAGGACACCAATAAAATT..

gi|5253623 AATTATCGCAGCATTA...

..等等..

查询.fasta:

查询 ATTATTTAAATCTCACACCACATAATCAATACA AATCCCCACCACAGCACACGTGATATATACA CAGACACA...

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

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

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

所以我要在外面处理 ref.fasta,然后把它交给 mapper 吗?或者别的什么..??我只需要花费最少时间的方法。

谢谢。

4

2 回答 2

0

我遇到了类似的问题。

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

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

希望有帮助。

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

干杯,韦恩。

于 2013-02-15T12:39:09.863 回答
0

您的用例的最佳方法可能是将查询文件放在分布式缓存configure()中,并在/中准备好文件对象setup()以在map(). 并将 ref 文件作为正常输入。

您可以执行以下操作:

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

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

现在有如下映射器类:

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

    @Override
    public void configure(JobConf job) {

        Path queryFilePath = DistributedCache.getLocalCacheFiles(job)[0];
                    queryFile = new File(queryFilePath.toString());
            }

            @Override
    public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter)
            throws IOException {
            // Use the queryFile object and [key,value] from your ref file here to run the exe file as desired.
            }
}
于 2013-02-15T22:01:25.933 回答