Spark RDD解密

 

1.  基于数据集的处理: 从物理存储上加载数据,而后操做数据,而后写入数据到物理设备mysql

    基于数据集的操做不适应的场景:sql

  1. 不适合于大量的迭代:
  2. 不适合交互式查询:每次查询都须要对磁盘进行交互.
  3. 基于数据流的方式不可以复用曾经的结果或者中间的结果; 

2. RDD弹性数据集函数

   特色: 性能

       A)自动的进行内存和磁盘数据的存储切换:spa

       B) 基于lineage的高效容错;scala

       C) Task若是失败会自动进行重试接口

       D) Stage若是失败会自动进行重试,并且只会计算失败的分片;内存

       E) Checkpointpersist.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:Intshuffle:Boolean=false):RDD[T] 

      他们两个都是RDD的分区进行从新划分,repartition只是coalesce接口中shuffletrue的简易实现,(假设RDDN个分区,须要从新划分红M个分区)

1)、N<M。通常状况下N个分区有数据分布不均匀的情况,利用HashPartitioner函数将数据从新分区为M个,这时须要将shuffle设置为true

2)若是N>M而且NM相差很少,(假如N1000M100)那么就能够将N个分区中的若干个分区合并成一个新的分区,最终合并为M个分区,这时能够将shuff设置为false,在shufflfalse的状况下,若是M>N时,coalesce为无效的,不进行shuffle过程,父RDD和子RDD之间是窄依赖关系。

3)若是N>M而且二者相差悬殊,这时若是将shuffle设置为false,父子RDD是窄依赖关系,他们同处在一个Stage中,就可能形成spark程序的并行度不够,从而影响性能,若是在M1的时候,为了使coalesce以前的操做有更好的并行度,能够讲shuffle设置为true

总之:若是shufffalse时,若是传入的参数大于现有的分区数目,RDD的分区数不变,也就是说不通过shuffle,是没法将RDD的分区数变多的。

4. RDD的延迟加载. Lazy. 构造的时候的第一个参数就是父RDD;

      就至关于 f(x) = x + 1; x =y+1; y=z+1; 这就是依赖,最终的计算是先计算z的值,而后再计算y的值,最终计算出f(x);

      Spark不产生中间结果,可是须要手动cachepersist. 内存消耗比较大,最主要是sparkshuffle机制(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到计算节点内存当中.

相关文章
相关标签/搜索