我在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。