使用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.ApplicationMaster anon 2.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上就沒有任何問題,個人神呀html

而後呢?

我想既然這個問題 不是hadoop和spark上的問題,那我就先使用snappy壓縮和解壓一段java String
我在github上找到snappy源碼中的README.md有使用snappy 示例java

依賴:
        <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
當我運行這個程序後,報錯以下:git

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/6github

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呀apache

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!後端

技術總監
崗位描述:
一、負責統計分析產品的技術架構
二、提升團隊的工做效率和工程質量
三、對已有的業務系統進行優化和重構
四、幫助產品經理完成新功能的需求分析
五、設計和實施新的數據流水線,知足新的業務需求
崗位要求:
你應該是專一於分佈式計算或高性能計算的領域專家,而且有志於在統計分析領域深刻發展。你應該參與過大型分佈式系統的設計和實施,而且有豐富的應用運維經驗。你須要對基於數據驅動的方法論充滿興趣。性能優化

你應該符合如下條件:
一、5年以上工做經驗,其中至少3年與互聯網相關
a) 有豐富的 Java 或 Scala 的編程經驗
b) 有實際的 Storm,MongoDB、HIVE、HBase 或相關項目經驗
二、良好的溝通能力和團隊合做能力
三、有實際的互聯網服務的運營和維護經驗
四、良好的英文閱讀能力,以及對全球開源社區的持續關注
五、本科及以上學歷,計算機、自動化、電子工程等相關專業markdown

加分項:
1. 在移動互聯網公司有工做經驗,對移動端技術有所瞭解
2. 有統計學、Business Intelligence的專業背景或工做經驗
3. 參與過複雜異構系統的集成、部署或維護工做
4. 有技術管理經驗,能發掘和培養有潛力的工程師

移動分析平臺高級工程師/架構師 【職位描述】: 一、負責設計與實現分析平臺相關API及服務 (數萬Requests / 秒) 二、負責設計,實現或改進分析系統實時流式計算平臺 (數據量: 數個TB / 天) 三、改進系統架構 四、負責線上問題debug及性能調優 【任職資格】: 一、計算機科學或相關專業本科或以上學歷 二、紮實的計算機專業基礎知識 三、熟悉Java/Scala/Clojure/C++ 等任一門語言 四、有互聯網後端項目開發經驗, 熟悉高併發網絡編程, 熟悉分佈式理論基礎 五、熱愛程序設計, 能快速學習, 有獨立解決問題的能力 加分項 一、參與過開源項目 二、熟悉 Finagle / Netty 等網絡編程框架 三、瞭解或熟悉 Storm / Hadoop / Spark / Akka / Kafka / Scribe 等分佈式系統 四、熟悉 MongoDB / MySQL / Redis / Cassandra / HBase 等數據庫系統 五、熟悉大規模數據處理、高併發或分佈式系統相關知識,熟悉JVM性能優化, 有後端服務優化相關經驗

相關文章
相關標籤/搜索