Spark Learn
RDD Programming Guide
overview
1.一个driver program 执行用户的功能函数,在集群上执行并行操作
2.RDD resilient distributed dataset 有弹性的分布式的数据集;
- 分布在多个节点上,可以被并行操作;
- 一般有HDFS文件创建,或者由已存在的 scala Collettion转化而来;
- 可以被持久化在内存;每一个一个转化操作每次都需要计算,可以进行在内存中,进行缓存;
- 可以从失败节点中自动恢复
3.共享变量,在不同节点不同任务中,通过变量副本,来做到并行操作的;
- 两种共享变量:
- broadcast variables:在所有的节点中,缓存一个变量
- accumulators:只支持add 操作,比如 count, sum
Shuffle operations
shuffle是spark重新分配数据的一种机制;比如,数据在跨executors和机器的copy;shuffle是一个复杂和昂贵的代价.
shuffle 会引起 disk I/O, 数据序列化 ,网络 I/O; spark 产生一系列的tasks,采用 MapReduce操作来管理这些shuffle操作;map用来组织这些数据,reduce用来聚合这些数据;
一些shuffle 组织这些数据,消费明显的堆内存操作,比如reduceByKey 和 aggregateByKey,在map端产生这些内存占用,在ByKey端也会产生这些内存占用;当内存不够时,还会将数据溢出到硬盘上,增加额外的disk I/O 和垃圾回收;
shuffle也产生了大量的中间文件在disk, 这些文件将会被保存,知道相应的RDDs不在使用和发生垃圾回收;这些文件会长期存在,再次使用时,不需要被创建;运行长时间的spark jobs 将会消耗大量的硬盘空间;这些存储由spark.local.dir指定;
RDD Persistence
计算出来的dataset可以被持久化,每一个节点存用一些分区来存储相应的dataset;
cacke 是默认容错的,如果一个partition 丢失了,将会自动利用原来的转化操作进行重新计算;
持久化级别
Shared Variables
Brocadcast Variables
广播变量对每个程序来说是只读的,每一个节点一份,不是每个任务一份;使用场景:以一个更高效的方式将输入变量集合copy到每一个节点中;spark尝试使用更有效广播算法,来减少通信的话费.
Accumulators
只做,累加计算;分布在集群中的task,可以累加这个变量,不能读取,只有driver program 才能进行读取 .value操作
只有触发了action操作,accumulator才会被更新;transformations 不会更新accumulator,在Action中,spark保证每个task对累加器的更新只有一次;重新启动任务不会更新值;
在transformations中,如果task or job Stage 被重新执行,任务将会被更新很多次;
Stage
spark task stage 的划分,通过shuffle操作;
引发思考:
1.driver program 是怎做的,
2.RDD是怎么实现的,分布在不同节点,被并行计算,失败恢复;