[英]Why is this simple Spark program not utlizing multiple cores?
所以,我在16核多核系统上运行这个简单的程序。 我通过发出以下命令来运行它。
spark-submit --master local[*] pi.py
该程序的代码如下。
#"""pi.py"""
from pyspark import SparkContext
import random
N = 12500000
def sample(p):
x, y = random.random(), random.random()
return 1 if x*x + y*y < 1 else 0
sc = SparkContext("local", "Test App")
count = sc.parallelize(xrange(0, N)).map(sample).reduce(lambda a, b: a + b)
print "Pi is roughly %f" % (4.0 * count / NUM_SAMPLES)
当我使用top来查看CPU消耗时,只使用了1个核心。 为什么会这样? Seconldy,spark文档说默认并行性包含在属性spark.default.parallelism中 。 如何从我的python程序中读取此属性?
因为以上都没有真正对我有用(也许是因为我真的不理解它们),这是我的两分钱。
我用spark-submit program.py
开始我的工作,在文件里面我有sc = SparkContext("local", "Test")
。 我试图用sc.defaultParallelism
验证spark 看到的内核数量。 事实证明它是1.当我将上下文初始化更改为sc = SparkContext("local[*]", "Test")
它变为16(我的系统的核心数),我的程序使用了所有核心。
我很新的火花 ,但我的理解是,在默认情况下本地指示使用一个核心的,当它被设置里面的程序,它会覆盖其他设置(肯定在我的情况下,它会覆盖从配置文件和环境变量)。
可能是因为对sc.parallelize的调用将所有数据放入一个单独的分区。 您可以将分区数指定为并行化的第二个参数:
part = 16
count = sc.parallelize(xrange(N), part).map(sample).reduce(lambda a, b: a + b)
请注意,这仍然会在驱动程序中使用一个CPU生成1200万个点,然后仅将它们分散到16个分区以执行reduce步骤。
在分区之后,更好的方法是尝试完成大部分工作:例如,以下内容仅在驱动程序上生成一个小数组,然后让每个远程任务生成实际的随机数和随后的PI近似值:
part = 16
count = ( sc.parallelize([0] * part, part)
.flatMap(lambda blah: [sample(p) for p in xrange( N/part)])
.reduce(lambda a, b: a + b)
)
最后,(因为我们越懒越越好),spark mllib实际上已经有了一个很好地并行化的随机数据生成,请看一下: http ://spark.apache.org/docs/1.1.0/mllib -statistics.html#random-data-generation 。 所以也许以下内容接近您尝试做的事情(未经测试=>可能无法正常工作,但希望能够接近)
count = ( RandomRDDs.uniformRDD(sc, N, part)
.zip(RandomRDDs.uniformRDD(sc, N, part))
.filter (lambda (x, y): x*x + y*y < 1)
.count()
)
要更改CPU核心消耗,请在spark-env.sh
spark-installation-directory/conf
中的spark-env.sh
文件中设置spark-env.sh
使用的核心数。这可以通过spark-env.sh
文件中的SPARK_EXECUTOR_CORES
属性完成。 默认情况下,该值设置为1。
我尝试了@Svend提到的方法,但仍然无效。
以下适用于我:
不要使用local
URL,例如:
sc = SparkContext("local", "Test App")
。
像这样使用主URL:
sc = SparkContext("spark://your_spark_master_url:port", "Test App")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.