自从过去3-4个月以来,我一直在Spark Project
工作。
我正在使用巨大的历史文件(800 GB)和一个小的增量文件(3 GB)进行一些计算。
使用hqlContext
& dataframe
,但是当我尝试将计算结果写为hive table
orc
格式,其中包含近200亿条记录且数据大小接近800 GB的记录占用太多时间(超过2小时,最后失败)。
我的群集详细信息为:19个节点,1.41 TB总内存,总VCores为361。
对于调整我正在使用
--num-executors 67
--executor-cores 6
--executor-memory 60g
--driver-memory 50g
--driver-cores 6
--master yarn-cluster
--total-executor-cores 100
--conf "spark.executor.extraJavaOptions=-XX:+UseG1GC"
在运行时。
如果我计算结果,那么它会在15分钟内完成,但是如果我想把这个结果写成HDFS作为hive表。
[ UPDATED_RECORDS.write.format("orc").saveAsTable("HIST_ORC_TARGET") ]
然后我面临上述问题。
请提供一些建议或任何有关此事的建议,因为我在过去的几天里陷入了这种情况。
代码格式:
val BASE_RDD_HIST = hqlContext.sql("select * from hist_orc")
val BASE_RDD_INCR = hqlContext.sql("select * from incr_orc")
使用数据框,hive查询& UDF .....
最后:
result.write.format("orc").saveAsTable("HIST_ORC_TARGET_TABLE")
答案 0 :(得分:2)
朋友您好我几天前就找到了自己问题的答案 我写的是。
每当我们执行任何spark程序时,我们都不指定queue
参数,有时默认队列有一些限制,这些限制不允许您执行所需的执行程序或任务,因此可能会导致缓慢因为运行较少的执行程序/任务而处理内存问题导致作业失败的原因。所以不要忘记在执行命令中提到队列名称:
spark-submit --class com.xx.yy.FactTable_Merging.ScalaHiveHql
--num-executors 25
--executor-cores 5
--executor-memory 20g
--driver-memory 10g
--driver-cores 5
--master yarn-cluster
--name "FactTable HIST & INCR Re Write After Null Merging Seperately"
--queue "your_queue_name"
/tmp/ScalaHiveProgram.jar
/user/poc_user/FactTable_INCR_MERGED_10_PARTITION
/user/poc_user/FactTable_HIST_MERGED_50_PARTITION