【发布时间】:2016-05-02 16:51:14
【问题描述】:
我想在 Google Cloud VM 集群上运行 Spark 作业,并且在地图操作中我需要对弹性搜索进行查询。我的问题是 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"))
但问题似乎仍然存在。 有没有办法解决这个冲突?
【问题讨论】:
-
移除 Spark 的着色规则,因为这是一个提供的库。我还会尝试在 Guava 的重命名规则中使用两个星号 (
**)。如果它仍然不起作用,请检查输出 jar 是否更改了包名称。为此,您可以将 jar 重命名为 zip,然后检查其中的目录。
标签: elasticsearch apache-spark guava