Hadoop中的分布式文件处理?

Distributed file processing in 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集群来说不是很大,你有多少台机器?