Spark入门——1:RDD及编程接口

来源:互联网 发布:怎么学习云计算 编辑:程序博客网 时间:2024/06/06 07:11

     RDD是Spark的核心,也是整个Spark的架构基础。spark与mapreduce相比,前者提供了更加丰富的编程接口给程序猿们。所以下面主要说明RDD的基本概念,以及其重要接口。

      RDD包含4大操作:

               1,创建操作:RDD的创建有两个途径。一个是来之外部存储系统(例如:HDFS,S3)或者内部集合,另外一个是来自其他RDD的转换操作(例如map,join,filter,等)。

              1)从集合中生成:parallelize(),makeRDD()

              2)通过存储创建:textFile(),  hadoopFile(),sequenceFile(),objectFile(),hadoopRDD(),

                                          newAPIHadoopFile()

               2,转换操作:map,distinct,flatMap,repartition,coalesce,union,intersection,                                         subtract

                     如果RDD中有很多空任务或者小任务,可以调用coalesce或者repartition来减少                           partition数量。repartition只是coalesce接口中shuffle为true的简单实现,repartition                         调用coalesce

                     关于coalesce合并函数设置shuffle参数的问题(M个分区重新化为N个分区):

                     若M<N,如果有数据分布不均的情况,用HashPartitioner函数将数据重新分成M个分                  区,需将shuffle设为true

                    若M>N,且相差不多(M=1000,N=100),可将M个分区中部分分区合并为一个,最终                合成 N个分区,可将shuffle设为false,这样父子RDD之间为窄依赖

                    若M>N,且相差悬殊(M=1000,N=1),这时父子RDD本身就是窄依赖,同在一个                      stage中存在并行程度不够的问题,可将shuffle设为true,提高并行化程度

                    在并行度和shuffle数据写磁盘之间做平衡

               union操作可能包含重复数据,intersection不会有重复数据

                若map操作过程中需要频繁创建额外对象,可以用mappartition使同一个分区共享同一个              对象,以提高性能

                Zip操作默认两个RDD的partition数和元素数都相等,否则异常;zipPartition需要RDD具               有相同分区数即可

               3,控制操作:cache(),persist(),checkpoint()

               checkpoint与persist的不同在于:checkpoint操作会将RDD持久化在HDFS中,后者在memory中;其次checkpoint会切断之前所有的依赖关系

               4,行动操作:

                    集合标量行动:count,reduce,first,collect,tak*e,top,takeOrdered,aggregate

                   存储行动:saveAs@%*&#

                   

         RDD的一个操作会被用在所有该RDD的数据上(即所谓的粗粒度操作),这使得只要记下RDD的转换操作就能构建它的继承关系(lineage)。

        RDD分区:

        创建RDD时,如果不指定分区,系统会默认分区数,默认值是该程序被分配资源的CPU数目。

       RDD优先位置(preferlocation):

       RDD按照“移动计算”理念,spark调度时尽可能将任务分配到数据块存储的位置。preferlocation返回的是数据块存储的位置。

       RDD的依赖关系:

       窄依赖(OneToOneDependency):每个父RDD最多只被子RDD的一个分区所使用(map,filter)

       宽依赖(ShuffelDependency):多个子RDD依赖同一个父RDD(没经过partition的RDD进行join)

       依赖的影响:宽依赖需要取得所有父RDD所有分区数据进行计算,做类似MR里面的shuffle操作,窄依赖可以在集群的一个节点上流水线般执行;窄依赖对节点故障恢复起来更快,并行化计算效果更好。

     RDD分区函数(partitioner)

    HashPartitioner和RangePartitioner。partitioner只存在于(K,V)类型的RDD中。

 

1 0