Spark之RDD详解

RDD

概念与特性

RDD是Spark最重要的抽象。spark统一建立在抽象的RDD之上。设计一个通用的编程抽象,使得spark可以应对各种场合的大数据情景。RDD模型将不同的组件融合到一起,选用其中的几个/所有,可以应付各种不同的场景。解决了mr的缺陷:

  • 弹性分布式数据集Resilient Distributed Dataset
  • 只读分区数据集,final修饰的
  • 一个分布式的数据集合,是spark中的核心,spark的操作都是围绕RDD展开的
  • 真正的运算是在各个计算节点
  • 当某个RDD操作丢失的时候,可以很快恢复

分区

  • 不同分区可能被划分到不同机器上。但是每个分区对应一个数据block
  • 分区是个逻辑概念,新旧分区可能是同一块内存。(重要的优化,节约资源。)。在函数式编程,经常使用常量,但是很费内存,rdd的这种优化非常实用。防止内存的无限性扩充
  • 只是记录需要做的操作。只有当真正要执行的时候,才具体的执行
  • 从路径读取的数据,可能有许多块,实际上RDD也是在各个区内执行的(解释了分布式),但是数据已经io到内存当中了。后续的每一步操作都生成一个RDD。每一步都是在分区上

计算

  • 并行计算。计算/处理都是在各分区上,并行计算。并行,提高了效率
  • 真正的数据处理都是在各个分散的节点上

依赖

  • 子RDD从父RDD产生,父子RDD之间的关系
  • 宽依赖:依赖上级所有的RDD分区。宽依赖一般非常消耗资源,结果一般要缓存下来
  • 窄依赖:依赖上级RDD的部分分区。计算的时候可能都在同一个节点上,节省资源
  • stage以依赖的区别,分成不同的stage
  • 每个父RDD的分区,只能被最多一个字RDD使用,子RDD可以使用任意个父RDD

RDD的创建

从外部数据集中读取。来源于文件系统,这里的路径要让每个RDD的节点都能访问到:

lines = sc.textFile("文件路径") // 可以指定分片的个数 lines = sc.textFle("路径",3) // 返回一个文件名:文件内容的二元组 lines = sv.whileFile("路径")

从驱动程序中对一个集合进行并行化,在测试的时候用的多:

val lines = sc.parallelize(list["name","age"])

RDD的转化

  • 不进行具体操作,类似scala中的惰性求值
  • 从一个RDD生成另一个RDD的过程。spark用lineage的方式表示各个RDD的依赖关系,链表的表头是textFile
  • 参考fp中的概念,这里只做逻辑运算,接受一个RDD,结果产生一个RDD,没有任何副作用
  • RDD常见的转化操作:

map RDD.map(fun) 将函数应用于每个元素,结果返回一个RDD包含每个元素的函数处理结果 flatmap RDD.flatmap(fun) 同map,结果返回一个包含所有处理结果的整体。生成的分片数不变,只是在逻辑上成一个整体 filter RDD.filter(fun) 过滤掉不符合要求的数据 distinct RDD.distinct() 去重,需要shuffle代价大 union RDD.union(RDD1) 两个RDD求并集 intersection RDD. intersection(RDD1) 两个RDD求交集 substract RDD.substract(RDD1) 从RDD中移除RDD1的内容 cartesian RDD.cartesian(RDD1) 生成RDD与RDD1的笛卡尔积 pipe RDD.pipe("shell命令") 利用linux中的shell语言,对数据操作。 zip RDD.zip(RDD1) 将RDD和RDD1组成一个kv格式的新RDD

RDD的行动

  • 真正的开始处理和操作,强制执行所有的RDD
  • RDD常见的行动操作:

