【问题标题】:Is there any CombineParquetFileInputFormat exist?是否存在任何 CombineParquetFileInputFormat?
【发布时间】:2016-01-18 07:14:09
【问题描述】:

在我的项目中,我必须阅读 parquet 文件扔 MapReduce。有很多小尺寸的镶木地板文件。我需要一些组合 Parquet 输入格式,它可以根据拆分大小组合小文件,从而减少映射器的数量。如果有一些实用程序或任何简单的方法可以做到这一点,请告诉我。

谢谢

【问题讨论】:

    标签: java hadoop mapreduce parquet bigdata


    【解决方案1】:

    ParquetInputFormat 是支持多文件输入的 FileInputFormat 的子级。 所以,简而言之,你只是不需要 CombileParquetFileInputFormat

    只需使用 FileInputFormat.addInputPaths 来指定输入。

    ParquetInputFormat 的来源 https://github.com/Parquet/parquet-mr/blob/master/parquet-hadoop/src/main/java/parquet/hadoop/ParquetInputFormat.java

    附:如果您有很多小的镶木地板文件,则很可能您做错了什么。

    【讨论】:

    • 但是如果文件大小小于最大输入拆分大小,则向 FileInputFormat 添加路径不会导致创建较少数量的映射器。这样,映射器的数量将是输入文件的数量。
    • @agarwal_achhnera 看来你是对的。据我所见, ParquetInputSplit 仅包含一条路径。所以一个拆分不能包含来自不同文件的块。
    • 没错,这是我被卡住的主要问题,因为 ParquetInputSplit 仅包含一个路径,因此一个文件可以分为多个拆分,但一个文件不能引用一个拆分。如果您对此仍有任何替代想法,欢迎
    【解决方案2】:
    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/

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2013-04-27
      • 2011-11-02
      • 2018-05-30
      • 1970-01-01
      • 2016-09-07
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多