elasticsearch - 由于 Guava 库版本不同,Spark on YARN与Elasticsearch TransportClient发生冲突

标签 elasticsearch apache-spark guava

我想在Google Cloud VM群集上以及 map 操作中运行Spark-job,我需要对 flex 搜索进行查询。我的问题是,Spark和Elastic Search在Guava库上存在冲突,因为Spark使用的是Guava 14和ES Guava 18。

我的问题是此方法调用com.google.common.util.concurrent.MoreExecutors.directExecutor(),存在于 Guava 18中,但不存在于 Guava 14中。

更详细地说,我正在尝试的工作如下。

 input.map(record=>{
    val client=openConnection()
    val newdata=client.query(record.someInfo)
      new record(newdata)
})

方法openConnection如下所示
 public static TransportClient openConnection(String ipAddress, int ipPort) throws UnknownHostException {


    Settings settings = Settings.settingsBuilder().put("cluster.name", "elasticsearch").build();
    TransportClient client = TransportClient.builder().settings(settings).build().
            addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ipAddress), ipPort));

    return client;

}

我试图通过在sbt文件中添加阴影规则来使用阴影来强制ES使用Guava 18,如下所示:
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.0" % "provided"
libraryDependencies += "org.apache.spark" % "spark-graphx_2.10" % "1.6.0" % "provided"  ,
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.0" % "provided" ,
libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.6.0" % "

 libraryDependencies += "org.elasticsearch" % "elasticsearch" % "2.2.0",

 assemblyShadeRules in assembly :=Seq(
  ShadeRule.rename("com.google.common.*" -> "googlecommona.@1").
    inLibrary("org.elasticsearch" % "elasticsearch" % "2.2.0"))

但是问题似乎仍然存在。
有没有办法解决这种冲突?

最佳答案

您不能从提供的依赖项中排除过渡性依赖项。
通过将其标记为provided,您告诉打包程序不要将其放在最终的jar中,因为您假定它已经在将其部署到的类路径中。

因此,您不能排除过渡依赖性,因为整个依赖性本身已被排除。

您的选择是:

  • 从ElasticSearch库中排除依赖项:这将意味着ES将使用Spark提供的Guava,并且可能是
  • 的不兼容版本
  • 切换到具有相同Guava版本的ElasticSearch库(次版本中的差异大部分是兼容的,尽管您可能仍需要将其排除在外)
  • 切换到Spark版本,该版本具有与ElasticSearch相同的Guava版本。
  • 使用阴影:现在可以在sbt-assembly SBT插件中使用。阴影是类的重命名。您知道,ElasticSearch和Spark都有自己的Guava版本,它们本身也作为依赖项包含在内。因此,您指示SBT将ES提供的Guava重命名为Guava1,将Spark提供的Guava重命名为Guava2,将Spark中对Guava的每个引用重命名为Guava1,将ES的引用重命名为Guava2。

  • 您可以阅读有关sbt-assembly阴影here的信息。

    关于elasticsearch - 由于 Guava 库版本不同,Spark on YARN与Elasticsearch TransportClient发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36987541/

    相关文章:

    datetime - 了解 elasticsearch 如何在内部存储日期

    apache-spark - 使用 Spark 的 from_json 解析任意 JSON

    apache-spark - Spark 集群,无法连接到 master。 (警告 worker : Failed to connect to master)

    java - HashMap 和 HashMultimap 有什么区别

    java - 将 jar 导入 lucene ant 构建脚本

    search - Elasticsearch copy_to字段更新流程

    ruby-on-rails - 默认情况下,在文本字段上禁用 Fielddata。设置字段数据=真

    Elasticsearch 时间序列数据库日志记录示例和日期范围之间的求和

    hadoop - Spark YARN 应用程序中 Kerberos 中的 HDFS 写入问题

    java - 范围<日期>问题