我正在运行一个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,我在名称节点中完成了它。我也应该在数据节点中这样做吗?
答案 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用户中配置它们,并增加了它运行良好的执行程序和驱动程序内存。