spark rdd解密 -尊龙游戏旗舰厅官网
1. 基于数据集的处理: 从物理存储上加载数据,然后操作数据,然后写入数据到物理设备;
基于数据集的操作不适应的场景:
2. rdd弹性数据集
特点:
a)自动的进行内存和磁盘数据的存储切换:
b) 基于lineage的高效容错;
c) task如果失败会自动进行重试
d) stage如果失败会自动进行重试,而且只会计算失败的分片;
e) checkpoint和persist.
3. 数据分片的高度弹性. partition合并可以提升效率(数据比较小的适合), 数据大的时候可以提高partition设置,避免oom. 如果小的分片变大的时候,一般需要shuffle. 可以使用coalesce.
def coalesce(numpartitions: int, shuffle: boolean = false)
(implicit ord: ordering[t] = null): rdd[t]
返回一个新的rdd,且该rdd的分区个数等于numpartitions个数。如果shuffle设置为true,则会进行shuffle.
def repartition(numpartitions: int)(implicit ord: ordering[t] = null): rdd[t]
该函数其实就是coalesce函数第二个参数为true的实现
repartition(numpartitions:int):rdd[t]和coalesce(numpartitions:int,shuffle:boolean=false):rdd[t]
他们两个都是rdd的分区进行重新划分,repartition只是coalesce接口中shuffle为true的简易实现,(假设rdd有n个分区,需要重新划分成m个分区)
1)、n
2)如果n>m并且n和m相差不多,(假如n是1000,m是100)那么就可以将n个分区中的若干个分区合并成一个新的分区,最终合并为m个分区,这时可以将shuff设置为false,在shuffl为false的情况下,如果m>n时,coalesce为无效的,不进行shuffle过程,父rdd和子rdd之间是窄依赖关系。
3)如果n>m并且两者相差悬殊,这时如果将shuffle设置为false,父子rdd是窄依赖关系,他们同处在一个stage中,就可能造成spark程序的并行度不够,从而影响性能,如果在m为1的时候,为了使coalesce之前的操作有更好的并行度,可以讲shuffle设置为true。
总之:如果shuff为false时,如果传入的参数大于现有的分区数目,rdd的分区数不变,也就是说不经过shuffle,是无法将rdd的分区数变多的。
4. rdd的延迟加载. lazy. 构造的时候的第一个参数就是父rdd;
就相当于 f(x) = x 1; x =y 1; y=z 1; 这就是依赖,最终的计算是先计算z的值,然后再计算y的值,最终计算出f(x);
spark不产生中间结果,但是需要手动cache,persist. 内存消耗比较大,最主要是spark的shuffle机制(spark1.x以前有数据规模的限制.现在没有,原因主要是shuffle的原因,但是最新版本以来shuffle支持更多的方式.)
5. 容错的两种方式: 数据检查点和记录数据的更新;
spark采取的是记录数据更新方式容错为什么更高效:
a) rdd是不可变 lazy:数据的恢复需要checkpoint. 比如从第900步恢复的前提是要在900步进行checkpoint.
b) rdd是粗粒度. 写操作是粗粒度.但是rdd读操作既可以是粗粒度也可以是细粒度的. 高效率的. 简化复杂度. 但有部分场景不适合spark rdd. 爬虫就不合适.
6. 关于数据本地性问题, 如果读取的是比如mysql, hbase,那么需要这些集群和spark集群在一个集群里; 这样都是内网进行读取; 针对不同机房数据不同步问题可以采用tachyon 内存同步.
7. 实时事物性处理不适用spark.
8. 如果是scala集合的话,那么针对数据本地性,是数据集合会被copy到计算节点内存当中.
总结
以上是尊龙游戏旗舰厅官网为你收集整理的spark rdd解密的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: asp.net mvc 3 常用