【发布时间】:2016-01-18 07:14:09
【问题描述】:
在我的项目中,我必须阅读 parquet 文件扔 MapReduce。有很多小尺寸的镶木地板文件。我需要一些组合 Parquet 输入格式,它可以根据拆分大小组合小文件,从而减少映射器的数量。如果有一些实用程序或任何简单的方法可以做到这一点,请告诉我。
谢谢
【问题讨论】:
标签: java hadoop mapreduce parquet bigdata
在我的项目中,我必须阅读 parquet 文件扔 MapReduce。有很多小尺寸的镶木地板文件。我需要一些组合 Parquet 输入格式,它可以根据拆分大小组合小文件,从而减少映射器的数量。如果有一些实用程序或任何简单的方法可以做到这一点,请告诉我。
谢谢
【问题讨论】:
标签: java hadoop mapreduce parquet bigdata
ParquetInputFormat 是支持多文件输入的 FileInputFormat 的子级。 所以,简而言之,你只是不需要 CombileParquetFileInputFormat
只需使用 FileInputFormat.addInputPaths 来指定输入。
ParquetInputFormat 的来源 https://github.com/Parquet/parquet-mr/blob/master/parquet-hadoop/src/main/java/parquet/hadoop/ParquetInputFormat.java
附:如果您有很多小的镶木地板文件,则很可能您做错了什么。
【讨论】:
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.CombineFileRecordReader;
import org.apache.hadoop.mapreduce.lib.input.CombineFileRecordReaderWrapper; import org.apache.hadoop.mapreduce.lib.input.CombineFileSplit;
import parquet.avro.AvroReadSupport;
import parquet.hadoop.ParquetInputFormat;
import java.io.IOException;
public class CombineParquetInputFormat<T> extends CombineFileInputFormat<Void, T> {
@Override
public RecordReader<Void, T> createRecordReader(InputSplit split, TaskAttemptContext
context) throws IOException {
CombineFileSplit combineSplit = (CombineFileSplit) split;
return new CombineFileRecordReader(combineSplit, context, CombineParquetrecordReader.class);
}
private static class CombineParquetrecordReader<T> extends CombineFileRecordReaderWrapper<Void, T> {
public CombineParquetrecordReader(CombineFileSplit split, TaskAttemptContext context, Integer idx) throws
IOException, InterruptedException {
super(new ParquetInputFormat<T>(AvroReadSupport.class), split, context, idx);
}
} }
一个关于集成测试的很棒的博客 http://bytepadding.com/big-data/spark/combineparquetfileinputformat/
【讨论】: