Spark Job错误超出GC开销限制

时间:2016-06-22 04:24:26

标签: hadoop apache-spark garbage-collection out-of-memory

我正在运行一个spark作业,我在spark-defaults.sh中设置了以下配置。我在名称节点中进行了以下更改。我有1个数据节点。我正在处理2GB的数据。

spark.master                     spark://master:7077
spark.executor.memory            5g
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://namenode:8021/directory
spark.serializer                 org.apache.spark.serializer.KryoSerializer
spark.driver.memory              5g
spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

但是我收到错误,说明超出了GC限制。

以下是我正在处理的代码。

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)


# delimeter function
def findDelimiter(text):
    sD = text[1] 
    eD = text[2] 
    return (eD, sD) 

def tokenize(text):
    sD = findDelimiter(text)[1]
    eD = findDelimiter(text)[0]
    arrText = text.split(sD)
    text = ""
    seg = arrText[0].split(eD)
    arrText=""
    senderID = seg[6].strip()
    yield (senderID, 1)


conf = SparkConf()
sc = SparkContext(conf=conf)

textfile = sc.textFile("hdfs://my_IP:9000/data/*/*.txt")

rdd = textfile.flatMap(tokenize)
rdd = rdd.reduceByKey(lambda a,b: a+b)
rdd.coalesce(1).saveAsTextFile("hdfs://my_IP:9000/data/total_result503")

我甚至尝试过groupByKey而不是。但我得到了同样的错误。但是当我尝试删除reduceByKey或groupByKey时,我正在获取输出。有人可以帮我解决这个错误。

我是否还应该增加hadoop中GC的大小。正如我之前所说,我已将driver.memory设置为5gb,我在名称节点中完成了它。我也应该在数据节点中这样做吗?

3 个答案:

答案 0 :(得分:2)

尝试为spark-defaults.sh添加以下设置:

spark.driver.extraJavaOptions -XX:+ UseG1GC

spark.executor.extraJavaOptions -XX:+ UseG1GC

调整jvm垃圾收集可能很棘手,但“G1GC”看起来效果还不错。值得一试!!

答案 1 :(得分:0)

您拥有的代码应该适用于您的配置。如前所述,尝试使用G1GC。 还尝试减少存储内存分数。默认为60%。尝试将其降低到40%或更低。 您可以通过添加spark.storage.memoryFraction 0.4

来设置它

答案 2 :(得分:0)

我能够解决问题。我在主节点的root用户中运行我的hadoop。但是我在数据节点中的不同用户中配置了hadoop。现在我在数据节点的root用户中配置它们,并增加了它运行良好的执行程序和驱动程序内存。