簡體   English   中英

Apache 依賴錯誤? org.apache.parquet.hadoop.codec.SnappyCodec 未找到 apache 庫中的錯誤

[英]Apache dependency bug? org.apache.parquet.hadoop.codec.SnappyCodec was not found Error in apache library

目前正在嘗試在不使用 Spark 的情況下讀取 Java 中的 parquet 文件。 這是我到目前為止所擁有的,基於Adam Melnyk 關於該主題的博客文章

代碼

        ParquetFileReader reader = ParquetFileReader.open(file);
        MessageType schema = reader.getFooter().getFileMetaData().getSchema();
        List<Type> fields = schema.getFields();
        PageReadStore pages;
-->     while ((pages = reader.readNextRowGroup()) != null) {
            long rows = pages.getRowCount();
            LOG.info("Number of rows: " + rows);
            MessageColumnIO columnIO = new ColumnIOFactory().getColumnIO(schema);
            RecordReader recordReader = columnIO.getRecordReader(pages, new GroupRecordConverter(schema));

            for (int i = 0; i < rows; i++) {
                SimpleGroup simpleGroup = (SimpleGroup) recordReader.read();
                simpleGroups.add(simpleGroup);
            }
        }

(請注意,箭頭是我的代碼中引發錯誤的行(167))

錯誤信息

org.apache.parquet.hadoop.BadConfigurationException: Class org.apache.parquet.hadoop.codec.SnappyCodec was not found
        at org.apache.parquet.hadoop.CodecFactory.getCodec(CodecFactory.java:243)
        at org.apache.parquet.hadoop.CodecFactory$HeapBytesDecompressor.<init>(CodecFactory.java:96)
        at org.apache.parquet.hadoop.CodecFactory.createDecompressor(CodecFactory.java:212)
        at org.apache.parquet.hadoop.CodecFactory.getDecompressor(CodecFactory.java:201)
        at org.apache.parquet.hadoop.CodecFactory.getDecompressor(CodecFactory.java:42)
        at org.apache.parquet.hadoop.ParquetFileReader$Chunk.readAllPages(ParquetFileReader.java:1519)
        at org.apache.parquet.hadoop.ParquetFileReader$Chunk.readAllPages(ParquetFileReader.java:1402)
        at org.apache.parquet.hadoop.ParquetFileReader.readChunkPages(ParquetFileReader.java:1023)
        at org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:928)
        at [myClassPath]([myClass].java:167)

依賴項

   <groupId>org.apache.hadoop</groupId>
   <artifactId>hadoop-hdfs</artifactId>
   <version>3.1.1.3.1.4.0-315</version>
 </dependency>
 <dependency>
   <groupId>org.apache.hadoop</groupId>
   <artifactId>hadoop-common</artifactId>
   <version>3.1.1.3.1.4.0-315</version>
 </dependency>
 <dependency>
   <groupId>org.apache.spark</groupId>
   <artifactId>spark-launcher_2.12</artifactId>
   <version>3.0.0-preview2</version>
 </dependency>
 <dependency>
   <groupId>org.apache.parquet</groupId>
   <artifactId>parquet-avro</artifactId>
   <version>1.12.0</version>
 </dependency>

似乎無法從 CodecFactory class 中找到 SnappyCodec class,但我查看了我引用的庫,並且 class 在那里: referenced_libraries

CodecFactory 應該能夠識別 SnappyCodec class。 有什么建議嗎? 謝謝

找到了解決方案。

所以問題是 SnappyCodec class 被我為我的應用程序配置的 maven 遮蔽插件遮蔽。

I realized this after packaging the jar with maven, opening that jar with WinZip, and checking the codec directory of the packaged jar (where I found the SanppyCodec.class no longer existed).

解決方案是我需要將以下過濾器添加到我的 maven 陰影插件的配置中:

<filter>
    <artifact>org.apache.parquet:parquet-hadoop</artifact>
    <includes>
          <include>**</include>
    </includes>
</filter>
<filter>
    <artifact>org.apache.parquet:parquet-column</artifact>
    <includes>
          <include>**</include>
    </includes>
</filter>
<filter>
    <artifact>org.apache.parquet:parquet-encoding</artifact>
    <includes>
          <include>**</include>
    </includes>
</filter>

基本上,maven-shade 正在對 parquet-hadoop 工件中看似隨機的類進行着色,因此通過添加<include>過濾器,maven-shade 不會對其中的任何類進行着色,因此不會對其中的 SnappyCodec.class 文件進行着色。

完成此操作后,我需要添加其他兩個過濾器,因為通過在 parquet-hadoop 工件上使用<include>標記,它會將所有其他 parquet-* 工件排除在已編譯的 jar 中。 因此,我需要明確告訴它包含 parquet-column 和 parquet-encoding,因為我的應用程序在這些工件中使用了其他一些類。

這種配置意味着 maven-shader 不會觸及這三個工件,這意味着在編譯時間之前存在於這些工件中的任何 class 在使用 maven 編譯/打包它們之后都將保留在那里(因此,將在運行時存在,而它們之前沒有,導致原始錯誤)。 驚人的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM