【问题标题】:Spark sql "create table as select ..." outofmemorySpark sql“创建表作为选择...”内存不足
【发布时间】:2019-04-28 09:28:57
【问题描述】:

我正在使用 Spark SQL。 Spark 版本 2.2.2。

SQL 喜欢

select a.*, b.* from a inner join b on a.id=b.id

表 a 和 b 很大。这行得通,我可以得到答案。

其次,我想将 SQL 结果保存到 hive 表中。 SQL 喜欢:

create table xxx stored as orc as select ...

这将失败,错误代码为 143。错误消息是:

ExecutorLostFailure(由于其中一个正在运行的任务导致执行程序 268 退出)原因:容器标记为失败:主机上的 container_e37_1554167308087_15187_01_000269:xxx。退出状态:143。诊断:容器应请求终止。退出代码是 143 +详细信息 ExecutorLostFailure(由于其中一个正在运行的任务导致执行程序 268 退出)原因:容器标记为失败:主机上的 container_e37_1554167308087_15187_01_000269:xxxx。退出状态:143。诊断:容器应请求终止。退出代码是 143 容器以非零退出代码 143 退出 被外部信号杀死

我尝试使用 pyspark 来使用df.saveAsTable()。这在某些情况下有效,但并非所有时候都有效。

有人可以帮忙吗?

谢谢。

【问题讨论】:

  • Hive 创建了大量由驱动程序处理的元数据。你为驱动分配了多少内存--driver-memory
  • df.saveAsTable() 由于分区不均匀而随机失败。在保存df.repartition(n).saveAsTable()之前尝试重新分区
  • @MaFF 不会随机失败。它适用于表 a 和 b,但不适用于表 c 和 d。
  • 驱动内存为 6GB @MaFF
  • 要解决内存问题,您可以尝试重新分区,增加执行器内存--executor-memory,通过执行器减少内核数量(它们共享执行器的 RAM),不要忘记将内存开销增加到符合规格

标签: apache-spark apache-spark-sql


【解决方案1】:

要解决内存问题,您可以尝试:

  • 重新分区
  • 增加执行器内存--executor-memory
  • 通过 executor --executor-cores 减少内核数量(它们共享 executor 的 RAM),不要忘记增加内存开销以匹配规范

重新分区,将减少每个任务的大小,同时增加内存或减少内核数将导致分配给每个任务的内存更多。

如果您事先不知道需要多少任务以及应该分配多少内存,您可以根据数据帧的大小重新分区。

df.persist()
n = df.count()
nb_records = 10
df = df.repartition(int(n / nb_records))
df.rdd.getNumPartitions()

10

这里我们确保按任务有 10 条记录,数据框有 100 条记录,因此我要求 10 个分区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2019-01-18
    • 2016-01-04
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多