热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spark的惰性计算_一、Spark详解RDD弹性分布式数据集

hspark.jpeg1.什么是RDDRDD是Spark的计算模型。RDD(ResilientDistributedDataset)叫做弹性的分布式数据集合,是Spa

hspark.jpeg

648a9482e7dcda641fb2c1930b5fb16d.png

1.什么是RDD

RDD 是 Spark 的计算模型。RDD(Resilient Distributed Dataset)叫做弹性的分布式数据集合,是 Spark 中最基本的数据抽象,它代表一个不可变、只读的,被分区的数据集。操作 RDD 就像操作本地集合一样,有很多的方法可以调用,使用方便,而无需关心底层的调度细节。

一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可以分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算。RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集来创建RDD,或者通过在其他RDD上执行确定的转换操作(如map、join和groupBy)而创建得到新的RDD。RDD提供了一组丰富的操作以支持常见的数据运算,分为“行动”(Action)和“转换”(Transformation)两种类型,前者用于执行计算并指定输出的形式,后者指定RDD之间的相互依赖关系。两类操作的主要区别是,转换操作(比如map、filter、groupBy、join等)接受RDD并返回RDD,而行动操作(比如count、collect等)接受RDD但是返回非RDD(即输出一个值或结果)。RDD提供的转换接口都非常简单,都是类似map、filter、groupBy、join等粗粒度的数据转换操作,而不是针对某个数据项的细粒度修改。因此,RDD比较适合对于数据集中元素执行相同操作的批处理式应用,而不适合用于需要异步、细粒度状态的应用。

RDD的执行过程大致如下:

  • 通过SparkContext(通往集群的唯一通道)读取外部数据源或内存中的集合创建RDD
  • RDD经过一系列的Transformation(转换类)算子进行操作生成新的RDD
  • 最一个RDD经过Action类算子触发执行,把结果收集到Driver端或者写入外部存储

RDD采用了惰性(lazy)执行机制,即在RDD的转换操作只是记录了执行逻辑,并不会发生真正的计算,真正的计算发生在对RDD调用了Action类算子。

spark-rdd-transformation-action-flow.png

d1bd5263d1feb2cfdd07371ef14902bf.png

2.RDD的五大特性

Internally, each RDD is characterized by five main properties: (RDD具有五大特性:)

  • A list of partitions (RDD由一系列partitions组成)
  • A function for computing each split (算子是作用于partition上的)
  • 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) (分区器是作用于K,V格式的RDD上)
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file) (partition对外提供最佳的计算位置,得数据处理的本地化)1.什么是K,V格式的RDD? RDD中的每个元素是一个个的二元组,那么这个RDD就是K,V格式的RDD。 2. textFile()底层工作原理 Spark没有直接读取HDFS文件的方法,textFile()底层调用的是Mapreduce读取HDFS文件的方法。首先会split, 每个split的默认大小是128M, 就是一个block大小,每个split对应一个partition。 3.哪里体现了RDD的弹性? 1) RDD的partition的个数可多可少 2) 容错机制,即RDD之间有依赖关系 4.哪里体现了RDD的分布式? RDD中的partition是分布在多个节点上的。

3. Spark中的Lineage机制(血统)

RDD在Lineage依赖方面分为两种:窄依赖(Narrow Dependencies)与宽依赖(Wide Dependencies,源码中称为Shuffle Dependencies),用来解决数据容错的高效性。

edd65e755d34af99eac4c6610028c925.png

3.1.窄依赖与宽依赖

  • 窄依赖:是指父RDD的每一个分区最多被一个子RDD的分区所使用,表现为一个父RDD的分区对应于一个子RDD分区,或者多个父RDD的分区对应一个子RDD的分区,也就是说一个父RDD的一个分区不可能对应一个子RDD的多个分区。这里主要分为两种情况:1)一个子RDD分区对应一个父RDD分区,如map,filter等算子; 2)一个子RDD分区对应N个父RDD分区,如copartitioned;
  • 宽依赖: 是指子RDD的分区依赖于父RDD的多个分区或所有分区,即存在一个父RDD的一个分区对应一个子RDD的多个分区。

4.如何创建RDD

4.1.并行化集合创建RDD

import org.apache.spark.SparkConfimport org.apache.spark.SparkContextobject ParallelizeCollection{ def main(args:Array[String]) { val conf = new SparkConf().setAppName("ParallelizeCollection").setMaster("local") val sc = new SparkContext(conf) val numbers = Array(1,2,3,4,5,6,7,8,9,10) val numberRDD = sc.parallelize(numbers) val numberSum = numberRDD.reduce(_+_) println("The sum of numbers: "+numberSum) sc.stop() }}

4.2.通过makeRDD方法创建RDD

import org.apache.spark.SparkConfimport org.apache.spark.SparkContextobject MakeRDDFromCollection{ def main(args:Array[String]) { val conf = new SparkConf().setAppName("ParallelizeCollection").setMaster("local") val sc = new SparkContext(conf) val numbers = Array(1,2,3,4,5,6,7,8,9,10) val numberRDD = sc.makeRDD(numbers) val numberSum = numberRDD.reduce(_+_) println("The sum of numbers: "+numberSum) sc.stop() }}

【注】:这个方法是scala独有的,在Java中是没有的。

4.3.通过外部源创建RDD

import org.apache.spark.SparkConfimport org.apache.spark.SparkContextobject ExternalSources{ def main(args:Array[String]) { val conf = new SparkConf().setAppName("ExternalSources").setMaster("local") val sc = new SparkContext(conf) val lines = sc.textFile("hdfs://localhost:9000/words.txt") val words = lines.flatMap(line=>line.split(" ")) val pairs = words.map((_,1)) val results = pairs.reduceByKey(_+_) println("The word count is: "+results) sc.stop() }}

4.4.从已有RDD调用Transformation算子创建新RDD

如上面代码中的words, pairs都是通过其父RDD调用Transformation算子得到。



推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • Hadoop 源码学习笔记(4)Hdfs 数据读写流程分析
    Hdfs的数据模型在对读写流程进行分析之前,我们需要先对Hdfs的数据模型有一个简单的认知。数据模型如上图所示,在NameNode中有一个唯一的FSDirectory类负责维护文件 ... [详细]
  • Flink使用java实现读取csv文件简单实例首先我们来看官方文档中给出的几种方法:首先我们来看官方文档中给出的几种方法:第一种:Da ... [详细]
author-avatar
勇敢的刺鸟宝贝4164053383
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有