Spark工作需要很长时间#代码或环境问题?

时间:2018-10-24 14:29:31

标签: apache-spark apache-spark-sql

我们有一个300个节点的群集,每个节点具有132gb内存和20个内核。问题是-从tableB中的tableA中删除数据,然后将B与A合并,然后将A推送到teradata。

下面是代码

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")

用于运行spark的配置是-

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

由于A和B拥有几百万条记录,因此该工作需要几个小时才能运行。 作为Spark的新手,我不理解-是代码问题还是环境设置问题。

如果您可以分享自己的想法来克服性能问题,则有义务。

1 个答案:

答案 0 :(得分:0)

在您的代码中,except可能是瓶颈,因为它比较所有列是否相等。这真的是您所需要的吗(我对之前一行中的À.x= B.y`感到困惑)

如果只需要检查1个属性,最快的方法是执行“ leftanti” -join:

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

除此之外,研究spark-UI并确定瓶颈