本文始发于个人公众号:TechFlow,原创不易,求个关注

今天是spark专题第二篇文章,我们来看spark非常重要的一个概念——RDD。

在上一讲当中我们在本地安装好了spark,虽然我们只有local一个集群,但是仍然不妨碍我们进行实验。spark最大的特点就是无论集群的资源如何,进行计算的代码都是一样的,spark会自动为我们做分布式调度工作

RDD概念

介绍spark离不开RDD,RDD是其中很重要的一个部分。但是很多初学者往往都不清楚RDD究竟是什么,我自己也是一样,我在系统学习spark之前代码写了一堆,但是对于RDD等概念仍然云里雾里。

RDD的英文全名是Resilient Distributed Dataset,我把英文写出来就清楚了很多。即使第一个单词不认识,至少也可以知道它是一个分布式的数据集。第一个单词是弹性的意思,所以直译就是弹性分布式数据集。虽然我们还是不够清楚,但是已经比只知道RDD这个概念清楚多了,

RDD是一个不可变的分布式对象集合,每个RDD都被分为多个分区,这些分区运行在集群的不同节点上。

很多资料里只有这么一句粗浅的解释,看起来说了很多,但是我们都get不到。细想有很多疑问,最后我在大神的博客里找到了详细的解释,这位大神翻了spark的源码,找到了其中RDD的定义,一个RDD当中包含以下内容:

  • 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)

我们一条一条来看:

  1. 它是一组分区,分区是spark中数据集的最小单位。也就是说spark当中数据是以分区为单位存储的,不同的分区被存储在不同的节点上。这也是分布式计算的基础。
  2. 一个应用在各个分区上的计算任务。在spark当中数据和执行的操作是分开的,并且spark基于懒计算的机制,也就是在真正触发计算的行动操作出现之前,spark会存储起来对哪些数据执行哪些计算。数据和计算之间的映射关系就存储在RDD中。
  3. RDD之间的依赖关系,RDD之间存在转化关系,一个RDD可以通过转化操作转化成其他RDD,这些转化操作都会被记录下来。当部分数据丢失的时候,spark可以通过记录的依赖关系重新计算丢失部分的数据,而不是重新计算所有数据。
  4. 一个分区的方法,也就是计算分区的函数。spark当中支持基于hash的hash分区方法和基于范围的range分区方法。
  5. 一个列表,存储的是存储每个分区的优先存储的位置。

通过以上五点,我们可以看出spark一个重要的理念。即移动数据不如移动计算,也就是说在spark运行调度的时候,会倾向于将计算分发到节点,而不是将节点的数据搜集起来计算。RDD正是基于这一理念而生的,它做的也正是这样的事情。

创建RDD

spark中提供了两种方式来创建RDD,一种是读取外部的数据集,另一种是将一个已经存储在内存当中的集合进行并行化

我们一个一个来看,最简单的方式当然是并行化,因为这不需要外部的数据集,可以很轻易地做到。

在此之前,我们先来看一下SparkContext的概念,SparkContext是整个spark的入口,相当于程序的main函数。在我们启动spark的时候,spark已经为我们创建好了一个SparkContext的实例,命名为sc,我们可以直接访问到。

我们要创建RDD也需要基于sc进行,比如下面我要创建一个有字符串构成的RDD:

texts = sc.parallelize(['now test', 'spark rdd'])

返回的texts就是一个RDD:

除了parallelize之外呢,我们还可以从外部数据生成RDD,比如我想从一个文件读入,可以使用sc当中的textFile方法获取:

text = sc.textFile('/path/path/data.txt')

一般来说,除了本地调试我们很少会用parallelize进行创建RDD,因为这需要我们先把数据读取在内存。由于内存的限制,使得我们很难将spark的能力发挥出来。

转化操作和行动操作

刚才我们在介绍RDD的时候其实提到过,RDD支持两种操作,一种叫做转化操作(transformation)一种叫做行动操作(action)。

顾名思义,执行转化操作的时候,spark会将一个RDD转化成另一个RDD。RDD中会将我们这次转化的内容记录下来,但是不会进行运算。所以我们得到的仍然是一个RDD而不是执行的结果。

比如我们创建了texts的RDD之后,我们想要对其中的内容进行过滤,只保留长度超过8的,我们可以用filter进行转化:

textAfterFilter = texts.filter(lambda x: len(x) > 8)

我们调用之后得到的也是一个RDD,就像我们刚才说的一样,由于filter是一个转化操作,所以spark只会记录下它的内容,并不会真正执行。

转化操作可以操作任意数量的RDD,比如如果我执行如下操作,会一共得到4个RDD:

inputRDD = sc.textFile('path/path/log.txt')
lengthRDD = inputRDD.filter(lambda x: len(x) > 10)
errorRDD = inputRDD.filter(lambda x: 'error' in x)
unionRDD = errorRDD.union(lengthRDD)

最后的union会将两个RDD的结果组合在一起,如果我们执行完上述代码之后,spark会记录下这些RDD的依赖信息,我们把这个依赖信息画出来,就成了一张依赖图:

无论我们执行多少次转化操作,spark都不会真正执行其中的操作,只有当我们执行行动操作时,记录下来的转化操作才会真正投入运算。像是first(),take(),count()等都是行动操作,这时候spark就会给我们返回计算结果了。

