什么是RDD

RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、弹性、里面的元素可并行计算的集合
RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度
RDD支持两种操作:转化操作和行动操作
Spark采用惰性计算模式,RDD只有第一次在一个行动操作中用到时,才会真正计算

属性:
一组分区(Partition)
一个计算每个分区的函数
RDD之间的依赖关系
一个Partitioner
一个列表 移动数据不如移动计算
  • 每个节点可以起一个或多个Executor。
  • 每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task。
  • 每个Task执行的结果就是生成了下一个RDD的一个partiton。

特点:

分区:RDD逻辑上是分区的,每个分区的数据是抽象存在的

只读:RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD

依赖:RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生所必需的信息,RDDs之间维护着这种血缘关系,也称之为依赖

缓存:如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,这样就加速后期的重用

checkPoint:RDD支持checkpoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系

RDD TransFormation

创建  makeRDD
删 filter distinct
改 map flatMap mapPartitions(每个分区执行一次 , 传入Iterator, 传出Iterator)
分区 coalesce repartition (切记是否需要suffer) partitionBy(自定义分区 , 根据业务减少数据倾斜)
排序 sortBy (sortByKey 完全可以简单的由sortBy实现, 第二个参数设置倒序 , 第三个参数设置分区数量 , suffer过程会重分区) 宽依赖
集合 union(并集 ,不去重) intersection(交集,去重) subtract (交集减并集) cartesian(笛卡尔积 , 形成map , 自以为无意义)
键值对 join((K,V)和(K,W)形成(K,(v,w))) reduceByKey(根据key聚合计算value) groupBykey(感觉reduceByKey更好用) mapValues(对value进行转换) keys values (取出key 和 value)

Action

reduce(func)
collect()
count()
take(n) first(使用take()更好)
takeOrdered(n)
saveAsTextFile(path)
saveAsSequenceFile(path) 
saveAsObjectFile(path) 
countByKey()
foreach(func)

RDD持久化

RDD.persist 设置缓存
RDD.unpersist 清空缓存
建议使用这俩 , cache也行 RDD检查点机制
sc.setCheckpointDir("hdfs://CentOS1:9000/checkpoint")
rdd.checkpoint()
rdd.collect
检查点机制可以不依赖 依赖链, 缓存需要依赖

宽窄依赖

窄依赖,由于partition依赖关系的确定性,partition的转换处理就可以在同一个线程里完成,窄依赖就被spark划分到同一个stage中,而对于宽依赖,只能等父RDD shuffle处理完成后,下一个stage才能开始接下来的计算

spark划分stage:
  从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入该stage中。 ShuffleMapTask和ResultTask
DAG的最后一个阶段会为每个结果的partition生成一个ResultTask,即每个Stage里面的Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的,余所有阶段都会生成ShuffleMapTask;之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中

广播变量和累加器

val broadcast = sc.broadcast( to )
sc.makeRDD(broadcast.value)
不使用广播变量会每一个task分配一个 , 占用空间 , 使用广播变量会每一个executor 存储一个 , 节省空间 , 变量只读 , 不可写 累加器 在项目中 , 经常遇到项目调试 , 监控 , 记录一些特征值的情况 , 需要使用累加器来解决
如果直接定义变量的话 , 每个task都会持有一份该变量 , 占空间 , val a=sc.accumulator()
sc.makeRDD(broadcast.value).map(x=>{a.add();x}).collect
a.value
 
 

Spark学习(2) RDD编程的更多相关文章

  1. Spark学习之RDD编程(2)

    Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...

  2. Spark学习之RDD编程总结

    Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...

  3. Spark学习笔记——RDD编程

    1.RDD——弹性分布式数据集(Resilient Distributed Dataset) RDD是一个分布式的元素集合,在Spark中,对数据的操作就是创建RDD.转换已有的RDD和调用RDD操作 ...

  4. 02、体验Spark shell下RDD编程

    02.体验Spark shell下RDD编程 1.Spark RDD介绍 RDD是Resilient Distributed Dataset,中文翻译是弹性分布式数据集.该类是Spark是核心类成员之 ...

  5. Spark学习之RDD

    RDD概述 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合 ...

  6. spark实验(四)--RDD编程(1)

    一.实验目的 (1)熟悉 Spark 的 RDD 基本操作及键值对操作: (2)熟悉使用 RDD 编程解决实际具体问题的方法. 二.实验平台 操作系统:centos6.4 Spark 版本:1.5.0 ...

  7. Spark学习摘记 —— RDD行动操作API归纳

    本文参考 参考<Spark快速大数据分析>动物书中的第三章"RDD编程",前一篇文章已经概述了转化操作相关的API,本文再介绍行动操作API 和转化操作API不同的是, ...

  8. spark 中的RDD编程 -以下基于Java api

    1.RDD介绍:     RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...

  9. spark学习(10)-RDD的介绍和常用算子

    RDD(弹性分布式数据集,里面并不存储真正要计算的数据,你对RDD的操作,他会在Driver端转换成Task,下发到Executor计算分散在多台集群上的数据) RDD是一个代理,你对代理进行操作,他 ...

随机推荐

  1. 用数据让我们的OKR变得“冷酷”却更有价值

    在外企工作过的朋友大多能感受到数据在工作中的重要性,你要设置一个目标要有明确的数据来衡量,你要汇报工作进展要有清楚的数据来显示进度,你要展示工作成果更是需要有代表性的数据来呈现结果,数据是真真实实的结 ...

  2. bzoj4605: 崂山白花蛇草水 权值线段树套KDtree

    bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...

  3. 第04组Alpha事后诸葛亮

    一.组长博客:地址 二.Postmortem模板 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们要解决的问题是让大学生可以通过福鱼网站将暂时无 ...

  4. 服务器使用bbr加速配置

    服务器内核升级: 以centos7为例,配置之前可使用以下命令查看内核版本,若是4.0以上则无需对内核升级: uname -r 对内核升级的方法: 直接使用以下命令进行内核版本的下载: rpm --i ...

  5. uniapp登录流程详解uni.login

    uni.login(OBJECT)登录 H5平台登陆注意事项: 微信内嵌浏览器运行H5版时,可通过js sdk实现微信登陆,需要引入一个单独的js,详见普通浏览器上实现微信登陆,并非开放API,需要向 ...

  6. 一起学Makefile(一)

    make和makefile makefile文件帮助我们记录了整个项目工程的所有需要编译的文件列表,这样我们在编译时仅需要输入简单的make命令就能编译出我们期望的结果. makefile文件反映了整 ...

  7. Sherlock and His Girlfriend(信息学奥赛一本通 1623)

    [题目描述] 原题来自:Codeforces Round #400 B. Sherlock 有了一个新女友(这太不像他了!).情人节到了,他想送给女友一些珠宝当做礼物. 他买了 n 件珠宝.第 i 件 ...

  8. Spring Boot 之配置导入,强大到不行!

    我们知道在 Spring Boot 中可以用一个 @Configuration 配置文件来配置所有 Bean 及其他配置(不会的看这篇文章:Spring零配置之@Configuration注解详解), ...

  9. 干货收藏 | Java 程序员必备的一些流程图

    阅读本文大概需要 6 分钟. 转载自:https://juejin.im/post/5d214639e51d4550bf1ae8df 1.Spring 的生命周期 Spring 作为当前 Java 最 ...

  10. GlusterFS常用设置命令

    可信存储池(Trusted Storage Pool)创建存储池例如要创建一个包含3个服务器的存储池,则需要从第一个服务器server1中把另外两个服务器加入存储池中:# gluster peer p ...