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

     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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值