Spark入门阅读文档笔记2

知识点1:
a:Spark支持两种操作,transformations和actions(略)
b:所有的transformations都是延迟加载的,spark会记住对于dataset transformations,只有当有action触发的时候才会返回结果(这样高效)。
这么设计的优点:对于中间结果不用返回给驱动程序,只返回最终的结果
c:可以缓存RDD(略)

Spark入门阅读文档笔记2_第1张图片


知识点2:

为了提高效率,我们可以将RDD缓存,但缓存的时机是在第一触发计算之后才缓存,并不是调用pesist或者cache之后就立马缓存了。

Spark入门阅读文档笔记2_第2张图片

补充:


Spark入门阅读文档笔记2_第3张图片

知识点3:Spark闭包

在分布式条件下如下代码结果 counter = 0原因:

var counter = 0
var rdd = sc.parallelize(data)

// Wrong: Don't do this!!
rdd.foreach(x => counter += x)

println("Counter value: " + counter)

Spark将对RDD的计算划分成多个task,每一个task在woker的executor中完成计算,Saprk处理这些Task的closure,闭包中的变量和方法只在处理的executor中可见。
闭包被序列化发送到每一个executor中。

发送到executor的闭包中的变量都是副本,不在是驱动程序中的counter。但是在驱动节点中任然有一个counter。但是驱动程序中的counter在对worker上的executor是不可见的,executor只能见到自己的闭包中副本counter,因此最终counter中的值依然为0


Spark入门阅读文档笔记2_第4张图片

补充:

通常,闭包像一个环或者是一个本地定义的方法,不应该被用来改变一些全局的状态。spark不会定义和保证对闭包之外的对象的改变行为一定生效。一些代码在本地模式运行偶尔可能是正确的,但是在分布式模式下不一定是预期的结果。如果有全局的聚合的话使用Accumulator代替。


知识点3:打印RDD

Spark入门阅读文档笔记2_第5张图片

打印RDD中的所有元素的通常作法是使用rdd.foreach(println) 或者 rdd.map(println).在单一的机器上,这样做会产生期望的结果。然而,在集群模式下,输出将会在每个执行体的标准输出上,而不是在驱动节点上,所以驱动节点的标准输出将不会有结果。为了在驱动节点上打印所有元素,可以先使用collect方法将RDD带到驱动节点上,rdd.collect().foreach(println)。这样做可能会造成驱动节点内存溢出,因为collect方法将整个RDD收集到一台机器上。如果你只是想打印RDD的部分元素,可以使用较为安全的做法:rdd.take(100).foreach(println)





引用来源:http://m.blog.csdn.net/article/details?id=46552823

你可能感兴趣的:(Spark入门阅读文档笔记2)