Задание Spark занимает много времени # Проблема с кодом или средой?

у нас есть кластер из 300 узлов, каждый узел имеет 132 ГБ памяти и 20 ядер. вопрос заключается в том, чтобы удалить данные из таблицы A, которая находится в таблице B, а затем объединить B с A и нажать A на тераданные.

ниже код

val ofitemp = sqlContext.sql("select * from B")
val ofifinal = sqlContext.sql("select * from A")
val selectfromfinal = sqlContext.sql("select A.a,A.b,A.c...A.x from A where A.x=B.x")
val takefromfinal = ofifinal.except(selectfromfinal)
val tempfinal = takefromfinal.unionAll(ofitemp)tempfinal.write.mode("overwrite").saveAsTable("C")
val tempTableFinal = sqlContext.table("C")tempTableFinal.write.mode("overwrite").insertInto("A")

конфигурация, используемая для запуска искры, -

EXECUTOR_MEM="16G"
HIVE_MAPPER_HEAP=2048   ## MB
NUMBER_OF_EXECUTORS="25"
DRIVER_MEM="5G"
EXECUTOR_CORES="3"

с A и B, имеющими несколько миллионов записей, выполнение задания занимает несколько часов. Поскольку я очень новичок в Spark, я не понимаю - это проблема с кодом или проблема с настройкой среды.

был бы обязан, если бы вы могли поделиться своими мыслями по преодолению проблем с производительностью.


person Sugata Kar    schedule 24.10.2018    source источник


Ответы (1)


В вашем коде exceptможет быть узким местом, поскольку он сравнивает все столбцы на равенство. Это действительно то, что вам нужно?

Если вам нужно проверить только 1 атрибут, самым быстрым способом будет выполнить "leftanti"-join :

val takefromfinal = ofifinal.join(ofitemp,$"A.x"===$"B.y","leftanti")

Кроме того, изучите spark-UI и определите узкое место

person Raphael Roth    schedule 24.10.2018