Elasticsearch искры чтения медленно
Чтение от Elasticsearch v6.2
в искру, используя предписанный разъем свечи 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 узлов, 1 Тб памяти, >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 минут, чтобы выполнить.
Это как (медленно) должно работать, или я делаю что-то не так?
1 ответ
Это не то, насколько медленным он должен быть, и ответ можно найти на скриншоте, которым вы поделились:
Колонка
Я столкнулся с той же проблемой, и мне потребовалось время, чтобы понять, что Spark связывает задачу (раздел) с каждым сегментом в индексе Elasticsearch,
Вот и наш ответ: чтобы работать быстрее, мы должны распараллелить процесс, как это сделать? хорошо, распределяя наш исходный индекс на несколько шардов.
По умолчанию Elasticsearch создает индекс с одним осколком, однако его можно персонализировать, как показано ниже:
PUT /index-name
{
"settings": {
"index": {
"number_of_shards": x,
"number_of_replicas": xx
}
}
}
Количество шардов может быть больше, чем количество узлов Elastic, все это прозрачно для Spark. Если индекс уже существует, попробуйте создать новый индекс, а затем используйте API-интерфейс Elasticsearch Reindex.
Надеюсь, это решило вашу проблему.