elasticsearch,Java,Apache Spark,elasticsearch" /> elasticsearch,Java,Apache Spark,elasticsearch" />

Java 为什么在Spark上读取ES的速度如此之慢?

Java 为什么在Spark上读取ES的速度如此之慢?,java,apache-spark,elasticsearch,Java,Apache Spark,elasticsearch,我试图通过使用ES提供的Spark ES API来阅读ElasticSearch。我认为spark可以使查询更快。但是它非常慢,甚至比使用ES rest API慢得多 我测试了RESTAPI和spark API的速度,发现spark API要慢得多 以下是我的spark配置: SparkConf sparkConf = new SparkConf() .setAppName("readEs") .setMaster("local[*

我试图通过使用ES提供的Spark ES API来阅读ElasticSearch。我认为spark可以使查询更快。但是它非常慢,甚至比使用ES rest API慢得多

我测试了RESTAPI和spark API的速度,发现spark API要慢得多

以下是我的spark配置:

SparkConf sparkConf = new SparkConf()
                .setAppName("readEs")
                .setMaster("local[*]")
                .set("es.index.auto.create", "true")
                .set("es.nodes", "55.13.9.136")
                .set("es.port", "9200")
                .set("es.nodes.wan.only", "true");

SparkSession sparkSession = SparkSession.builder().config(sparkConf).getOrCreate();
JavaSparkContext jsc = new JavaSparkContext(sparkSession.sparkContext()); 
以下是查询部分:

JavaRDD<Map<String, Object>> searchRdd = esRDD(jsc, "20190904", o.toJSONString()).values();

for(Map<String,Object> item:searchRdd.collect()){
                    item.forEach((key,value)->{
                        System.out.println("search key:"+key+", search value: "+ value);
                    });

我用时间戳搜索数据,间隔是10000ms,大约30分钟,循环180次。spark api大约需要36000毫秒,es rest api大约需要2500毫秒。我发现,如果我删除“searchRDD.collect()”或“searchRDD.count()”行,spark api大约需要500毫秒。我不知道查询是否运行。如果它确实运行了,如果我不能使用searchRDD方法,我如何获得数据?谢谢。

您做了一个正确的观察:如果删除
.count()
.collect()
Spark将只准备执行,它将不会执行查询。请问查询的结果集有多大?
searchRDD
应该有多少项?我的目的是在同一个索引中完成大量查询。我发现我犯了一个错误,每次当我得到一个新的查询时,我都使用
RDD.collect()
,这使得它非常慢,因为我每次都查询所有的数据。现在我使用
RDD.collect()
来获取所有的数据,并将数据存储到内存中,这会更好。但我认为这样更好,因为我把数据存储到内存中。你知道如何通过Spark优化查询吗?我觉得我没有好好利用Spark,而且数据不大,大约50MB~2GB。谢谢很高兴看到您在解决问题方面取得了进展!每个查询需要下载多少个结果?它们是小于10k还是大于10k?@NikolayVasiliev我一次下载2MB的数据,并在本地对其进行720次查询。结果表明,当我下载相同数量的数据并在本地运行相同数量的查询时,Spark+ES方案比ES方案慢。我的猜测是(1)查询中的数据总量很小。(2)内存中的计算太简单。出于这两个原因,Spark的优势没有被利用。对吗?@NikolayVasiliev你的建议给了我很多启发。非常感谢你。
client = RestClient.builder(new HttpHost("55.13.9.136",9200,"http")).build();
entity = new NStringEntity(o.toJSONString(), ContentType.APPLICATION_JSON);
Response response = client.performRequest("GET","/20190904/_search",params,entity);
responseBody = EntityUtils.toString(response.getEntity());
JSONObject jsonObject = JSON.parseObject(responseBody);
System.out.println("result: "+jsonObject.get("hits"));