【问题标题】:Interfacing Hadoop to Cassandra on Amazon AWS - netty version conflict?在 Amazon AWS 上将 Hadoop 连接到 Cassandra - netty 版本冲突?
【发布时间】:2013-07-16 15:42:51
【问题描述】:

我有一个在 Amazon EMR 上运行并输出到 HDFS 平面文件的 Hadoop map reduce 类。一切都很好,但现在我需要输出到同样在 AWS 上运行的 Cassandra DB。我构建并运行了一个本地客户端并使其正常工作,然后将 Cassandra 编写代码移动到我的 Hadoop 项目中。问题似乎在于 Amazon 为 Hadoop 1.0.3 引入了 /home/hadoop/lib/netty-3.2.4.Final.jar,但在 AWS 上运行的 Cassandra 是 1.2.6 并使用 netty-3.5.9.Final.jar

我可以做些什么来防止或规避这种冲突?我可以在使用 Amazon EMR 的同时绘制新版本的 netty 吗?

我在 EMR 上运行 jar 得到的错误如下:

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)

【问题讨论】:

    标签: hadoop cassandra netty amazon-emr


    【解决方案1】:

    我们的一个内部模块遇到了类似的问题,该模块使用了 netty-3.2.4.jar,但缺少一个函数。

    最终我不得不对 jar 文件进行心脏直视手术。

    1. 使用jar -xvf oldlibrary.jar展开嵌入旧netty库的jar文件
    2. 删除文件夹 org/jboss/netty。
    3. 然后将新建的netty jar文件展开到单独的文件夹中
    4. 将新的 org/jboss/netty 文件夹及其内容复制到旧位置 cp -prf netty .
    5. 新建JAR包jar -cvf ../new_jarfile.jar *

    这是一种罕见的情况,但您可以应用此方法来解决库不兼容的问题。确保您的程序仍在运行。如果您以这种方式更改底层库,则您的原始程序将无法运行某些更改。一个设计良好的库应该不知道这些变化。

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 1970-01-01
      • 2018-05-14
      • 2017-11-09
      • 2019-06-21
      • 1970-01-01
      • 2020-11-13
      • 2020-07-16
      • 2019-08-07
      相关资源
      最近更新 更多