02 | RDD与编程模型:延迟计算是怎么回事?
什么是 RDD
- 深入了解
- 翻译
- 解释
- 总结
本文通过一个生动的薯片制作故事,深入介绍了RDD(弹性分布式数据集)在Spark分布式内存计算引擎中的重要性。首先对比了RDD和数组的特点,阐述了RDD的活动范围、数据定位等方面的不同之处。随后详细介绍了RDD的四大属性:数据分片、分片切割规则、RDD依赖和转换函数,并通过薯片制作的流程形象地解释了这些属性。强调了RDD作为Spark分布式计算引擎的基石,无论采用何种API或开发语言,应用在Spark内部最终都会转化为基于RDD的分布式计算。最后,提到了进一步了解RDD的编程模型和延迟计算的重要性,指导读者如何进行代码实现,并避免在实现业务逻辑时埋下性能隐患。通过本文的阅读,读者可以快速了解RDD的重要性及其在Spark分布式内存计算引擎中的应用,为进一步学习Spark提供了基础知识。文章内容生动有趣,通过薯片制作的故事引人入胜,让读者更好地理解了RDD的属性和在Spark中的应用。同时,通过对RDD编程模型和延迟计算的讲解,为读者提供了实际的编程指导和性能优化建议。
《零基础入门 Spark》,新⼈⾸单¥59
全部留言(16)
- 最新
- 精选
- cfwseven作者大大能说一下,为什么action算子要设置成延迟计算吗
作者回复: 好问题~ 严谨的说,不是要把action算子设置成延迟计算,而是Spark在实现上,选择了Lazy evaluation这种计算模式。 TensorFlow同样也采用了类似的计算模式。这种模式有什么好处、或者说收益呢? 我的理解是:优化空间。 和Eager evaluation不一样,lazy evaluation先构建计算图,等都构建完了,在付诸执行。这样一来,中间就可以打个时间差,引擎有足够的时间和空间,对用户代码做优化,从而让应用的执行性能在用户无感知的情况下,做到最好。 换个角度说,引擎选择lazy evaluation,其实是注重“用户体验”(开发者)的一种态度~
2021-10-27332 - GAC·DU从两者的整体流程来看,结果都是不可逆的,但是WordCount可以设置Cache和Checkpoint,方便加速访问和故障修复,而土豆加工流程却不可以。土豆加工流程是DAG的概图。
作者回复: Perfect~
2021-09-1320 - 宇怎样知道程序里哪个算子最耗时,现在薯片生产速度很慢,我想知道最耗时生产环节是哪个(清洗,切割,还是烘烤)?
作者回复: 好问题,不过老弟这是典型的单机思维,为什么这么说呢? 在过程编程里面,清洗、切割、烘烤,是独立的操作,各自耗时不同,确实可以计算出来,不同环节的耗时。 但是在Spark里面,我们基本上没有办法区分这些不同操作的独立耗时。 1)一方面是,在分布式环境中,某一个操作的耗时,需要看全局节点的统计值,而不是某个机器上的执行时间 2)再者,在Spark里面,同一个Stage里面的操作,比如这里的清洗、切割还有烘烤,他们其实会被Whole Stage Code Generation优化为一份代码,在这一份代码里面,不会在区分这些不同的操作了,所以对于他们各自的执行时间,更是无从计算了。老弟可以重点关注后面课程部分的调度系统和Tungsten优化,来熟悉这些细节。 实际上,在Spark里面,我们往往不会特别关注某种操作的耗时,而主要是关注哪里是Shuffle,哪里有数据集频繁访问、扫描的现象,这些才是Spark主要的性能瓶颈
2022-01-13312 - 燃料喷射器从两者不同点看,workdcount切切实实为延迟计算,而土豆工坊的流程为切实发生的。
作者回复: 很棒的视角~ 一个是延迟计算(Lazy evaluation),一个是“及早求值”(Early evaluation)
2021-09-1625 - zx计算wordcount的时候文件路径写错了,但是却是在reduceByKey这一步报错,这步并不是action算子,这是和partitions属性有关吗
作者回复: 和partitions属性无关哈~ 不过,在reduceByKey抛异常,倒是有点意思,这说明Spark在这个环节,检查了文件路径并报错。不过,检查路径不代表trigger执行哈,真正的触发执行,还是要等到Action那一步~
2021-11-014 - welldo"我们再来看 RDD 的 partitioner 属性,这个属性定义了把原始数据集切割成数据分片的切割规则。在土豆工坊的例子中,“带泥土豆”RDD 的切割规则是随机拿取,也就是从麻袋中随机拿取一颗脏兮兮的土豆放到流水线上。后面的食材形态,如“干净土豆”、“土豆片”和“即食薯片”,则沿用了“带泥土豆”RDD 的切割规则。换句话说,后续的这些 RDD,分别继承了前一个 RDD 的 partitioner 属性。" ----------------------- 老师, 看完这段话和土豆流水线的图片, 我有几个疑问. 1. rdd分为<value>类型和<key,value>类型,数据分区方式只作用于<Key,Value>形式的数据。 并且刚开始没有任何分区方式,直到遇到包含shuffle的算子时,才会使用“分区方式”,比如hash分区。 问题1:那么,一坨数据,在成为<key,value>类型的rdd的时候(假如4片),分片方式,是不是平均分成4份呢? 2. <value>类型的rdd,没有分区器,那么它刚刚生成的时候,也是平均分吗?
作者回复: 任何一个分布式数据集,RDD也好、DataFrame、Dataset也好,都是有分区、并行度、分区器这些个概念的哈,跟是否Shuffle没有关系 Shuffle只是改变了原始数据集的分区方式,而已。 对于HDFS、S3上的分布式数据集,原始的分区数,或者说并行度,就是HDFS、S3中文件原始的分区数,二者一致。 对于那些在Driver端读的单机文件、或是创建的数据集,可以人为指定分区数(并行度),比如parallelize。 总之,不管是哪类数据,数据集一旦进入Spark,是一定有并行度、分区数这个概念的,哪怕并行度是1。 老弟还要好好消化一下这些“土豆”啊,哈哈~
2021-10-1434 - LJKAction中漏了一个reduce,今天才注意到reduceByKey是transformation而reduce是action
作者回复: 是的,感谢提醒~
2021-09-184 - 田大侠作者大大有个问题问一下 这里的依赖关系有个比较明显的差别 1.map计算是一个数据分片依赖于前一个RDD“数据分片”,就是说在同一个分片上可以连续计算直到reduce之前 2.reduce计算是依赖关系前面一个RDD的所有的数据集 spark实际计算的时候要等前面所有的map计算完成才能进行reduce操作 上面的我的两个理解是否有偏差?
作者回复: 理解的非常到位,没有任何问题~ 满分💯
2022-02-192 - Eazow请问土豆工坊图是用什么画滴那?
作者回复: draw.io,有在线版,也有APP~
2021-11-242 - xuchuan都是来料加工,目标都是高效率生产。
作者回复: 赞👍,正解~
2021-10-17