HBase执行NativeLibraryChecker报lz4 UnsatisfiedLinkError问题排查
问题根因
报错java.lang.UnsatisfiedLinkError是LZ4压缩算法的JNI方法签名不匹配导致,本质是版本混装问题,具体触发原因有两个:
- 升级Hadoop 3.3.3时未清理旧版本3.2.2的残留文件,
/opt/hadoop/lib/native目录下混有旧版本编译的原生库文件,和3.3.3版本Jar包内定义的JNI方法无法对应 - HBase 2.4.9自带的Hadoop依赖包版本与你部署的Hadoop 3.3.3版本不一致,类加载时优先加载了HBase目录下的旧版本Lz4Compressor类,去匹配3.3.3版本的原生库时方法签名对不上,直接抛出链接错误。
排查验证步骤
所有节点按顺序执行以下命令确认问题:
- 验证当前原生库加载状态
su - hbase -c 'hadoop checknative -a'
- 检查native目录下的库文件版本是否匹配3.3.3
ls -l /opt/hadoop/lib/native/ strings /opt/hadoop/lib/native/libhadoop.so.1.0.0 | grep "Hadoop 3\."
如果输出里出现Hadoop 3.2.2字样,就是旧库残留。
- 检查HBase自带Hadoop依赖版本
ls -l /opt/hbase/lib/ | grep hadoop-common
如果输出的Jar包版本不是3.3.3,就是依赖冲突。
- 额外确认hbase用户下的JAVA_HOME路径正确
su - hbase -c 'echo $JAVA_HOME' su - hbase -c 'java -version'
确保返回的是JDK 11.0.15的路径,不会加载到系统自带的其他JDK版本。
修复方案
注意:所有操作前必须先停掉所有HBase、HDFS服务,禁止在服务运行状态下替换文件,避免文件锁导致替换不生效。所有节点都要执行以下操作,不要只在单节点操作。
- 清理旧版本原生库残留
# 备份旧native目录 mv /opt/hadoop/lib/native /opt/hadoop/lib/native.bak.$(date +%F) # 从Hadoop 3.3.3官方安装包中提取原生库 tar -zxf /your/path/to/hadoop-3.3.3.tar.gz -C /tmp/ cp -r /tmp/hadoop-3.3.3/lib/native /opt/hadoop/lib/ # 配置正确权限 chmod -R 755 /opt/hadoop/lib/native chown -R root:root /opt/hadoop/lib/native
- 统一HBase和Hadoop的依赖版本
# 备份HBase自带的旧Hadoop依赖 mkdir -p /opt/hbase/lib/hadoop-jar-bak mv /opt/hbase/lib/hadoop-*.jar /opt/hbase/lib/hadoop-jar-bak/ # 拷贝Hadoop 3.3.3的对应Jar包到HBase lib目录 cp /opt/hadoop/share/hadoop/common/hadoop-*.jar /opt/hbase/lib/ cp /opt/hadoop/share/hadoop/hdfs/hadoop-*.jar /opt/hbase/lib/ # 删除不需要的测试、源码包 rm -f /opt/hbase/lib/hadoop-*-test.jar /opt/hbase/lib/hadoop-*-sources.jar /opt/hbase/lib/hadoop-*-javadoc.jar
- 补全Hadoop环境变量配置
编辑/opt/hadoop/etc/hadoop/hadoop-env.sh,在现有配置下新增一行:
export HADOOP_OPTS="-Djava.library.path=/opt/hadoop/lib/native"
- 验证修复结果
先启动HDFS集群,确认HDFS正常后,执行原生库检查命令:
su - hbase -c 'hbase org.apache.hadoop.util.NativeLibraryChecker'
正常输出会显示bzip2、zlib、lz4、zstd等所有原生库加载成功,无UnsatisfiedLinkError报错,之后再启动HBase服务即可。
内容的提问来源于stack exchange,提问作者ManSinhLee
相关产品推荐
相关产品推荐

