民间,
运行pyspark代码从hdfs读取500mb文件并从文件内容构造numpy矩阵
9个数据节点 128 GB内存/ 48 vCore CPU /节点
conf = SparkConf().setAppName('test') \
.set('spark.executor.cores', 4) \
.set('spark.executor.memory', '72g') \
.set('spark.driver.memory', '16g') \
.set('spark.yarn.executor.memoryOverhead',4096 ) \
.set('spark.dynamicAllocation.enabled', 'true') \
.set('spark.shuffle.service.enabled', 'true') \
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \
.set('spark.driver.maxResultSize',10000) \
.set('spark.kryoserializer.buffer.max', 2044)
fileRDD=sc.textFile("/tmp/test_file.txt")
fileRDD.cache
list_of_lines_from_file = fileRDD.map(lambda line: line.split(" ")).collect()
收集件正在吐出内存错误。
18/05/17 19:03:15 ERROR client.TransportResponseHandler: Still have 1
requests outstanding when connection fromHost/IP:53023 is closed
18/05/17 19:03:15 ERROR shuffle.OneForOneBlockFetcher: Failed while starting block fetches
java.lang.OutOfMemoryError: Java heap space
非常感谢任何帮助。
答案 0 :(得分:0)
当我通过Jupyter Notebook运行代码时,我遇到了这个问题,该代码运行在hadoop集群的edgenode上
因为您只能通过客户端模式从Jupyter提交代码(相当于从edgenode启动spark-shell),所以spark驱动程序始终是edgenode,它已经与其他长时间运行的守护程序进程一起打包,其中可用内存为总是小于我文件上的文件RDD.collect()所需的内存
我将Jupyer中的内容放到.py文件中并通过spark-submit调用相同的设置哇! ,它在那里运行了几秒钟,原因是,spark-submit被优化,从一个需要从集群中获取内存的节点中选择驱动程序节点。
spark-submit --name "test_app" --master yarn --deploy-mode cluster --conf spark.executor.cores=4 --conf spark.executor.memory=72g --conf spark.driver.memory=72g --conf spark.yarn.executor.memoryOverhead=8192 --conf spark.dynamicAllocation.enabled=true --conf spark.shuffle.service.enabled=true --conf spark.serializer=org.apache.spark.serializer.KryoSerializer --conf spark.kryoserializer.buffer.max=2044 --conf spark.driver.maxResultSize=1g --conf spark.driver.extraJavaOptions='-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:MaxDirectMemorySize=2g' --conf spark.executor.extraJavaOptions='-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:MaxDirectMemorySize=2g' test.py
我们的下一步是查看Jupyter笔记本是否可以通过Livy JobServer或类似方法向YARN群集提交spark作业。