【问题标题】:How to resolve : Very large size tasks in spark如何解决:火花中非常大的任务
【发布时间】:2016-10-12 01:54:31
【问题描述】:

在这里,我粘贴了我在 spark 上运行的 python 代码,以便对数据执行一些分析。我能够在少量数据集上运行以下程序。但是当进入大型数据集时,它会说“第 1 阶段包含一个非常大的任务(17693 KB)。建议的最大任务大小为 100 KB”。

import os
import sys
import unicodedata
from operator import add

try:
    from pyspark import SparkConf
    from pyspark import SparkContext
except ImportError as e:
    print ("Error importing Spark Modules", e)
    sys.exit(1)

def tokenize(text):
    resultDict = {}
    text = unicodedata.normalize('NFKD', text).encode('ascii','ignore')

    str1= text[1]
    str2= text[0]

    arrText= text.split(str1)

    ss1 = arrText[0].split("/")

    docID = ss1[0].strip()

    docName = ss[1].strip()

    resultDict[docID+"_"+docName] = 1

    return resultDict.iteritems()

sc=SparkContext('local')
textfile = sc.textFile("path to my data")
fileContent = textfile.flatMap(tokenize)
rdd = sc.parallelize(fileContent.collect())
rdd= rdd.map(lambda x: (x[0], x[1])).reduceByKey(add)
print rdd.collect()
#reduceByKey(lambda a,b: a+b)
rdd.coalesce(1).saveAsTextFile("path to result")

我在这里发布更多警告:在此之后作业没有运行。有人可以帮我解决这个问题吗?

16/06/10 19:19:58 WARN TaskSetManager: Stage 1 contains a task of very large size (17693 KB). The maximum recommended task size is 100 KB.
16/06/10 19:19:58 INFO TaskSetManager: Starting task 0.0 in stage 1.0 (TID 5314, localhost, partition 0,PROCESS_LOCAL, 18118332 bytes)
16/06/10 19:19:58 INFO Executor: Running task 0.0 in stage 1.0 (TID 5314)
16/06/10 19:43:00 INFO BlockManagerInfo: Removed broadcast_1_piece0 on localhost:43480 in memory (size: 3.9 KB, free: 511.1 MB)
16/06/10 19:43:00 INFO ContextCleaner: Cleaned accumulator 2

【问题讨论】:

  • 这个警告基本上是说你的一个转换函数太大了。既然你说在这之后工作不会继续,我会寻找一些增加内存占用的 inf 循环。
  • 你的意思是说我们需要在编译时使用标志--executor-memory来增加内存。

标签: python apache-spark


【解决方案1】:

当 Spark 序列化任务时,它会递归地序列化完整的闭包上下文。在这种情况下,逻辑罪魁祸首似乎是您在tokenize 中使用的unicodedata。我可能错了,但我在代码中看不到任何其他繁重的数据结构。 (注意,我通常将 Spark 与 Scala 一起使用,而我的 Python 已经生锈了。)我想知道该库是否由执行程序节点上不可用的重型数据结构支持。

处理这些类型问题的典型模式是:

  1. 确保所有库都在执行程序节点上可用。

  2. 使用广播变量将繁重的数据结构分发给执行程序。

不相关,除非您将其用作调试工具,否则您正在使用collect 将所有数据收集回驱动程序,这是不必要的。转换可以链接:

sc.textFile(...).flatMap(...).map(...).reduceByKey(add).coalesce(1).saveAsTextFile(...)

【讨论】:

  • 这对我来说很有意义......我在没有“收集”的情况下运行它。谈到编码,我必须对大文本进行编码才能访问它。顺便说一句,这项工作完成了所有的地图功能。它只是停在了 reduceByKey 上......所以我怀疑“unicodedata”是否有任何问题。
  • 顺便说一句,我在单个节点上运行它...这会是问题的原因吗...
  • 你是对的,那么问题不应该是unicodedata。应该是add,没有多大意义。在本地模式下运行仅意味着您可能有额外的 RAM 限制,但异常表明该问题与基于闭包的序列化大小有关,而不是与 RAM 中的处理大小有关。
  • 我试着改变你说的方式。但没有运气。 'add' 是一个 inbuit spark 函数。那么它可能会出现什么问题......
  • 将您的代码放入 Databricks 社区版笔记本并在那里共享链接。没有完整的环境是不可能调试闭包泄漏的。
猜你喜欢
  • 2018-09-02
  • 2017-05-28
  • 1970-01-01
  • 2019-11-28
  • 2022-07-16
  • 2016-01-11
  • 2014-12-19
  • 2021-11-12
  • 2020-06-30
相关资源
最近更新 更多