一、基本认识

RDD 是Spark大数据计算引擎中,抽象的一种数据结构。

RDD(Resilient Distributed Dataset),中文意思是弹性分布式数据集,它是Spark中的基本抽象。在Spark源码中,有下面的注释:

RDD 有五个主要的属性:

  • A list of partitions (分区列表)
  • A function for computing each split (分区计算函数) 相同的计算逻辑应用在不同的分区中
  • A list of dependencies on other RDDs (多个RDD之间存在依赖关系)
  • 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的执行原理
 
    类似于IO处理,体现了装饰者设计模式。
 
    从计算的角度来看,计算过程受两个因素的影响:计算资源和计算逻辑。执行计算的过程就是将计算资源和计算逻辑进行一定的整合。
    
    spark在执行计算的过程中,会先向集群申请资源,然后把程序的处理逻辑分成一个个的计算任务,然后把任务发到已经分配资源的计算节点上。按照指定的计算模型进行数据计算。
    
    RDD是spark用于数据处理的核心模型。Yarn环境中,RDD的执行原理如下所示:
 
  • 启动Yarn集群资源
    
           
 
  • spark申请资源,创建调度节点和计算节点
          
 
  • 根据需求,spark把计算逻辑,根据分区,划分成不同的任务
          
 
 
  • 调度节点把任务根据计算节点的状态,发送到对应的计算节点上进行计算
          
 
三、在代码中使用RDD
 
1、创建RDD
从集合(内存)、外部文件、其它RDD中创建RDD,代码如下:
 import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext} object Spark01RddCreate {
def main(args: Array[String]): Unit = {
System.setProperty("hadoop.home.dir", "C:\\Hadoop\\")
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("spark01rddmemory")
val sc = new SparkContext(sparkConf) // TODO: Spark 从内存中创建RDD
val list = List(1, 2, 3, 4)
val rdd1 = sc.parallelize(list)
val rdd2 = sc.makeRDD(list)
rdd1.collect().foreach(println)
rdd2.collect().foreach(println) // TODO: Spark 从外部文件中创建RDD
val sc_text: RDD[String] = sc.textFile("G:\\SNBRecommendSys\\recommender\\DataLoader\\src\\main\\input_data")
System.out.println("从外部文件中创建RDD:\n")
sc_text.collect().foreach(println) // TODO: Spark 从其他RDD创建RDD
val flatRDD = sc_text.flatMap(line => {
line.split(" ")
})
System.out.println("从其他RDD创建RDD:\n")
flatRDD.collect().foreach(println) sc.stop()
}
}

2、关于RDD并行度的理解

Spark将一个作业切分为多个任务后,会发送给Excutor节点并行计算,能够并行计算的任务数量就是并行度。计算的任务数量可以在创建RDD的时候去指定。
RDD中,分区的数量就是RDD的并行度,设置并行度就是设置分区的数量。
 
下面代码中,我们可以看到设置并行度,就是在创建RDD的时候,传入的第二个参数值
 import org.apache.spark.{SparkConf, SparkContext}

 object Spark02RddParallelizeSet {
def main(args: Array[String]): Unit = {
System.setProperty("hadoop.home.dir", "C:\\Hadoop\\")
val spark = new SparkConf().setMaster("local[*]").setAppName("RddParallelizeSet")
val context = new SparkContext(spark) val list = List(1, 2, 3, 4, 5) // TODO: 从内存创建RDD,并且设置并行执行的任务数量
// numSlices: Int = defaultParallelism
val memoryRDD = context.makeRDD(list, 4)
memoryRDD.collect().foreach(println) // TODO: 结束
context.stop()
}
}

我们在一层层进入Spark源码,最终可以查看到关于RDD并行度的相关信息:

我们可以在这个实现方法里看到 scheduler.conf.getInt(参数一,参数二),参数一是spark配置文件里的一个配置项,参数二的意思是本地机器的cpu核数。调度程序是从spark的配置文件里读取了 spark.default.parallelism 这个配置。如果没有读取到这个配置的话,则并行度设置将会与本地机器的cpu核数一样。

现在回到我们自己写的程序里,在创建spark配置实例的时候,我们其实已经在设置要用多少个本地机器的核数了:

setMaster() 里面的 local[*],代表的含义是本地机器cpu有多少核,在调度的时候就用到多少核。当然我们也可以设置其它数字,如果你想这样做的话。现在,我们大致可以理解设置并行度是怎么一回事了。
 
最后,源码是个好东西,多去看优秀的源码,很多不清楚的地方都能够迎刃而解。
加油,共勉!
 

