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



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

参考:

gi | 12345附件。。

吉|5253623aatatcgcagcatta。。。

等等。

query.fasta:

查询aatcccccacagcacacgtgatatatatacaCAGACACA。。。

NOw到每个映射器,我需要给出ref文件的单个部分和整个查询文件。即

gi | 12345阿塔塔加卡卡塔。。。。(参考文件中的单个fasta序列)

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

那么我要在外面处理ref.fasta,然后把它交给mapper吗?或者其他什么。。??我只需要最短时间的方法。

谢谢。

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

您可以执行以下操作:

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

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

现在有一个mapper类,如下所示:

公共静态类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.
            }
}

我也遇到了类似的问题。

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

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

希望能有所帮助。

我也遇到了类似的问题,最终重新实现了blast.exe文件的功能,这样我就不需要在映射方法中处理读取文件的问题,而是可以处理Java对象(基因和基因组),这些对象是由我的自定义记录读取器从输入文件中解析出来的,然后作为对象传递给我的映射函数。

干杯,韦恩。

相关内容

  • 没有找到相关文章

最新更新