2013-07-17 89 views
2

我有一個在Amazon EMR上運行並輸出到HDFS平面文件的Hadoop map reduce類。一切都很好,但現在我需要輸出到也在AWS上運行的Cassandra DB。我建立並運行了一個本地客戶端並完成了工作,然後將Cassandra的編寫代碼移到了我的Hadoop項目中。這個問題,似乎是亞馬遜吸入/home/hadoop/lib/netty-3.2.4.Final.jar Hadoop的1.0.3,但在AWS上運行Cassandra是1.2.6,並使用netty-3.5.9.Final.jar在Amazon AWS上將Hadoop與Cassandra連接 - Netty版本衝突?

我能做些什麼,以預防或迴避這個矛盾呢?我可以在一個亞馬遜EMR中使用我的新版netty嗎?

我從運行電子病歷的罐子得到的錯誤如下:

Exception in thread "main" java.lang.NoSuchMethodError: org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder.<init>(IIIIIZ)V 
    at org.apache.cassandra.transport.Frame$Decoder.<init>(Frame.java:147) 
    at com.datastax.driver.core.Connection$PipelineFactory.getPipeline(Connection.java:616) 
    at org.jboss.netty.bootstrap.ClientBootstrap.connect(ClientBootstrap.java:212) 
    at org.jboss.netty.bootstrap.ClientBootstrap.connect(ClientBootstrap.java:188) 
    at com.datastax.driver.core.Connection.<init>(Connection.java:111) 
    at com.datastax.driver.core.Connection.<init>(Connection.java:56) 
    at com.datastax.driver.core.Connection$Factory.open(Connection.java:387) 
    at com.datastax.driver.core.ControlConnection.tryConnect(ControlConnection.java:211) 
    at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:174) 
    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:87) 
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:609) 
    at com.datastax.driver.core.Cluster$Manager.access$100(Cluster.java:553) 
    at com.datastax.driver.core.Cluster.<init>(Cluster.java:67) 
    at com.datastax.driver.core.Cluster.buildFrom(Cluster.java:94) 
    at com.datastax.driver.core.Cluster$Builder.build(Cluster.java:534) 
    at GraphAnalysis.MatrixBuilder.compileOutput(MatrixBuilder.java:282) 
    at GraphAnalysis.MatrixBuilder.main(MatrixBuilder.java:205) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:187) 

回答

2

我有一個類似的問題與曾使用網狀-3.2.4.jar其中有我們的內部模塊之一丟失功能。

最終我不得不這樣做對jar文件的開放式心臟手術。

  1. 展開嵌入使用jar -xvf oldlibrary.jar
  2. 刪除文件夾組織/ JBoss的/網狀老網狀庫的jar文件。
  3. 然後展開新的網狀jar文件到一個單獨的文件夾
  4. 複製新的組織/ JBoss的/網狀其內容舊位置一起夾cp -prf netty .
  5. 創建一個新的JAR文件包jar -cvf ../new_jarfile.jar *

這是一種罕見的情況,但您可以應用此方法來克服庫不兼容問題。確保你的程序仍然運行。如果以這種方式更改底層庫,則會發生原始程序無法運行的更改。一個設計良好的圖書館應該不知道這些變化。