Spark RDD的实操教程(一)

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: Spark RDD的实操教程(一)

0x00 教程内容


  1. RDD 简介与特点
  2. 创建 RDD 的三种方式
  3. map 算子与 flatMap 算子的区别


0x01 RDD 概念


1. RDD 简介

RDD(Resilient Distributed Databases),即弹性分布式数据集,它是 Spark 对数据的核心抽象,也就是 Spark 对于数据进行处理的基本单位。使用 Spark 对数据进行处理首先需要把数据转换为 RDD,然后在 RDD 上对数据进行相应的操作。RDD 有两种算子,分别是转换(transformations)算子和行动(actions)算子。


在 Spark 中,对数据处理的操作流程如下:

创建 RDD => 对 RDD 进行转化操作 => 执行行动操作求值


我们暂且不管RDD的特点,RDD的深层次概念,我们先把 RDD 简单理解为一堆数据即可。


讲得形象点,举个例子:


经过多年的努力,邵奈一收获了很多粉丝,粉丝来自于全国各地,有广东的、有背景的、有上海的、有湖南的等等,由于粉丝们的热情追捧,强烈建议要组建一个大型学习群,名称叫做: “奈一大数据学习联盟” 。


如果将此例子用到我们大数据,可以这么理解:


所有的粉丝是一堆的数据,只不过,这些粉丝,是分布在很多个省份的,类比于一堆大大的数据,是存储到很多台服务器上的,省份就是服务器,在没有成立 “奈一大数据学习联盟” 之前,其实粉丝也是一直都存在的,分布在各个省。今天,邵奈一在网络上发了一则公告,说:“奈一大数据学习联盟”,今天!成立了!!!其实就相当于给了这一堆数据起了一个名称了,这个名称,其实就相当于是 RDD 的名称,而这一堆数据,其实就是 RDD ,就是弹性分布式数据集!


当你成立了一个联盟,也就是你申明了一个 RDD ,接下来你就可以做很多事情了,比如,你可以淘汰过滤粉丝(把没评论没点赞的淘汰掉嘿嘿),还可以统计一下哪个省份的粉丝最多(山顶的朋友,请举起你的双手),还可以做很多很多的事情,其实这些事情,就相当你后面会学到的算子一样。


2. RDD 特点

可先参考此文章:(二)RDD概述及五大特性


0x02 RDD 的创建方式


