Hadoop中的分布式文件处理



我有大量压缩的tar文件,其中每个tar文件本身包含几个文件。我想提取这些文件,我想使用hadoop或类似的技术来加快处理速度。有解决这类问题的工具吗?据我所知,hadoop和类似的框架(如spark或flink)不直接使用文件,也不让您直接访问文件系统。我还想对提取的文件进行一些基本的重命名,并将它们移动到适当的目录中。

我可以想象一个解决方案,创建一个所有tar文件的列表。然后将该列表传递给映射器,单个映射器从列表中提取一个文件。这是一个合理的方法吗?

可以指示MapReduce使用一种输入格式,其中每个Mapper的输入都是单个文件。(来自https://code.google.com/p/hadoop-course/source/browse/HadoopSamples/src/main/java/mr/wholeFile/WholeFileInputFormat.java?r=3)

public class WholeFileInputFormat extends FileInputFormat<NullWritable, BytesWritable> {
  @Override
  protected boolean isSplitable(JobContext context, Path filename) {
    return false;
  }
  @Override
  public RecordReader<NullWritable, BytesWritable> createRecordReader(
    InputSplit inputSplit, TaskAttemptContext context) throws IOException,
  InterruptedException {
    WholeFileRecordReader reader = new WholeFileRecordReader();
    reader.initialize(inputSplit, context);
    return reader;
  }
}

然后,在您的映射器中,您可以使用Apache commons压缩库来解压缩tar文件https://commons.apache.org/proper/commons-compress/examples.html

您不需要将文件列表传递给Hadoop,只需将所有文件放在单个HDFS目录中,并使用该目录作为输入路径。

Distcp将文件从一个地方移动到另一个地方,你可以看看它的文档,但我不认为它提供任何解压缩或解包功能?如果一个文件比主存大,你可能会得到一些内存不足的错误。8gb对于Hadoop集群来说不是很大,你有多少台机器?

相关内容

  • 没有找到相关文章

最新更新