为什么本地[*]不使用我机器中的所有可用内核?

时间:2017-05-29 11:11:55

标签: python apache-spark pyspark rdd

如果这个问题已经得到解答,我道歉。我确实看过档案,但我没有找到特定于我的问题的答案。

我是Spark的新手。我试图在我的MacOS Sierra机器上使用spark-2.1.1运行本地并行连接的简单示例。由于我有4个核心,并且有4个任务每个需要10秒钟,我希望总共花费超过10秒钟。

我看到每项任务都需要预期的时间。但在我看来只有2个执行线程。我期待4.正如您在代码中看到的,每个元组的值是相应任务的执行时间。

insight086:pyspark lquesada $ more output / part-00000

(u'1', 10.000892877578735)
(u'3', 10.000878095626831)

insight086:pyspark lquesada $ more output / part-00001

(u'2', 10.000869989395142)
(u'4', 10.000877857208252)

此时间总计超过20秒:

total_time 33.2253439426

提前感谢您的帮助!

干杯, 路易斯

输入文件:

1
2
3
4

SCRIPT:

from pyspark import SparkContext
import time

def mymap(word):
    start = time.time()
    time.sleep(10)
    et=time.time()-start
    return (word, et)

def main():
    start = time.time()
    sc = SparkContext(appName='SparkWordCount')

    input_file = sc.textFile('/Users/lquesada/Dropbox/hadoop/pyspark/input.txt')
    counts = input_file.flatMap(lambda line: line.split()) \
                     .map(mymap) \
                     .reduceByKey(lambda a, b: a + b)
    counts.saveAsTextFile('/Users/lquesada/Dropbox/hadoop/pyspark/output')

    sc.stop()
    print 'total_time',time.time()-start

if __name__ == '__main__':
   main()

1 个答案:

答案 0 :(得分:0)

这就是为什么Divide and conquer algorithms具有使用它们才有意义的阈值的原因。在Spark中添加分布(使用并行性)并且你有很多机器可以做这么小的计算。你只是没有利用Spark这个4元素数据集的优势。

假设随着越来越大的数据集,时间会收敛到您的预期。

此外,读取本地数据集时的分区数最多为2,因此如果没有repartitioning,则仅使用2个核心。

  

重新分区(numPartitions:Int)(隐式ord:Ordering [T] = null):RDD [T] 返回一个具有正好numPartitions分区的新RDD。

     

可以增加或减少此RDD中的并行度。在内部,它使用shuffle重新分配数据。

     

如果要减少此RDD中的分区数,请考虑使用coalesce,这可以避免执行shuffle。

local[*]表示使用与您的计算机一样多的内核(请参阅SparkContextLOCAL_N_REGEX的案例):

def localCpuCount: Int = Runtime.getRuntime.availableProcessors()
val threadCount = if (threads == "*") localCpuCount else threads.toInt

它只是提示默认使用多少分区,但不会阻止Spark上升或下降。它主要取决于Spark应用的优化,最终为您的分布式计算提供最佳执行计划。 Spark为您做了很多,抽象级别越高,优化越多(参见Spark SQL优化器中的batches)。