Google Cloud Spark ElasticSearch TransportClient连接异常

时间:2016-05-01 22:45:28

标签: elasticsearch apache-spark google-cloud-dataproc

我在Google Cloud上使用Spark,我有以下代码连接到Elasticsearch数据库

 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.transport.TransportClient;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.transport.InetSocketTransportAddress;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.SearchHit;


 public  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;

}

当我在本地运行时,即spark-submit --master local[*]一切正常。当我在谷歌云火花群集中运行它时,我得到以下例外:

 java.lang.NoClassDefFoundError: Could not initialize class org.elasticsearch.threadpool.ThreadPool
at org.elasticsearch.client.transport.TransportClient$Builder.build(TransportClient.java:131)
at javaTools.ElasticSearchConnection.openConnection(ElasticSearchConnection.java:24)

最后引用的方法(openConnection)是上述连接。

使用使用sbt asssembly创建的胖jar将代码上传到google云,因此除了原生java之外,所有使用的库都是常见的。

我认为它可能是某些库依赖项,因为同一个jar在我的本地计算机上运行良好并且它能够连接到ElasticSearch服务器,但是同一个jar无法在Google云上的spark群集上运行。 Spark的本地和云版本都是相同的,1.6.0。

1 个答案:

答案 0 :(得分:0)

问题是由Spark和Elasticsearch中使用的Guava库冲突引起的。可以找到解决方案in this StackOverflow question