我有大量压缩的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集群来说不是很大,你有多少台机器?