每次有更新整个分区的请求时,我都会用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