1. 基于数据集的处理: 从物理存储上加载数据,而后操做数据,而后写入数据到物理设备; mysql
基于数据集的操做不适应的场景:sql
2. RDD弹性数据集函数
特色: 性能
A)自动的进行内存和磁盘数据的存储切换:spa
B) 基于lineage的高效容错;scala
C) Task若是失败会自动进行重试接口
D) Stage若是失败会自动进行重试,并且只会计算失败的分片;内存
E) Checkpoint和persist.ci
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<M。通常状况下N个分区有数据分布不均匀的情况,利用HashPartitioner函数将数据从新分区为M个,这时须要将shuffle设置为true。
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到计算节点内存当中.