如何分配作业以免内存不足

Posted

技术标签:

【中文标题】如何分配作业以免内存不足【英文标题】:How-to spread the job so as to not run out of memory 【发布时间】:2017-02-06 20:05:47 【问题描述】:

我正在尝试运行一些 spark 作业,但执行程序通常会耗尽内存:

17/02/06 19:12:02 WARN TaskSetManager: Lost task 10.0 in stage 476.3 (TID 133250, 10.0.0.10): ExecutorLostFailure (executor 12 exited caused by one of the running tasks) Reason: Container marked as failed: container_1486378087852_0006_01_000019 on host: 10.0.0.10. Exit status: 52. Diagnostics: Exception from container-launch.
Container id: container_1486378087852_0006_01_000019
Exit code: 52
Stack trace: ExitCodeException exitCode=52:
        at org.apache.hadoop.util.Shell.runCommand(Shell.java:933)

由于我已经设置了spark.executor.memory=20480m,我觉得这项工作不应该真的需要更多的内存来工作,所以我看到的另一个选择是增加分区的数量。

我试过了:

>>> sqlContext.setConf("spark.sql.shuffle.partitions", u"2001")
>>> sqlContext.getConf("spark.sql.shuffle.partitions")
u'2001'

>>> all_users.repartition(2001)

但是当我开始工作时,我仍然看到默认的 200 个分区:

>>> all_users.repartition(2001).show()
[Stage 526:(0 + 30) / 200][Stage 527:>(0 + 0) / 126][Stage 528:>(0 + 0) / 128]0]

我在 Azure HDInsight 上使用 PySpark 2.0.2。谁能指出我做错了什么?

编辑

根据下面的答案我试过了:

sqlContext.setConf('spark.sql.shuffle.partitions', 2001)

一开始,但它没有工作。但是,这行得通:

sqlContext.setConf('spark.sql.files.maxPartitionBytes', 100000000)

all_users 是一个 sql 数据框。一个具体的例子是:

all_users = sqlContext.table('RoamPositions')\ 
    .withColumn('prev_district_id', F.lag('district_id', 1).over(user_window))\ 
    .withColumn('prev_district_name', F.lag('district_name', 1).over(user_window))\
    .filter('prev_district_id IS NOT NULL AND prev_district_id != district_id')\
    .select('timetag', 'imsi', 'prev_district_id', 'prev_district_name', 'district_id', 'district_name')

【问题讨论】:

【参考方案1】:

根据您的 cmets,您似乎在调用 repartition 之前从外部源读取数据并使用窗口函数。窗口函数:

如果没有提供partitionBy 子句,则将数据重新分区到单个分区。 如果您提供partitionBy 子句,请使用标准随机播放机制。

这里似乎是后一种情况。由于spark.sql.shuffle.partition 的默认值为 200,因此您的数据将在重新分区之前被打乱到 200 个分区中。如果您一直想要 2001,您应该在加载数据之前设置它

sqlContext.setConf("spark.sql.shuffle.partitions", u"2001")

all_users = ...

另外spark.sql.shuffle.partitions 不影响初始分区的数量。这些可以使用其他属性进行控制:How to increase partitions of the sql result from HiveContext in spark sql

【讨论】:

以上是关于如何分配作业以免内存不足的主要内容,如果未能解决你的问题,请参考以下文章

Android内存不足预防

安卓系统手机内存空间不足的清理方法

Pentaho 文本文件输入步骤崩溃(内存不足)

PHP致命错误:内存不足(分配80740352)(试图分配12352字节)

常提示虚拟内存不足!如何解决?

C++ new申请内存,提示 内存不足