我正在尝试找出在Pyspark中分配资源和创建任务的正确方法。
我有以下python代码:
import time
def xxx():
tt=[]
x=time.time()
for i in range(0,4):
for j in range(0,100000000):
tt.append((i/2)*3)
print(time.time()-x)
return tt
这是一个简单的嵌套循环,它在每次迭代中进行一些计算并将值附加在列表中。 在本地计算机上运行此代码平均需要80秒(使用python3.7)才能完成。
以下是我在Pyspark中并行化先前代码的尝试:
t.py:
from pyspark import SparkContext, SparkConf
import os
import time
import random
if __name__ == "__main__":
conf = SparkConf().setAppName("App")
conf = (conf.setMaster('local[*]'))
sc = SparkContext(conf=conf)
x=time.time()
a_loop = lambda x: ((y/2)*3 for y in range(100000000))
q=sc.parallelize(range(4)).flatMap(a_loop)
q=q.collect()
print(len(q))
print(time.time()-x)
sc.stop()
以下配置导致以下时间:
spark-submit --driver-memory 10g --executor-memory 500m --conf spark.sql.shuffle.partitions=10 --conf spark.driver.maxResultSize=10g --executor-cores=4 t.py
所需时间:824.13秒。
我已经尝试过这种配置的许多变体,但是在700秒以下却没有得到任何数字。
此外,我注意到该应用程序占用大量内存,但我不知道为什么:
所以我的问题是:我是否在并行方法中犯了一些根本性的错误?我是错误地使用代码还是配置或两者都使用?
PS。我的机器有2个物理和4个逻辑内核,以及8 GB RAM。