Spark SQL无法覆盖大型实木复合地板分区

时间:2019-03-16 17:21:47

标签: apache-spark apache-spark-sql parquet

每次有更新整个分区的请求时,我都会用apache spark 2.2覆盖现有的镶木地板分区。数据偏斜。所以有些分区很大。 最初,我不对数据帧(从源数据创建)重新分区,而是尝试使用以下psuedo spark sql对其进行写入。

'use strict'; const path = require('path'); const Sequelize = require('sequelize'); const db = {}; const DB = 'users'; const USER = 'user'; const PASSWORD = 'password'; const HOST = 'host'; const DIALECT = 'postgres'; const PORT = 5432; const CONNECTION = new Sequelize( DB, USER, PASSWORD, { host: HOST, dialect: DIALECT, port: PORT, } ) module.exports.CONNECTION = CONNECTION;

(我本可以使用动态分区sql更新,但它不会改变任何有关此问题的信息。)

现在,由于该分区具有大量数据(超过5g),因此我得到了insert overwrite table mytable partition(a=123, b=234) select c1, c2, c3 from mydataframe where a=123 and b=234 似乎表明块大小超过了2g火花极限。建议的常见解决方案是增加数据帧的分区数量。

如果我增加数据框中的分区数量,则会得到

java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE

CommitDeniedException: attempt Not committed because the driver did not authorize commit

以下是我在大多数执行程序日志中看到的异常顺序。随机播放失败,然后是CommitDeniedException,然后是OutOfMemory死掉了

TaskCommitDenied (Driver denied task commit) for job: 124, partition: 39, attemptNumber: 0

我不知道为什么我得到19/03/15 12:42:52 ERROR shuffle.OneForOneBlockFetcher: Failed while starting block fetches 19/03/15 13:10:22 ERROR util.Utils: Aborting task org.apache.spark.executor.CommitDeniedException: attempt_20190315131022_0085_m_000042_360: Not committed because the driver did not authorize commit at org.apache.spark.mapred.SparkH 19/03/15 13:34:48 ERROR util.Utils: Uncaught exception in thread driver-heartbeater java.lang.OutOfMemoryError: Java heap space TaskCommitDenied默认是禁用的。 我认为进行数据帧重新分区可能会导致此问题。如果我错了,请纠正我,但是-因为我正在将数据覆盖到半透明镶木分区中,所以数据帧分区数也必须相同,否则多个任务可能会尝试同时覆盖它。如果您的数据框具有更多的分区,然后有物理分区,则可能会发生这种情况。

那么如何使用spark-sql覆盖巨大的实木复合地板分区?

其他Stacktrace(来自一个执行程序的代码段,它发生在多个节点上):

spark.speculation

0 个答案:

没有答案