Spark + Elastic - проблема с производительностью поиска и записи
Видя низкое количество записей в asticsearch с использованием искры Java.
Вот конфигурации
использование 13. больших машин для кластера ES
4 instances each have 4 processors.
Set refresh interval to -1 and replications to '0' and other basic
configurations required for better writing.
Искра:
Кластер EMR с 2 узлами с
2 Core instances
- 8 vCPU, 16 GiB memory, EBS only storage
- EBS Storage:1000 GiB
1 Master node
- 1 vCPU, 3.8 GiB memory, 410 SSD GB storage
Индекс ES имеет 16 сегментов, определенных в отображении.
имея ниже конфиг при запуске задания,
executor-memory - 8g
spark.executor.instances=2
spark.executor.cores=4
и используя
es.batch.size.bytes - 6MB
es.batch.size.entries - 10000
es.batch.write.refresh - false
в этой конфигурации я пытаюсь загрузить 1 миллион документов (каждый документ имеет размер 1300 байт), поэтому он загружает 500 записей / документов на узлы ES.
и в журнале искр вижу каждое задание
-1116 bytes result sent to driver
Искровой код
JavaRDD<String> javaRDD = jsc.textFile("<S3 Path>");
JavaEsSpark.saveJsonToEs(javaRDD,"<Index name>");
Также, когда я смотрю на график In-Network в кластере ES, он очень низкий, и я вижу, что EMR не отправляет огромные данные по сети. Есть ли способ, которым я могу сказать Spark отправить правильное количество данных, чтобы сделать запись быстрее?
ИЛИ ЖЕ
Есть ли другие конфигурации, которые мне не хватает, чтобы настроить. Потому что я вижу, что 500docs в секунду за экземпляр ниже. Может кто-нибудь, пожалуйста, направьте, что мне не хватает с этими настройками, чтобы улучшить мою производительность записи ES
заранее спасибо
1 ответ
У вас может быть проблема здесь.spark.executor.instances=2
Вы ограничены двумя исполнителями, где вы можете иметь 4 на основе конфигурации вашего кластера. Я бы изменил это на 4 или больше. Я также мог бы попробовать executor-memory = 1500M, cores=1, instance =16. Мне нравится оставлять немного памяти в моей памяти, поэтому я упал с 2G до 1,5G(но вы не можете сделать 1,5G, поэтому нам нужно сделать 1500M). Если вы подключаетесь через своих исполнителей, это улучшит производительность.
Нужен код для дальнейшей отладки. Интересно, вы подключены к упругому поиску только в вашем драйвере, а не в ваших рабочих узлах. Это означает, что вы получаете только одно соединение вместо одного для каждого исполнителя.