其中first的用处是返回第一个结果,take需要传入一个参数,指定返回的结果条数,count则是计算结果的数量。和我们逾期的一样,当我们执行了这些操作之后,spark为我们返回了结果。

本文着重讲的是RDD的概念,我们下篇文章还会着重对转化操作和行动操作进行深入解读。感兴趣的同学不妨期待一下吧~

今天的文章就是这些,如果觉得有所收获,请顺手点个关注或者转发吧,你们的举手之劳对我来说很重要。

什么是spark的惰性计算?有什么优势?_spark——spark中常说RDD,究竟RDD是什么?相关推荐

  1. Spark Streaming 实时计算在甜橙金融监控系统中的应用、性能优化、任务监控

    1 写在前面 目前公司对实时性计算的需要及应用越来越多,本文选取了其中之一的 Spark Streaming 来介绍如何实现高吞吐量并具备容错机制的实时流应用.在甜橙金融监控系统项目中,需要对每天亿万 ...

  2. Spark Streaming实时计算框架介绍

    随着大数据的发展,人们对大数据的处理要求也越来越高,原有的批处理框架MapReduce适合离线计算,却无法满足实时性要求较高的业务,如实时推荐.用户行为分析等. Spark Streaming是建立在 ...

  3. 基于案例贯通 Spark Streaming 流计算框架的运行源码

    本期内容 : Spark Streaming+Spark SQL案例展示 基于案例贯穿Spark Streaming的运行源码 一. 案例代码阐述 : 在线动态计算电商中不同类别中最热门的商品排名,例 ...

  4. spark 流式计算_流式传输大数据:Storm,Spark和Samza

    spark 流式计算 有许多分布式计算系统可以实时或近实时处理大数据. 本文将从对三个Apache框架的简短描述开始,并试图对它们之间的某些相似之处和不同之处提供一个快速的高级概述. 阿帕奇风暴 在风 ...

  5. spark的流失计算模型_使用spark对sparkify的流失预测

    spark的流失计算模型 Churn prediction, namely predicting clients who might want to turn down the service, is ...

  6. Spark精华问答 | 为什么选择Spark作为流计算引擎?

    总的来说,Spark采用更先进的架构,使得灵活性.易用性.性能等方面都比Hadoop更有优势,有取代Hadoop的趋势,但其稳定性有待进一步提高.我总结,具体表现在如下几个方面. 1 Q:为什么选择K ...

  7. Flink对比Spark以及流计算发展趋势分析

    前言 丑话说在前面,笔者无意于撩拨 Flink 和 Spark 两个群体的矛盾,社区间取长补短也好,互相抄袭也好,都不是个事,关键在于用户群体的收益. 在各种会上,经常会被问到 Spark 和 Fli ...

  8. Spark数据统计指标计算

    前言 在机器学习训练模型时,如果遇到空值,一般有三种处理方法,分别是删除法.替换法和插补法.删除法是指当缺失的观测比例非常低时(如5%以内),直接删除存在缺失的观测,或者当某些变量的缺失比例非常高时( ...

  9. 云计算实验2 Spark分布式内存计算框架配置及编程案例

    一. 实验目的 掌握分布式多节点计算平台Spark配置,Spark编程环境IDEA配置,示例程序启动与运行 二. 实验环境 Linux的虚拟机环境.线上操作视频和实验指导手册 三. 实验任务 完成Sp ...

最新文章

  1. log4net使用详解
  2. JavaWeb课程复习资料——中文乱码上下文处理
  3. [选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)
  4. public,protected,private
  5. STM8学习笔记---IAR工程重命名
  6. EditPlus软件的安装与配置
  7. 一款用C++语言实现的3D游戏引擎(附源码),适用于想学3D游戏开发
  8. Word文字处理技巧
  9. 临时码农敲门砖 有效 2022-10-16 (详情 见文末)
  10. 抓包基础概述,以及为什么抓包
  11. 一个萌新的学习如何写BUG记录(学无止境,更无止境)
  12. PG数据库内核分析学习笔记_XLOG日志恢复策略
  13. 教你用 Python 修改微信(支付宝)运动步数,轻松升到 TOP1
  14. 关于接口幂等性问题的简单总结
  15. Hadoop详细入门知识
  16. 思迈特软件Smartbi:传统BI被“革命”,AI是BI技术未来的发展趋势
  17. 图像特征提取(纹理特征)
  18. Topology拓扑_5:拓扑编辑器
  19. 内网穿透的技术解决方案
  20. linux为什么要杀掉进程,[linux服务器][进程管理]用fuser杀掉进程

热门文章

  1. Chrome Cookie SameSite 属性设置
  2. simulink仿真学习(实现半波整流、方波输出) day1
  3. CSAPP--整数的表示
  4. 目标检测矩形框与polygon数据增加--裁剪,拓展,旋转
  5. Qt实用快捷键(较全面)
  6. java点击菜单项文字显示在窗体上_java点击菜单项弹出窗口怎么做啊?
  7. html 添加窗口小部件,如何:为自定义窗口小部件定义主题(样式)项
  8. 改进初学者的PID-初始化
  9. 关于高考报志愿的一些规划建议
  10. 和gdi绘图效率比较_绘图计算器测评来袭!哪一款才是你AP考试的最佳拍档?