缘由
在Arm服务器上面能够顺利的安装Spark并能运行启动Spark-Shell,但是在后续的开发过程中发现,在Arm服务器上面去保存模型、加载模型都会出现问题:
caused by: java.lang.UnsatisfiedLinkError: /tmp/9b3ceca5-eed5-4a07-920f-ea1ca2799335/snappy-1.1.7-6c9d7355-f005-4535-9c3f-1065c35c8348-libsnappyjava.so: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /root/gopath/src/github.com/apache/spark/python/target/9b3ceca5-eed5-4a07-920f-ea1ca2799335/snappy-1.1.7-6c9d7355-f005-4535-9c3f-1065c35c8348-libsnappyjava.so)
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)
at org.xerial.snappy.SnappyLoader.loadSnappyApi(SnappyLoader.java:154)
at org.xerial.snappy.Snappy.<clinit>(Snappy.java:47)
at org.apache.parquet.hadoop.codec.SnappyCompressor.compress(SnappyCompressor.java:67)
at org.apache.hadoop.io.compress.CompressorStream.compress(CompressorStream.java:81)
at org.apache.hadoop.io.compress.CompressorStream.finish(CompressorStream.java:92)
at org.apache.parquet.hadoop.CodecFactory$HeapBytesCompressor.compress(CodecFactory.java:165)
at org.apache.parquet.hadoop.ColumnChunkPageWriteStore$ColumnChunkPageWriter.writePage(ColumnChunkPageWriteStore.java:95)
但是同样的程序在x64的服务器上面跑就没有这种问题,经过网上查询version `GLIBCXX_3.4.21' not found
得知应该是gcc的版本太低了,无法编译成/tmp/9b3ceca5-eed5-4a07-920f-ea1ca2799335/snappy-1.1.7-6c9d7355-f005-4535-9c3f-1065c35c8348-libsnappyjava.so
文件,所以导致程序报异常,经过对比我发现x64的服务器下面是生成了libsnappyjava.so
文件的,但是Arm服务器是没有生成的。
查看GLIB版本
strings /lib64/libstdc++.so.6 | grep GLIBC
x64和arm服务器上面的版本都是如上所示,但是有一点比较奇怪的是,x64的可以编译,而arm却不行。
解决方案
经过查询version `GLIBCXX_3.4.21' not found
关键字,发现解决方案是升级gcc的版本,最后经过实践检验,该方法可以解决此类问题。具体如何操作可以搜索centos7 升级gcc版本
。也可以参照此篇文章的步骤。
替换libstdc++.so.6
经过我耗时1个小时的编译gcc,得到对应的库。应为运行make install
命令之后,生成的库是在/usr/local/lib64/
文件夹下面的,所以需要自己替换至/lib64
cp /usr/local/lib64/libstdc++.so.6.0.25 /lib64
cd /lib64
rm -rf libstdc++.so.6
ln -s libstdc++.so.6.0.25 libstdc++.so.6
这里我会上传我编译好的libstdc++.so.6.0.25库,有需要的小伙伴直接下载、替换、软连接就可以了。
下载地址:https://download.csdn.net/download/chezi008/18160689