1. 环境准备
  1. 启动 Spark Shell(需要先启动 Spark!


spark-shell --master spark://master:7077


  1. 启动 HDFS (本教程为分布式集群环境,如没部署好,请参考本博客其他课程)
    start-all.sh

准备一个文件,如下是我的文件:

hadoop fs -cat /files/put.txt


image.png


shao nai yi
nai nai yi yi
shao nai nai


进入HDFS的Web UI界面可以发现是存放在slave1和slave2上的:


微信图片_20220619130630.png


2. 三种创建方式

在稳定的存储系统中,比如 HDFS 文件中创建

这种就像前面所讲的组建联盟的方式,HDFS文件原本就是存储在多台服务器上的,你只要写了声明就可以,只需要将路径修改为HDFS相应的路径即可,如我的是:hdfs://master:9999/files/put.txt

则写成:


val putRDD = sc.textFile("hdfs://master:9999/files/put.txt")


image.png


又如教程里:Spark Shell入门教程 里的词频统计代码是直接从Linux文件系统中直接生成 RDD :


val textFileRDD = sc.textFile("/home/hadoop-sny/datas/word.txt")


此外,也可以从Cassandra、HBase 等中创建。


由存在的RDD上创建一个新的RDD

比如,奈一之前有组建过一个组织的,叫 “复制粘贴玩大数据联盟” ,现在我要对组织进行升级了,改组成 “奈一大数据学习联盟” ,道理一个样。


val wordRDD = textFileRDD.flatMap(line => line.split(" "))


代码解释:原本是有一个叫 textFileRDD 的RDD的,现在通过一个 flatMap 算子,生成了一个新的 RDD ,名称为 wordRDD 。


重点: map 算子与 flatMap 算子的区别:


map 算子


putRDD.map(line => line).collect


返回结果为:


Array(shao nai yi, nai nai yi yi, shao nai nai)


flatMap 算子


putRDD.flatMap(line => line.split(" ")).collect


返回结果为:


Array(shao, nai, yi, nai, nai, yi, yi, shao, nai, nai)


以上可知:

map 算子,其实是对 RDD 里面的每一行元素进行映射关系,本例子是映射成自己,RDD 的元素是不变;其实如果一行元素只有一个数字,其实也是可以让这个数字进行相应的加减乘除的。

flatMap 算子,比map 算子多了一个 flat 操作,可以理解为将元素打平的意思,而打平的条件就是split(" "),按照空格进行打平,所以会发现,到最后,我们每一行的RDD其实是进行了打平操作的,得到的结果就是打平后的结果。


关键理解:其实,RDD 可以理解为是一个只有一列的具有多行的表!


如上面HDFS上的 put.txt 文件:


shao nai yi

nai nai yi yi

shao nai nai


一共有三行,只有一列,这三行所对应的列分别为shao nai yi \ nai nai yi yi \ shao nai nai,flatMap 其实就是对这三行的这一列数据进行了打平操作。


image.png


3. 从内存中已经存在的序列列表中生成

val data= Array(1,2,3,4,5)
// 创建一个RDD
val dataRDD = sc.parallelize(data)
// 创建一个有两个分区的RDD
val dataRDD2 = sc.parallelize(data,2)
// 对RDD的结果进行叠加计算
dataRDD .reduce((a,b) => a + b)


因为这种方式是把内存中的数据生成 RDD ,所以一般用得很少,毕竟内存很有限,一般是开发原型、测试和学习用一下而已。


0xFF 总结


  1. 本教程虽然是讲解 RDD ,但是在操作的过程中也顺便将一些相关联的知识点带出来了,有利于大家理解。
  2. 请继续学习本博客的其他相关文章,加油。


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
打赏
0
0
0
0
11
分享
相关文章
【赵渝强老师】Spark RDD的缓存机制
Spark RDD通过`persist`或`cache`方法可将计算结果缓存,但并非立即生效,而是在触发action时才缓存到内存中供重用。`cache`方法实际调用了`persist(StorageLevel.MEMORY_ONLY)`。RDD缓存可能因内存不足被删除,建议结合检查点机制保证容错。示例中,读取大文件并多次调用`count`,使用缓存后执行效率显著提升,最后一次计算仅耗时98ms。
【赵渝强老师】Spark RDD的缓存机制
【赵渝强老师】Spark RDD的依赖关系和任务阶段
Spark RDD之间的依赖关系分为窄依赖和宽依赖。窄依赖指父RDD的每个分区最多被一个子RDD分区使用,如map、filter操作;宽依赖则指父RDD的每个分区被多个子RDD分区使用,如分组和某些join操作。窄依赖任务可在同一阶段完成,而宽依赖因Shuffle的存在需划分不同阶段执行。借助Spark Web Console可查看任务的DAG图及阶段划分。
83 15
【赵渝强老师】Spark中的RDD
RDD(弹性分布式数据集)是Spark的核心数据模型,支持分布式并行计算。RDD由分区组成,每个分区由Spark Worker节点处理,具备自动容错、位置感知调度和缓存机制等特性。通过创建RDD,可以指定分区数量,并实现计算函数、依赖关系、分区器和优先位置列表等功能。视频讲解和示例代码进一步详细介绍了RDD的组成和特性。
大数据-99 Spark 集群 Spark Streaming DStream 文件数据流、Socket、RDD队列流
大数据-99 Spark 集群 Spark Streaming DStream 文件数据流、Socket、RDD队列流
58 0
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
149 0
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
64 0
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
77 0
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
106 0
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
84 0
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
72 4