Spark能否并行化嵌套?

时间:2016-12-25 20:38:18

标签: python apache-spark amazon-ec2 pyspark

我在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个循环。

是否可以为每个函数定义它将使用多少个核心?

1 个答案:

答案 0 :(得分:0)

  

Spark可以并行嵌套吗?

它不能。 Spark并行执行必须是平的。

您可以使用单独的线程提交多个并发作业 。例如,使用带有线程的joblibnumSlices

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))