【发布时间】:2016-08-26 15:37:57
【问题描述】:
我在 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 创建的 fat jar 上传到谷歌云,因此使用的所有库都是通用的,除了本机 java 库。
我认为这可能是一些库依赖,因为同一个 jar 在我的本地计算机上运行良好,并且它能够连接到 ElasticSearch 服务器,但同一个 jar 无法在 Google 云上的 spark 集群上运行。 Spark 的本地和云版本都是相同的,1.6.0。
【问题讨论】:
-
如果你运行
jar tf your-jarfile.jar | grep ThreadPool,你看到类文件org/elasticsearch/threadpool/ThreadPool.class了吗?通常,本地开发环境可能会被隐藏缺少的 fatjar 依赖项的依赖项污染;您是否尝试过完全干净的环境,在干净的环境(例如,新的本地或云虚拟机)中下载全新的 Spark tarball 并在那里运行相同的spark-submit --master local?
标签: elasticsearch apache-spark google-cloud-dataproc