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

6ac625d804e239f8a87045e62284d628.png

本文始发于个人公众号: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,我们可以直接访问到。

037df461af5d1d25b8a861e047dba401.png

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

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

返回的texts就是一个RDD:

51181f2e57e4a1d925c775e8323d7b75.png

除了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的依赖信息,我们把这个依赖信息画出来,就成了一张依赖图:

768bb541ca1daa4c91eec50250d8e4d3.png

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

10c43e258f4d91ba6eb79a44c32d554c.png

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

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

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

234b141e4cd93e3c038e7b3aa7c99080.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隐私计算 2.3 基于中国剩余定理的秘密共享方案

1 简介 作者:Asmuth和Bloom;时间:1983年;理念:基于中国剩余定理(CRT)。 2 具体实现 I 秘密分割算法 (1)选择nnn个整数d1,d2,…,dnd_1, d_2, \dots, d_nd1​,d2​,…,d…

服务器基线加固脚本_Linux 基线检查,安全加固脚本

#!/bin/bash# Author:韩伟# Date: 2019-12-29# 实现对用户密码策略的设定,如密码最长有效期等datedate %Y-%m-%dread -p "是否设置密码策略[y/n]:" Yif [ "$Y" "y" ];thenread -p "设置密码最多可多少天不修改:&quo…

前端websocket获取数据后需要存本地吗_是什么让我放弃了Restful API?了解清楚后我全面拥抱GraphQL!...

背景REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广大Web开发者的喜爱。REST 的 API 配合JSON格式的数据交换&#xff…

隐私计算 2.4 Brickell秘密共享方案

1 简介 作者:Brickell;时间:1989年;理念:Shamir秘密共享方案的推广,由一维方程转向多维向量。 2 具体实现 I 秘密分割算法 (1)首先确定可以掌握钥匙的人数nnn,以及模数…

fabric shim安装合约_智能合约简介_智能合约开发_Hyperledger Fabric_开发指南_区块链服务 BaaS - 阿里云...

概述在 Hyperledger Fabric 中,链码(Chaincode)又称为智能合约(下文中我们统一称为链码),是用Go,node.js或Java编写的程序,主要用于操作账本上的数据。用户的应用程序通过链码与 Fabric 账本数据进行交互,交互关系如下…

子集和问题 算法_LeetCode刷题实战90:子集 II

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !今天和大家…

隐私计算 2.5 Blakley秘密共享方案

1 简介 作者:Blakley;时间:1979年;理念:基于高斯消元法。 2 具体实现 I 秘密分割算法 II 秘密重构算法 3 实例 设秘密S(3,10,5)S (3, 10, 5)S(3,10,5),n5n 5n5, t3t 3t3。 I 秘密分割 &#xff0…

webconfig的解决方案怎么添加_解决在Web.config或App.config中添加自定义配置的方法详解...

解决在Web.config或App.config中添加自定义配置的方法详解本篇文章是对在Web.config或App.config中添加自定义配置的方法进行了详细的分析介绍,需要的朋友参考下.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持…

conda如何升级pytorch_Google Cloud TPUs 支持 Pytorch 框架啦!

在2019年PyTorch开发者大会上,Facebook,Google和Salesforce Research联合宣布启动PyTorch-TPU项目。项目的目标是在保持PyTorch的灵活性的同时让社区尽可能容易地利用云TPU提供的高性能计算。团队创建了PyTorch/XLA这个repo,它可以让使PyTorc…

隐私计算 2.6 秘密共享的同态特性

1 秘密共享的同态性 秘密共享的同态性:秘密份额的组合等价于组合的秘密共享份额。 假设A、B两方分别有秘密SAS^ASA和SBS^BSB;他们的值被随机拆分为S1A,…,SnAS_1^A, \dots, S_n^AS1A​,…,SnA​和S1B,…,SnBS_1^B, \dots, S_n^BS1B​,…,SnB​&#xff…

chromiumwebbrowser 使用_用Tchromium替换webbrowser

