Kafka2.1.1使用snappy压缩的问题
问题现象
服务端安装的kafka版本是2.1.1,当生产者配置了compression.type=snappy时,发送数据会失败,服务端如下抛出异常:
[2019-09-19 09:23:20,869] ERROR [ReplicaManager broker=0] Error processing append operation on partition test-produce-2 (kafka.server.ReplicaManager)
java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.7-a9582661-ddd7-45ff-8fef-862644d0ed2e-libsnappyjava.so: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /tmp/snappy-1.1.7-a9582661-ddd7-45ff-8fef-862644d0ed2e-libsnappyjava.so) (Possible cause: architecture word width mismatch)
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at org.xerial.snappy.SnappyLoader.loadNativeLibrary(SnappyLoader.java:179)
...
[2019-09-19 09:23:20,892] ERROR [ReplicaManager broker=0] Error processing append operation on partition test-produce-2 (kafka.server.ReplicaManager)
java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy
at org.xerial.snappy.SnappyInputStream.hasNextChunk(SnappyInputStream.java:435)
at org.xerial.snappy.SnappyInputStream.read(SnappyInputStream.java:167)
解决办法
根据上述日志显示,version `GLIBCXX_3.4.21’ not found,于是在服务器上执行strings /usr/lib64/libstdc++.so.6 | grep GLIBC,显示如下:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.17
GLIBCXX_DEBUG_MESSAGE_LENGTH
于是采用升级GCC:
-
下载gcc-5.2.0源码
http://ftp.gnu.org/gnu/gcc/gcc-5.2.0/gcc-5.2.0.tar.gz -
解压
tar –xf gcc-5.2.0.tar.gz -
安装依赖
cd gcc-5.2.0
./contrib/download_prerequisites (下载依赖包 gmp、mpfr、mpc)
利用下载源安装gcc、m4、g++
yum install gcc g++ m4
如果网络原因服务器不能下载,可以手动下载:
https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
https://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
https://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.bz2
然后解压再硬链,可参照./contrib/download_prerequisites脚本
tar xjf $MPFR.tar.bz2
ln -sf $MPFR mpfr -
安装gcc-5.2.0
./configure --prefix=/usr/local/gcc-5.2.0 --enable-languages=c,c++,fortran --disable-multilib --with-build-config=bootstrap-debug
make -j20(启用20个进程一起编译)
make -j20 install -
硬链
cp /gcc-5.2.0/lib64/libstdc++.so.6.0.21 /usr/lib64/
rm -f /usr/lib64/libstdc++.so.6
ln -s /usr/lib64/libstdc++.so.6.0.21 /usr/lib64/libstdc++.so.6
这样Snappy加载不到的问题就解决了