关于Spark RDD 的认识的更多相关文章

  1. Spark Rdd coalesce()方法和repartition()方法

    在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分区.或者需要把Rdd的分区数量 ...

  2. Spark RDD API详解(一) Map和Reduce

    RDD是什么? RDD是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD.从编程的角度来看,RDD可以简单看成是一个数组.和普通数组的区别是,RDD中的数据是分区存储的,这样不同 ...

  3. Spark RDD aggregateByKey

    aggregateByKey 这个RDD有点繁琐,整理一下使用示例,供参考 直接上代码 import org.apache.spark.rdd.RDD import org.apache.spark. ...

  4. Spark RDD解密

    1.  基于数据集的处理: 从物理存储上加载数据,然后操作数据,然后写入数据到物理设备; 基于数据集的操作不适应的场景: 不适合于大量的迭代: 不适合交互式查询:每次查询都需要对磁盘进行交互. 基于数 ...

  5. Spark - RDD(弹性分布式数据集)

    org.apache.spark.rddRDDabstract class RDD[T] extends Serializable with Logging A Resilient Distribut ...

  6. Spark RDD Operations(1)

    以上是对应的RDD的各中操作,相对于MaoReduce只有map.reduce两种操作,Spark针对RDD的操作则比较多 ************************************** ...

  7. Spark RDD的依赖解读

    在Spark中, RDD是有依赖关系的,这种依赖关系有两种类型 窄依赖(Narrow Dependency) 宽依赖(Wide Dependency) 以下图说明RDD的窄依赖和宽依赖 窄依赖 窄依赖 ...

  8. Spark RDD操作(1)

    https://www.zybuluo.com/jewes/note/35032 RDD是什么? RDD是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD.从编程的角度来看,RD ...

  9. Spark RDD概念学习系列之RDD的转换(十)

    RDD的转换 Spark会根据用户提交的计算逻辑中的RDD的转换和动作来生成RDD之间的依赖关系,同时这个计算链也就生成了逻辑上的DAG.接下来以“Word Count”为例,详细描述这个DAG生成的 ...

  10. Spark RDD概念学习系列之RDD的checkpoint(九)

     RDD的检查点 首先,要清楚.为什么spark要引入检查点机制?引入RDD的检查点?  答:如果缓存丢失了,则需要重新计算.如果计算特别复杂或者计算耗时特别多,那么缓存丢失对于整个Job的影响是不容 ...

随机推荐

  1. React Native 控制一个component的显示隐藏

      // 首先在constructor里:   this.state = { visible: false }   // 然后在点击事件设置:   this.setState({ visible: t ...

  2. Git Push提示没有权限

    中途协助别人开发的一个小项目, 我已经是该项目的Developer, 可是提交代码依然提示无权限 这是由于我是在master上直接提交的, 而GitLab默认是保护master分支的, push只对M ...

  3. chrome浏览器hover时文字抖动bug

    今天发现一个奇怪的bug,chrome浏览器里面  当父标签定位为fixed时,hover里面子标签时,文本会发生抖动,百思不得其解,经过多方查证,发现解决办法 -webkit-transform:  ...

  4. Aliyun Linux2安装Docker

    安装教程 使用手册

  5. ES数据库搜索

    1.倒排索引 1.倒排索引和正向索引 在全文搜索里,文档数据离不开搜索,而搜索离不开索引(没有索引搜索会很低效),倒排索引(Inverted index)是全文搜索系统里最高效的索引方法和数据结构,E ...

  6. Csrf+Xss组合拳

    本文首发于“合天智汇”公众号,作者: 影子 各位大师傅,第一次在合天发文章,请多多关照 今年年初的疫情确实有点突然,打乱了上半年的所有计划(本来是校内大佬带我拿奖的时刻,没了 ,学长毕业了,就剩下我这 ...

  7. iOS APP下载安装时,如果出现此时无法下载安装APP的字样时,一些解决思路

    1.在iosAPP下载安装时,如果出现此时无法下载安装APP的字样时,可能是苹果系统进行了支持更新,并需要我们确认条约.至于如何判断是否是苹果系统进行了更改,只需要我们进入开发者账号,进入我的账户(A ...

  8. 「从零单排canal 06」 instance模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  9. try{}catch的隐藏(如何优雅的实现异常块)

    在项目中,我们会遇到异常处理,对于运行时异常,需要我们自己判断处理.对于受检异常,需要我们主动处理. 但是繁琐的try{}caht嵌套在代码里,看着很不舒服,这里我们不讨论性能,就代码来讲,来看看如何 ...

  10. PHP fputcsv() 函数

    定义和用法 fputcsv() 函数将行格式化为 CSV 并写入一个打开的文件中. 该函数返回写入字符串的长度.如果失败,则返回 FALSE. 语法 fputcsv(file,fields,seper ...