作者:韩信子 @ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/84
本文地址:http://www.showmeai.tech/article-detail/174
申明:版权所有,转载请分割平台与作者并注明出处
1.RDD 介绍
要把握基于 Spark 的大数据处理操作,大家首先要理解 Spark 中的一个外围数据概念:RDD。
- 《更多材料 → 数据迷信工具速查 | Spark 使用指南(RDD 版)》
1)RDD 介绍
RDD,全称为 Resilient Distributed Datasets(弹性分布式数据汇合),是一个容错的、并行的数据结构,能够让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区。同时,RDD 还提供了一组丰盛的操作来操作这些数据。
RDD(弹性分布式数据汇合)是 Spark 的根本数据结构,Spark 中的所有数据都是通过 RDD 的模式进行组织。
- RDD 是不可变的数据汇合,每个分区数据是只读的。
- RDD 数据集要做逻辑分区(相似 hadoop 中的逻辑切片 split),每个分区能够独自在集群节点进行计算。
- RDD 数据集中的数据类型能够蕴含任何 java 类型、scala 类型、python 类型或者自定义的类型。
- RDD 善于的畛域:迭代式的数据处理,比方机器学习。
2)RDD 的 5 个属性
每个 RDD 有 5 个次要的属性:
- 一组分片(partition),数据集的根本组成单位。
- 一个函数,计算每个分片。
- 对 parent RDD 的依赖,形容 RDD 之间的 lineage。
- 一个 Partitioner,对于 key-value 的 RDD。
- 一个列表,存储存取每个 partition 的 preferred 地位。例如对于一个 HDFS 文件来说,存储每个 partition 所在的块的地位。
3)RDD 与 Spark 工作
在 Spark 分布式数据处理工作中,RDD 提供数据,供工作解决。很多时候 hadoop 和 Spark 联合应用:hadoop 提供 hdfs 的分布式存储,Spark 解决 hdfs 中的数据。
咱们以 sc.textFile("hdfs://path/to/file")
模式生成 RDD 时,Spark 就曾经算好了数据的各个切片 (也叫分区),并把分区信息放在了一个列表(名单) 里,这个名单就属于 RDD 自带的其中一个属性。
- RDD 不蕴含理论要解决的数据,而是在 RDD 中的分区名单中载明切片的信息。
- 数据曾经在 Hadoop 的数据节点上了,只有在 RDD 中表明分区对应的数据所在位置、偏移量、数据长度即可,就相似元数据。
RDD 在被散发到每个执行计算的工作节点后,每个工作节点会依据元数据信息获取本身节点负责计算的分区数据,并把数据放到本节点的内存当中,而后对数据进行计算。
- 每个分区由一个节点来计算,换句话说就是每个工作只计算 RDD 的其中一个分区。
个别咱们会把数据所在的节点和 Spark 的计算节点配成同一个主机,这样就实现了数据本地化。
- 在 worker 节点将要运行 Spark 的计算工作时,只须要从本地加载数据,再对数据使用 Spark 的计算函数,就不须要从别处 (例如近程主机) 通过网络传输把须要计算的数据拿过去,从而防止了低廉的网络传输老本。“宁肯挪动函数,也不要挪动数据”。
2.RDD 创立形式
1)创立 RDD 的 3 种形式
RDD 的 3 种创立形式如下图所示(以 pyspark 代码为例):
2)从内部数据创立 RDD
spark 也反对从多种内部数据源读取数据,包含 HDFS、S3、Hbase、MongoDB 等,如下图所示:
3.RDD 播送与累加器
1)共享变量
在 Spark 程序中,当一个传递给 Spark 操作 (例如 map 和 reduce) 的函数在近程节点下面运行时,Spark 操作实际上操作的是这个函数所用变量的一个独立正本。
这些变量会被复制到每台机器上,并且这些变量在近程机器上的所有更新都不会传递回驱动程序。
通常跨工作的读写变量是低效的,然而,Spark 还是为两种常见的应用模式提供了两种无限的共享变量:
- 播送变量(broadcast variable)
- 累加器(accumulator)
2)播送变量
为什么要将变量定义成播送变量?
在分布式计算中,由 Driver 端散发大对象(如字典、汇合、黑白名单等),个别,如果这个变量不是播送变量,那么每个 task 就会散发一份。在 task 数目非常多的状况下,Driver 的带宽会成为零碎的瓶颈,而且会大量耗费 task 服务器上的资源。
如果将这个变量申明为播送变量,那么常识每个 executor 领有一份,这个 executor 启动的 task 会共享这个变量,节俭了通信的老本和服务器的资源
3)累加器
为什么要将变量定义为累加器?
在 Spark 应用程序中,异样监控、调试、记录合乎某个性的数据数目,这些需要都须要用到计数器。
如果变量不被申明为累加器,那么被扭转时不在 Driver 端进行全局汇总。即在分布式运行时每个 task 运行的只是原始变量的一个正本,并不能扭转原始变量的值。
然而,当这个变量被申明为累加器后,该变量就会有分布式计数的性能。
4.RDD transformation 与 action
要对大数据进行解决,咱们须要应用到一系列 Spark RDD 上能够变换与操作的算子,咱们来重点了解一下 spark 的 RDD transformation 和 action。
1)transformation 与 action
transformation 操作针对已有的 RDD 创立一个新的 RDD。
- 例如,map 就是一种 transformation 操作。它用于将已有 RDD 的每个元素传入一个自定义的函数,并获取一个新的元素,而后将所有新元素组成一个新的 RDD。
action 次要是对 RDD 进行最初的操作(如遍历、reduce、保留到文件等),并能够返回后果给 Driver 程序。
- 例如,reduce 就是一种 action 操作。它用于对 RDD 中的所有元素进行聚合操作,并获取一个最终的后果,而后返回给 Driver 程序。
2)高频 RDD 算子图解
map 与 flatMap
filter 与 distinct
sort 与 sortBy
sample 与 takeSample
union 与 intersection
groupby 与 cartesian
join 与 glom
collect 与 reduce
top 与 count
takeOrdered 与 take
reduceByKey 与 collectAsMap
5. 参考资料
- 数据迷信工具速查 | Spark 使用指南(RDD 版) http://www.showmeai.tech/article-detail/106
- 数据迷信工具速查 | Spark 使用指南(SQL 版) http://www.showmeai.tech/article-detail/107
- 耿嘉安,Spark 内核设计的艺术:架构设计与实现,机械工业出版社,2018
- 郭景瞻,图解 Spark:核心技术与案例实战,电子工业出版社
- Spark 的根本数据结构 RDD 介绍: https://blog.csdn.net/qq\_31598113/article/details/70832701
- Spark RDD(Resilient Distributed Datasets)论文:http://spark.apachecn.org/paper/zh/spark-rdd.html
ShowMeAI 相干文章举荐
- 图解大数据 | 导论:大数据生态与利用
- 图解大数据 | 分布式平台:Hadoop 与 Map-reduce 详解
- 图解大数据 | 实操案例:Hadoop 零碎搭建与环境配置
- 图解大数据 | 实操案例:利用 map-reduce 进行大数据统计
- 图解大数据 | 实操案例:Hive 搭建与利用案例
- 图解大数据 | 海量数据库与查问:Hive 与 HBase 详解
- 图解大数据 | 大数据分析开掘框架:Spark 初步
- 图解大数据 | Spark 操作:基于 RDD 的大数据处理剖析
- 图解大数据 | Spark 操作:基于 Dataframe 与 SQL 的大数据处理剖析
- 图解大数据 | 综合案例:应用 spark 剖析美国新冠肺炎疫情数据
- 图解大数据 | 综合案例:应用 Spark 剖析开掘批发交易数据
- 图解大数据 | 综合案例:应用 Spark 剖析开掘音乐专辑数据
- 图解大数据 | 流式数据处理:Spark Streaming
- 图解大数据 | Spark 机器学习(上)- 工作流与特色工程
- 图解大数据 | Spark 机器学习(下)- 建模与超参调优
- 图解大数据 | Spark GraphFrames:基于图的数据分析开掘
ShowMeAI 系列教程举荐
- 图解 Python 编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解 AI 数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程