collect() RDD.collect() 返回RDD中的所有元素。只能计算小规模的RDD,否则要shuffle代价大 count() RDD.count() 统计RDD中元素的个数 countByVale() RDD.countByValue() 每个元素在RDD中出现的次数。 take() RDD.take(n) 返回RDD中的n个元素 top() RDD.top(N) 返回RDD中的前N个元素 takeOrdered() RDD.takeOrdered(n) 按照要求的顺序返回前n个元素 takeSample() RDD.takeSample(n) 从RDD中任意返回n个元素 reduce() RDD.reduce(fun) 并行整合RDD中所有的元素 fold() RDD.fold(num)(fun) 提供初始值,的reduce aggregate() RDD.aggregate() ????????? foreach() RDD.foreach(fun) 对RDD中的 每个元素使用给定的函数

RDD的持久化

  • 提高了数据的可重用性
  • 把RDD中的结果持久化到内存中。当后续的操作需要用到某些RDD运算结果的时候,持久化到内存可以提高效率。主要有cahce方法和persist方法。
  • 当要缓存的内容太多,用LRU算法淘汰。
  • 保存

RDD.saveAsTextFile("路径")

  • 持久化级别:

RDD的工作流程

  • RDD把操作记录程DAG图,记录各个DAG中的转换关系
  • 无论进行了多少次转换,只有真正遇到action的时候才真正计算

原文:http://blog.csdn.net/u011283591/article/details/66972088

原文发布于微信公众号 - CSDN技术头条(CSDN_Tech)

原文发表时间:2017-03-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏牛肉圆粉不加葱

Spark Shuffle 模块② - Hash Based Shuffle write

Spark 最开始只有 Hash Based Shuffle,因为在很多场景中并不需要排序,在这些场景中多余的排序反而会损耗性能。

871
来自专栏简单聊聊Spark

Spark性能调优篇四之使用Kryo进行序列化操作

        接着上一篇文章,今天介绍一下通过使用Kryo这个东东来进一步降低网络IO的传输量和内存的占用率。在介绍Kryo之前,接下来我们先来对比一下默认的...

2883
来自专栏肖力涛的专栏

Spark 踩坑记:从 RDD 看集群调度

本文的思路是从spark最细节的本质,即核心的数据结构RDD出发,到整个Spark集群宏观的调度过程做一个整理归纳,从微观到宏观两方面总结,方便自己在调优过程中...

1.1K2
来自专栏一名叫大蕉的程序员

Spark你一定学得会(二)No.8

第一次分享的妥妥就是入门的干货,小伙伴们最好可以自己敲一敲代码,不然只看我的分享一点用都木有。但还是有很多小伙伴表示看不懂,没关系,慢慢来自己操作一遍有什么问题...

19210
来自专栏个人分享

Spark作业调度

    Spark在任务提交时,主要存在于Driver和Executor的两个节点.

1801
来自专栏个人分享

Hive架构及Hive On Spark

(1)Table:每个表都对应在HDFS中的目录下,数据是经过序列化后存储在该目录中。同时Hive也支持表中的数据存储在其他类型的文件系统中,如NFS或本地文件...

3762
来自专栏斑斓

大数据 | 理解Spark的核心RDD

与许多专有的大数据处理平台不同,Spark建立在统一抽象的RDD之上,使得它可以以基本一致的方式应对不同的大数据处理场景,包括MapReduce,Streami...

3919
来自专栏about云

spark零基础学习线路指导

问题导读 1.你认为spark该如何入门? 2.你认为spark入门编程需要哪些步骤? 3.本文介绍了spark哪些编程知识? ? spark...

3965
来自专栏AILearning

Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN

快速入门 使用 Spark Shell 进行交互式分析 基础 Dataset 上的更多操作 缓存 独立的应用 快速跳转 本教程提供了如何使用...

2958
来自专栏Spark生态圈

[spark] RDD缓存源码解析

我们可以利用不同的存储级别存储每一个被持久化的RDD。可以存储在内存中,也可以序列化后存储在磁盘上等方式。Spark也会自动持久化一些shuffle操作(如re...

2153

扫码关注云+社区

领取腾讯云代金券