我想在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中,因为您假定它已经在将其部署到的类路径中。
因此,您不能排除过渡依赖性,因为整个依赖性本身已被排除。
您的选择是:
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/