用惯了EmbeddedWB,不想换,但是IE内核一直存在内存泄漏问题,没办法,只有寻找替代品了。要把用习惯的EmbeddedWB换成完全不一样的TChromium,有点挑战,特别是在资料不多,英语没过三级的情况下。未来趋势是这样…

python是在linux系统下运行的吗_Linux系统下python代码运行shell命令的方法

方法一:os.popen #!/usr/bin/python#-*- coding: UTF-8 -*- importos, sys#使用 mkdir 命令 a lsb os.popen(a,w,1)print b 方法二:os.system #!/usr/bin/python#-*- coding: UTF-8 -*- importos, sys arg0"121.429015"arg1"31.245255&q…

隐私计算 2.7 Shamir门限秘密共享的加法同态性

1 Shamir门限秘密共享的加法同态性 Shamir门限秘密共享方案具有(,)(, )(,)同态的性质,即: SASBFI(S1A,…,StA)FI(S1B,…,StB)FI(S1AS1B,…,StAStB)\begin{array}{l} S^A S^B && F_I(S_1^A, \dots, S_t^A) F_I(S_1^B, \dots, S_t^B)\\ &&a…

pageable设置size_分页工具一Pageable与Page

import org.springframework.data.domain.Pageable;import org.springframework.data.domain.Page;1.Pageable概述Page findByAge(int age, Pageable pageable);Pageable 是Spring Data库中定义的一个接口,用于构造翻页查询,是所有分页相关信息的一个抽象…

二阶龙格库塔公式推导_带你走进最美数学公式

同学们,我们先来跟老师欣赏一下数学中最优美的式子吧?是什么魔力让以上几个似乎毫不相干的数学中最特殊的数字能如此优美的写在同一个式子呢?是欧拉,是数学。0和1——老师就不用介绍啦,e是自然常数(natural constant)&…

python如何做辅助线_角平分线如何做辅助线,学霸总结了4种模型,轻松应付中考...

角平分线2大辅助线思路4种基本模型对称形思路包括3种基本模型,思想都是为了构造全等三角形,然后转换图像中的角度和线段关系。平行线思路则是为了构造一个等腰三角形,通常是为了转移线段关系。双角平分线夹角公式记住这个结论,在选…

隐私计算 2.8 Shamir门限秘密共享的乘法同态性

1 Shamir门限秘密共享的乘法同态性 Shamir门限秘密共享方案具有(,)(\times, \times)(,)同态的性质,即: SASBFI(S1A,…,StA)FI(S1B,…,StB)FI(S1A⊗S1B,…,StA⊗StB)\begin{array}{l} S^A \times S^B && F_I(S_1^A, \dots, S_t^A) \times F_I(S_…

备份数据库的expdp语句_【ORACLE语句备份】数据库表同步 ——定时任务管理器(EXPDP导出,IMPDP导入)...

1、C:\Users\Administrator>sqlplus sys/xxxxxx as sysdba;2、SQL> create directory dbbak4 as e:\app\temp4;3、SQL> grant read,write on directory dbbak4 to xxx;--xxx:源数据库用户名4、SQL> exit;5、备注:还需手动创建目录,否则报错C…

python的setting怎么找_django项目的配置文件settings.py详解

1.2.1 ABSOLUTE_URL_OVERRIDES:默认值:{} 一个字典映射“app_label_module_name”字符串到一个函数,该函数接收一个Model对象作为参数并返回它的url,这是一个安装上覆盖get_absolute_url()方法的方式 1.2.2 ADMIN_FOR:默认值&…

隐私计算 2.9 秘密共享应用于横向联邦学习

1 简介 1.1 横向联邦学习 横向联邦学习也称为按样本划分的联邦学习,主要应用于各个参与方的数据集有相同的特征空间和不同的样本空间的场景,例如两个地区的城市商业银行可能在各自的地区拥有非常不同的客户群体,所以他们的客户交集非常小&a…