Elasticsearch火花读取速度慢

时间:2018-08-15 09:29:04

标签: scala apache-spark elasticsearch elasticsearch-spark

使用指定的火花连接器v6.2从Elasticsearch org.elasticsearch:elasticsearch-spark-20_2.11:6.3.2读取火花非常慢。这来自具有索引的3节点ES集群:

curl https://server/_cat/indices?v
green  open   db MmVwAwYfTz4eE_L-tncbwQ   5   1  199983131      9974871    105.1gb         51.8gb

在(10个节点,1tb内存,> 50个VCPU)火花集群上读取:

val query = """{
  "query": {
    "match_all": {}
  }
}"""

val df = spark.read
  .format("org.elasticsearch.spark.sql")
  .option("es.nodes","server")
  .option("es.port", "443")
  .option("es.net.ssl","true")
  .option("es.nodes.wan.only","true")
  .option("es.input.use.sliced.partitions", "false")
  .option("es.scroll.size", "1000")
  .option("es.read.field.include", "f1,f2,f3")
  .option("es.query",query)
  .load("db")

df.take(1)

花了10分钟执行。 enter image description here

这是应该(缓慢地)工作的方式,还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

这不是它应该有多慢,答案可以在您分享的屏幕截图中找到:

Spark UI 中的 Stages: Succeeded/Total 列仅显示一个运行读取操作的任务,我认为这不是您所期望的,否则,拥有整个集群有什么意义。

我遇到了同样的问题,我花了一段时间才弄清楚 Spark 将一个任务(分区)关联到 Elasticsearch 索引中的每个分片,

我们有了答案,为了更快,我们应该并行化这个过程,怎么做?通过将我们的源索引分布到多个分片中。

默认情况下,Elasticsearch 创建一个带有一个分片的索引,但是,可以如下对其进行个性化:

PUT /index-name
{
     "settings": {
     "index": {
     "number_of_shards": x,  
     "number_of_replicas": xx 
    }
  }
}

分片的数量可能大于弹性节点的数量,这对 Spark 来说都是透明的。 如果索引已经存在,尝试创建一个新的 inex,然后使用 Elasticsearch Reindex API

希望这能解决您的问题。