如果这个问题已经得到解答,我道歉。我确实看过档案,但我没有找到特定于我的问题的答案。
我是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()
答案 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[*]
表示使用与您的计算机一样多的内核(请参阅SparkContext
中LOCAL_N_REGEX的案例):
def localCpuCount: Int = Runtime.getRuntime.availableProcessors()
val threadCount = if (threads == "*") localCpuCount else threads.toInt
它只是提示默认使用多少分区,但不会阻止Spark上升或下降。它主要取决于Spark应用的优化,最终为您的分布式计算提供最佳执行计划。 Spark为您做了很多,抽象级别越高,优化越多(参见Spark SQL优化器中的batches)。