Google Cloud Spark ElasticSearch TransportClient 连接异常
Google Cloud Spark ElasticSearch TransportClient connection exception
我在 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[*]
一切都 运行 没问题。当我 运行 它在 google 云火花集群中时,我得到以下异常:
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 将代码上传到 google 云,因此使用的所有库都是通用的,除了原生的 java 库。
我认为这可能是某种库依赖性,因为同一个 jar 运行 在我的本地计算机上没问题,它能够连接到 ElasticSearch 服务器,但同一个 jar 无法 运行 在 Google 云上的 spark 集群上。 Spark
的本地和云版本都是一样的,1.6.0.
问题是Spark和Elasticsearch使用的Guava库冲突导致的。可以找到解决方案
我在 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[*]
一切都 运行 没问题。当我 运行 它在 google 云火花集群中时,我得到以下异常:
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 将代码上传到 google 云,因此使用的所有库都是通用的,除了原生的 java 库。
我认为这可能是某种库依赖性,因为同一个 jar 运行 在我的本地计算机上没问题,它能够连接到 ElasticSearch 服务器,但同一个 jar 无法 运行 在 Google 云上的 spark 集群上。 Spark
的本地和云版本都是一样的,1.6.0.
问题是Spark和Elasticsearch使用的Guava库冲突导致的。可以找到解决方案