石小疯 发表于 2024-8-31 23:11:08

【赵渝强老师】Spark中的RDD

https://i-blog.csdnimg.cn/direct/9f0ed709611e41c99192b581aa637dc9.png#pic_center
  RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,它是Spark中最根本、也是最重要的的数据模型。它由分区组成,每个分区被一个Spark的Worker从节点处理,从而支持分布式的并行计算。RDD通过检查点Checkpoint的方式提供主动容错的功能,而且具有位置感知性调理和可伸缩的特性。通过RDD也提供缓存的机制,可以极大地进步数据处理的速率。
  视频解说如下:
Spark中的RDD               【赵渝强老师】Spark中的RDD
    一、RDD的组成

  在WordCount示例中,每一步都是天生一个新的RDD用于保存这一步的结果。创建RDD也可以使用下面的方式:
scala> val myrdd = sc.parallelize(Array(1,2,3,4,5,6,7,8),2)
  这行代码创建了一个名叫myrdd的RDD聚集,该聚会集包罗了一个数组,而且这个RDD由2个分区组成。通过查看RDD的partitions算子可以查看分区的长度。
scala> myrdd.partitions.length
res0: Int = 2
  那么RDD、分区和Worker节点之间又是什么接洽呢?这里以刚才创建的myrdd为例来说明它们之间的关系,如下图所示。
https://i-blog.csdnimg.cn/direct/52b5784d40d44e9f80ff9947f91f278b.png
  图中假设有两个Worker的从节点。myrdd又包罗了两个分区,每个分区会有一个分区号,分区号从零开始。从图9.9可以看出在第一个Worker上处理的分区0中的数据,即:{1,2,3,4};而在第二个Worker处理的是分区1中的数据,即:{5,6,7,8}。
   提示:这里可以把分区理解成是一个物理概念,它里面的数据由Worker上的Executor执行的使命处理。最外层的虚线方框表示的是RDD,可以看出它实在是一个逻辑概念。
二、RDD的特性

  在相识了RDD的根本概念后,那么RDD又具有什么样的特性呢?Spark RDD的源码中关于RDD的特性做了如下的表明。
* Internally, each RDD is characterized by five main properties:
*
*- A list of partitions
*- A function for computing each split
*- A list of dependencies on other RDDs
*- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
*- Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
  通过这段注释可以相识到RDD具备以下5个根本的特性:


[*]由一组分区(Partition)组成
  对于RDD来说,每个分区都会被一个计算使命处理并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU内核的数目。


[*]一个计算每个分区的函数
  Spark中RDD的计算是以分区为单元。每个RDD都需要实现compute函数,从而达到处理数据的目的。


[*]RDD之间的依赖关系
  可以把WordCount程序代码拆开,从而单步执行。每一次转换时可以定义一个新的RDD来保存这一步的结果,如下所示。
scala> val rdd1 = sc.textFile("hdfs://bigdata111:9000/input/data.txt")
scala> val rdd2 = rdd1.flatMap(_.split(" "))
scala> val rdd3 = rdd2.map((_,1))
scala> val rdd4 = rdd3.reduceByKey(_+_)
scala> rdd4.saveAsTextFile("hdfs://bigdata111:9000/output/spark/wc")
  这里一共定义了4个RDD,分别是:rdd1、rdd2、rdd3和rdd4,其中:rdd4依赖rdd3,rdd3依赖rdd2,而rdd2依赖rdd1。根据依赖关系的差别,可以分别使命执行的阶段(Stage),从而支持检查点的容错机制。
   提示:如果在计算过程中丢失了某个分区的数据,Spark可以通过这个依赖关系重新举行计算,而不是对RDD的所有分区举行重新计算。


[*]一个Partitioner
  Partitioner是Spark RDD的分区函数。Spark内部实现了两种范例的分区函数:一种是基于哈希算法的HashPartitioner;另一种则是基于范围的RangePartitioner。通过继承Partitioner也可以实现自定义的分区函数。分区函数不但决定了RDD自己的分区数量,也决定了RDD Shuffle输出时的分区数量。


[*]一个存储了读取每个分区优先位置(preferred location)的列表
  根据这个列表的信息,Spark在举行使命调理的时候会尽大概地将计算使命分配到其所要处理数据块的存储位置,这样可以进步处理数据的效率。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【赵渝强老师】Spark中的RDD