Hadoop中的分布式文件处理?

hea*_*der 3 hadoop batch-processing apache-spark apache-flink

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

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

mat*_*its 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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