使用Snappy 压缩方式报错“java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path”

情况描述

其实这个问题已经困扰我很久了,最近在公司Linux上搭建hadoop 和 spark环境的时候,我就遇到 spark提交作业到yarn 集群就报错这个错,当时已经安装snappy环境了,任何关于snappy静态库都编译了,这是我提交到spark mail list上的http://apache-spark-user-list.1001560.n3.nabble.com/java-lang-UnsatisfiedLinkError-no-snappyjava-in-java-library-path-td23945.html

后来也没人给我回复,就有一个人这样给我回复的“chef if hadoop distribution doesn’t come with other version of snappy jar, if you have 2 snappies in classpath it may cause your problem

而最近我在macox下 搭建一个spark伪分布式模式,我在idea上启动spark任务时候,也报这个错了

“java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.xerial.snappy.SnappyLoader.loadNativeLibrary(SnappyLoader.java:317)

at org.xerial.snappy.SnappyLoader.load(SnappyLoader.java:219)

at org.xerial.snappy.Snappy.(Snappy.java:44)

at org.apache.spark.io.SnappyCompressionCodec.(CompressionCodec.scala:150)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

at org.apache.spark.io.CompressionCodec.createCodec(CompressionCodec.scala:68)atorg.apache.spark.io.CompressionCodec.createCodec(CompressionCodec.scala:60)

at org.apache.spark.scheduler.EventLoggingListener.(EventLoggingListener.scala:69)

at org.apache.spark.SparkContext.(SparkContext.scala:513)

at org.apache.spark.examples.SparkPi.main(SparkPi.scala:28)atorg.apache.spark.examples.SparkPi.main(SparkPi.scala)atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atjava.lang.reflect.Method.invoke(Method.java:606)atorg.apache.spark.deploy.yarn.ApplicationMasteranon2.run(ApplicationMaster.scala:483)

Caused by: java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)

at java.lang.Runtime.loadLibrary0(Runtime.java:849)

at java.lang.System.loadLibrary(System.java:1088)

at org.xerial.snappy.SnappyNativeLoader.loadLibrary(SnappyNativeLoader.java:52)

… 23 more ”

后来我在谷歌上搜索 “java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path”关键字,我看到github 上 snappy的issue,https://github.com/xerial/snappy-java/issues/6

发现 这就是jdk1.7.X on mac ,但我想 貌似Linux 也应该有问题吧,但又不敢确定,因为我之前把我们测试环境集群所有关于hadoop 和spark的压缩包都在我本地的ubutun环境搭建了(jdk,scala,hadoop,spark都是一样),NND 我的ubutun上就没有任何问题,我的神呀

然后呢?

我想既然这个问题 不是hadoop和spark上的问题,那我就先使用snappy压缩和解压一段java String

我在github上找到snappy源码中的README.md有使用snappy 示例

   依赖:
        <dependency>
            <groupId>org.xerial.snappy</groupId>
            <artifactId>snappy-java</artifactId>
            <version>1.1.1.4</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
   源码:
        public class TestSnappy {
    public static void main(String[] args) throws Exception{

        String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of "
                + "Snappy, a fast compresser/decompresser.";
        byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
        byte[] uncompressed = Snappy.uncompress(compressed);

        String result = new String(uncompressed, "UTF-8");
        System.out.println(result);
    }
}

使用snappy 1.1.1.4版本是因为 spark源码的pom.xml文件都使用这个版本的snappy

当我运行这个程序后,报错如下:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.xerial.snappy.SnappyLoader.loadNativeLibrary(SnappyLoader.java:317)
    at org.xerial.snappy.SnappyLoader.load(SnappyLoader.java:219)
    at org.xerial.snappy.Snappy.<clinit>(Snappy.java:44)
    at test.TestSnappy.main(TestSnappy.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1088)
    at org.xerial.snappy.SnappyNativeLoader.loadLibrary(SnappyNativeLoader.java:52)
    ... 13 more
Exception in thread "main" org.xerial.snappy.SnappyError: [FAILED_TO_LOAD_NATIVE_LIBRARY] null
    at org.xerial.snappy.SnappyLoader.load(SnappyLoader.java:229)
    at org.xerial.snappy.Snappy.<clinit>(Snappy.java:44)
    at test.TestSnappy.main(TestSnappy.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Process finished with exit code 1

后来我就继续看https://github.com/xerial/snappy-java/issues/6

dgerges commented on 5 Feb 2014
An easy fix if you want to continue to use 1.4.0.1 on MacOSX with JDK 1.7

unzip snappy-java-1.0.4.1.jar
cd org/xerial/snappy/native/Mac/x86_64/
copy libsnappyjava.jnilib libsnappyjava.dylib
cd ../../../../../..
cp snappy-java-1.0.4.1.jar snappy-java-1.0.4.1.jar.old
jar cf snappy-java-1.0.4.1.jar org

进入到 ~/.m2/repository/ 然后按照上述描述尝试了下,

当我再次运行TestSnappy程序后,果然不报错了

Hello snappy-java! Snappy-java is a JNI-based wrapper of Snappy, a fast compresser/decompresser.

Process finished with exit code 0

看来 macox下 要需要识别 ”libsnappyjava.dylib“ 这个文件

写到这,我突然想说下我最近关于mac发生的事情:

我现在在使用的这台电脑是mac book air,是公司给我配置的,而我自己有个mac book pro 840 中配,就关于“no snappyjava in java.library.path”这个问题,我有天晚上突然想在自己的pro上再试一次,然后就用同样的hadoop和spark等包都在pro上安装了,后来启动hadoop时候就报错 无法加载 hadoop相关的.so 静态文件,后来我就把$HADOOP_HOME/lib/native/*.so 文件cp 到/usr/local/lib/ 还有 /usr/lib/,但是还是没效果,后来我合计 既然不好用,那我就把/usr/local/lib/ 还有 /usr/lib/ 下得.so文件删除吧,

1. 先/usr/local/lib/下所有hadoop相关的.so文件删除了

2. 然后删除/usr/lib/下相关文件,因为我们项目也使用了lzma,当时我也是SB了,直接就rm -rf /usr/lib/liblzma* ,然后呢?执行 sudo 任何命令,都提示“can not initialized PAM”,后来也不能上网了,当时还SB的认为,mac怎么也能抽风呢?重启电脑吧,后来竟然无法启动了,进度条在50%后,就不动了,后来进入单用户模式,看/var/log/才知道,原来缺少 /usr/lib/liblzma.5.dylib /usr/lib/liblzma.dylib 这个两个文件

当时就想着 从别的mac 上copy这两个文件就OK了。但是U盘不能挂载了(是我单用户进去的),我也拦着弄了,我就合计线上升级了,发现试了几次,家里网络也不行,我就放弃了,次日去公司,用同事做得macox U盘镜像 安装系统,发现他得版本没我的高,后来我同事让我自己做个,我又懒着做了,我就去三里屯 苹果店了,10分钟重新在线安装了。哎我是SB呀

spark解决办法

  1. macox

    既然macox下 要识别 ”libsnappyjava.dylib“ 这个文件,那我就把这个文件 copy到/usr/local/lib/下 ,执行命令:cp libsnappyjava.dylib /usr/local/lib/

    执行命令:ls /usr/local/lib/libsnappy*

    当我再次在idea上运行spark程序,也没有再报错了,问题也解决了

  2. 公司测试集群

    由于这问题 有点影响整体进度了,所以我就把这个问题跳过了,但还是没有解决

    目前解决方案是:

    在 $SPARK_HOME/conf/spark-defaults.conf中增加 spark.io.compression.codec lzf

    因为spark默认是使用snappy压缩方式 在处理日志聚合和 driver与executor通信等

恳请大家帮帮忙

如果大家知道怎么解决 在Linux上spark “no snappyjava in java.library.path”问题,请回复,问题解决,我请客,嘿嘿

具体问题描述:http://apache-spark-user-list.1001560.n3.nabble.com/java-lang-UnsatisfiedLinkError-no-snappyjava-in-java-library-path-td23945.html

———————————-职位推荐————————————

友盟(www.umeng.com),中国最大的移动开发者服务平台。请各位朋友帮忙推荐,成功推荐送Apple Watch!

技术总监

岗位描述:

1、负责统计分析产品的技术架构

2、提高团队的工作效率和工程质量

3、对已有的业务系统进行优化和重构

4、帮助产品经理完成新功能的需求分析

5、设计和实施新的数据流水线,满足新的业务需求

岗位要求:

你应该是专注于分布式计算或高性能计算的领域专家,并且有志于在统计分析领域深入发展。你应该参与过大型分布式系统的设计和实施,并且有丰富的应用运维经验。你需要对基于数据驱动的方法论充满兴趣。

你应该符合以下条件:

1、5年以上工作经验,其中至少3年与互联网相关

a) 有丰富的 Java 或 Scala 的编程经验

b) 有实际的 Storm,MongoDB、HIVE、HBase 或相关项目经验

2、良好的沟通能力和团队合作能力

3、有实际的互联网服务的运营和维护经验

4、良好的英文阅读能力,以及对全球开源社区的持续关注

5、本科及以上学历,计算机、自动化、电子工程等相关专业

加分项:

1. 在移动互联网公司有工作经验,对移动端技术有所了解

2. 有统计学、Business Intelligence的专业背景或工作经验

3. 参与过复杂异构系统的集成、部署或维护工作

4. 有技术管理经验,能发掘和培养有潜力的工程师

移动分析平台高级工程师/架构师

【职位描述】:

1、负责设计与实现分析平台相关API及服务 (数万Requests / 秒)

2、负责设计,实现或改进分析系统实时流式计算平台 (数据量: 数个TB / 天)

3、改进系统架构

4、负责线上问题debug及性能调优

【任职资格】:

1、计算机科学或相关专业本科或以上学历

2、扎实的计算机专业基础知识

3、熟悉Java/Scala/Clojure/C++ 等任一门语言

4、有互联网后端项目开发经验, 熟悉高并发网络编程, 熟悉分布式理论基础

5、热爱程序设计, 能快速学习, 有独立解决问题的能力

加分项

1、参与过开源项目

2、熟悉 Finagle / Netty 等网络编程框架

3、了解或熟悉 Storm / Hadoop / Spark / Akka / Kafka / Scribe 等分布式系统

4、熟悉 MongoDB / MySQL / Redis / Cassandra / HBase 等数据库系统

5、熟悉大规模数据处理、高并发或分布式系统相关知识,熟悉JVM性能优化, 有后端服务优化相关经验

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 08:06:37

使用Snappy 压缩方式报错“java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path”的相关文章

最笨的方法解决 使用Snappy 压缩方式报错“java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path”

之前写过一篇这个文章:http://blog.csdn.net/stark_summer/article/details/47361603,那个时候 linux环境 spark 使用snappy方式压缩任然不好用,而今天我同事hive on hadoop 使用snappy压缩方式也报这个错,此刻的我,感觉这个问题 一定要解决 我想了想,只能使用最笨的方式先解决这个问题了,将libsnappyjava.so文件放到$JAVA_HOME/jre/lib/amd64/下了 操作过程如下: 首先把$HA

Error: java.lang.UnsatisfiedLinkError: no ntvinv in java.library.path

Error Message When compiling or executing a Java application that uses the ArcObjects Java API, the following error is returned: java.lang.UnsatisfiedLinkError: no ntvinv in java.library.path Cause The PATH variable does not include a directory which

java.lang.UnsatisfiedLinkError: no XXX in java.library.path

其中涉及的测试源码如下: For those who didn't install Javawith default settings, a systematic way for solving JNI class path problem is:1> include "System.out.println(System.getProperty("Java.library.path")); " in your "static" block,

java.lang.UnsatisfiedLinkError:no in java.library.path解决办法

在用exe4j打包java工程后,在其他电脑运行结果出现了  java.lang.UnsatisfiedLinkError:no  in java.library.path的错误,刚开始以为是jar包没在classpath路径中,后来才发现java.library.path与classpath是两个不同的变量,后者是我们所熟知的类路径,与jar包有关:而前者与dll有关,它指定dll文件搜索路径. 在我的工程中,用到了第三方jar包和dll文件,dll文件放在了工程根目录,在eclipse中

Exception in thread &quot;main&quot; java.lang.UnsatisfiedLinkError: no awt in java.library.path: [

Exception in thread "main" java.lang.UnsatisfiedLinkError: no awt in java.library.path: 这是今天在学习 java 的对话框的时候遇到的一个问题 我是使用的一个新的 Myeclipse,因为没有配置自己本地的 jdk,直接使用的自带的 jdk 版本, 我的 jdk 默认是 1.10,然后修改成自己本地的 jdk 就解决了. 修改 JDK 一.打开[Window]>[Preferences]>

jni调用 java.lang.UnsatisfiedLinkError: no segmentor_jni in java.library.path

改过 LD_LIBRARY_PATH 改过 /etc/ld.so.conf 参考这篇文章 http://blog.csdn.net/zjuylok/article/details/4152559 最后都不好使,最后一句话指点迷津 But if I comment the line that sets the java.library.path and call the program with the command java -Djava.library.path=. HelloWorld w

运行测试Caused by: java.lang.UnsatisfiedLinkError: no attach in java.library.path错误解决

解决办法:看到错误里面有个Caused by,说我的jdk运行到了32位的了,于是我查看环境变量,发现是昨天设置成32位的没有设置回来,于是设置回64位的jdk就ok了

J2EE引擎出现java.lang.UnsatisfiedLinkError:&#160;CC错误的原因

运行JSP报表程序页面出现java.lang.UnsatisfiedLinkError: CC错误有以下几种原因和处理方法: 1.请查看控制台的错误信息 a:如果控制台的消息是类似 java.lang.UnsatisfiedLinkError: no MRChkLib in java.library.path,Error loading library MRChkLib 这样的错误信息,那么是因为MRChkLib.dll没有拷贝到windows的System32目录下. (MRChkLib.dl

spark取得lzo压缩文件报错 java.lang.ClassNotFoundException

恩,这个问题,反正是我从来没有注意的问题,但今天还是写出来吧 配置信息 hadoop core-site.xml配置 <property>    <name>io.compression.codecs</name>         <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lz