我在60代码EC2实例上运行以下代码
from pyspark import SparkContext
import time, md5
workers_count = 10
sc = SparkContext("local[%s]" % workers_count, "App Name")
max_num = 50000000
start_time = time.time()
first_item = sc.parallelize(xrange(max_num)).map(lambda n: (n, md5.md5(str(n)).hexdigest())).reduce(lambda a,b: a if a[1] > b[1] else b)
end_time = time.time()
print("sorting took took %s seconds with %s workers" % (end_time-start_time, workers_count))
与1名工人一起花了52秒。
与2名工人一起花了26秒。
与4名工人一起花了13秒
8名工人花了6秒
16名或更多工人需要4秒(或多或少)
上面的代码是内部部分,需要运行几百万次
从上面我了解到并行化程度可以提高性能,这是可以的,但是因为我使用的是60核的机器,我希望它能够充分利用内核,我希望每个循环使用8个核心,同时运行7个循环。
是否可以为每个函数定义它将使用多少个核心?
答案 0 :(得分:0)
Spark可以并行嵌套吗?
它不能。 Spark并行执行必须是平的。
您可以使用单独的线程提交多个并发作业 。例如,使用带有线程的joblib
和numSlices
:
import hashlib
from joblib import Parallel, delayed
def run(sc, numSlices=8):
return sc.range(0, max_num, numSlices=numSlices) \
.map(lambda n: (n, hashlib.md5(str(n)).hexdigest())) \
.reduce(lambda a,b: a if a[1] > b[1] else b)
Parallel(n_jobs=7, backend="threading")(delayed(run)(sc) for _ in range(7))