Пространство кучи Java OutOfMemoryError при выполнении запроса на соединение в оболочке Spark SQL - PullRequest
0 голосов
/ 03 ноября 2019

Вот моя конфигурация кластера :

Главные узлы: 1 (16 ВЦП, 64 ГБ памяти)

Рабочие узлы: 2 (всего 64 ВЦП, 256ГБ памяти)

Вот запрос Hive Я пытаюсь запустить на Оболочка Spark SQL :

select a.*,b.name as name from (
small_tbl b 
join
(select * 
from large_tbl where date = '2019-01-01') a
on a.id = b.id);

Вот план выполнения запроса , как показано в интерфейсе Spark:

enter image description here

Свойства конфигурации, заданные при запуске оболочки, следующие:

spark-sql --conf spark.driver.maxResultSize=30g \
--conf spark.broadcast.compress=true \
--conf spark.rdd.compress=true \
--conf spark.memory.offHeap.enabled=true \
--conf spark.memory.offHeap.size=304857600 \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.executor.instances=12 \
--conf spark.executor.memory=16g 
--conf spark.executor.cores=5 \
--conf spark.driver.memory=32g \
--conf spark.yarn.executor.memoryOverhead=512 \
--conf spark.executor.extrajavaoptions=-Xms20g \
--conf spark.executor.heartbeatInterval=30s \
--conf spark.shuffle.io.preferDirectBufs=true \
--conf spark.memory.fraction=0.5

Я испробовал большинство предложенных решений здесь и здесь , что очевидно в наборе свойстввыше. Насколько я знаю, не стоит увеличивать свойство maxResultSize на стороне драйвера, поскольку наборы данных могут выходить за пределы объема памяти драйвера, и драйвер не должен использоваться для хранения данных в таком масштабе.

Я успешно выполнил запрос на движке Tez, который занял около 4 минут, тогда как Spark занимает более 15 минут и внезапно завершает работу из-за недостатка места в куче.

Я твердо верюдолжен быть способ ускорить выполнение запроса в Spark. Пожалуйста, предложите мне решение, которое работает для такого рода запросов.

...