3

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

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

4

2 回答 2

5

可以指示 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 公共压缩库来解压缩 tar 文件https://commons.apache.org/proper/commons-compress/examples.html

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

于 2015-08-05T09:06:49.580 回答
0

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

于 2015-08-10T06:50:56.253 回答