hea*_*der 3 hadoop batch-processing apache-spark apache-flink
我有大量的压缩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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在mapper中,您可以使用Apache commons压缩库来解压缩tar文件https://commons.apache.org/proper/commons-compress/examples.html
您不需要将文件列表传递给Hadoop,只需将所有文件放在一个HDFS目录中,并将该目录用作输入路径.