如何使用SPARK在HDFS中编写大量数据(大约800 GB)作为hive orc表?

时间:2016-06-26 16:48:57

标签: apache-spark apache-spark-sql spark-dataframe

自从过去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")

1 个答案:

答案 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