You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

avro-tools.jar无法识别Snappy压缩Avro文件的排查求助

问题描述

我有客户提供的采用Snappy压缩的.avro文件,目前仅持有avro-tools 1.11.3 jar包。执行任何操作时均出现如下错误:

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...using builtin-java classes where applicable
Exception in thread "main" org.apache.avro.AvroRuntimeException: Unrecognized codec: snappy
at org.apache.avro.file.CodecFactory.fromString(CodecFactory.java:159)
at org.apache.avro.file.DataFileStream.resolveCodec(DataFileStream.java:158)
at org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:144)
at org.apache.avro.file.DataFileStream.(DataFileStream.java:90)
at org.apache.avro.tool.DataFileReadTool.run(DataFileReadTool.java:93)
at org.apache.avro.tool.Main.run(Main.java:67)
at org.apache.avro.tool.Main.main(Main.java:56)

限制条件:无网络访问权限,无系统管理员权限,仅需将数据转换为JSON或文本格式。

补充信息:已解压avro-tools jar包,确认snappy-java已存在(包含org/xerial/snappy/SnappyCodec.class文件),当前使用OpenJDK 1.8.0_442,怀疑JDK版本或安全设置(如SELinux、FIPS模式)干扰,但无权限查看系统设置。

排查思路与可尝试操作

一、强制指定snappy-java类路径加载

avro-tools自带的snappy-java可能因类加载顺序问题未被识别,可手动提取并指定类路径:

  1. 从avro-tools-1.11.3.jar中提取内部的snappy-java-*.jar文件(可通过解压jar包找到对应版本)
  2. 执行转换命令时同时指定两个jar的类路径:
    • Linux/macOS:
    java -cp "snappy-java-*.jar:avro-tools-1.11.3.jar" org.apache.avro.tool.Main tojson your-file.avro
    
    • Windows:
    java -cp "snappy-java-*.jar;avro-tools-1.11.3.jar" org.apache.avro.tool.Main tojson your-file.avro
    

二、验证JDK兼容性与临时目录权限

  1. 检查JVM临时目录读写权限,手动指定可读写的临时目录:
    java -Djava.io.tmpdir=/path/to/your/writable/tmp -cp avro-tools-1.11.3.jar org.apache.avro.tool.Main tojson your-file.avro
    
    (替换/path/to/your/writable/tmp为你有权限读写的目录,比如用户主目录下的文件夹)
  2. 禁用Snappy本机库,强制使用纯Java实现:
    java -Dorg.xerial.snappy.use.systemlib=false -cp avro-tools-1.11.3.jar org.apache.avro.tool.Main tojson your-file.avro
    

三、绕过安全设置限制的尝试

如果怀疑SELinux/FIPS模式干扰,可尝试:

  1. 叠加参数强制使用纯Java实现并禁用额外压缩算法:
    java -Dorg.xerial.snappy.disable.bzip2=true -Dorg.xerial.snappy.use.systemlib=false -cp avro-tools-1.11.3.jar org.apache.avro.tool.Main tojson your-file.avro
    
  2. 将avro文件复制到你完全控制的目录(如用户主目录)后再执行操作,避免原目录的权限或安全限制。

四、手动编写Java代码解析(备选方案)

若以上方法均无效,可编写简单Java代码直接读取文件:

  1. 编写AvroToJson.java:
    import org.apache.avro.file.DataFileReader;
    import org.apache.avro.generic.GenericDatumReader;
    import org.apache.avro.generic.GenericRecord;
    import org.apache.avro.io.DatumReader;
    import java.io.File;
    
    public class AvroToJson {
        public static void main(String[] args) throws Exception {
            File file = new File(args[0]);
            DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
            DataFileReader<GenericRecord> dataFileReader = new DataFileReader<>(file, datumReader);
            GenericRecord record = null;
            while (dataFileReader.hasNext()) {
                record = dataFileReader.next(record);
                System.out.println(record.toString());
            }
            dataFileReader.close();
        }
    }
    
  2. 编译并运行:
    javac -cp avro-tools-1.11.3.jar AvroToJson.java
    java -cp ".:avro-tools-1.11.3.jar" AvroToJson your-file.avro
    
    (Windows系统将.:替换为.;)

内容的提问来源于stack exchange,提问作者user13803

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:33:14