Spark RDD介绍

news2024/11/22 20:50:39

RDD


引出问题

Spark是如何将多台机器上的数据通过一个类型来关联实现的?

答:通过RDD类型来实现关联


一、RDD简介

RDD(Resilient Distributed Dataset):弹性分布式数据集

RDD的本质: 一个抽象的逻辑上的数据集合的概念,类似于Python中的list,但RDD是分布式的

  • Python中的list:数据只存在于list构建的节点
  • Spark中的RDD:数据是分布式存储在多台节点上的

RDD的功能:实现分布式的数据存储,是一个对应多个物理分区的数据集合,每个分区的数据可以存储在不同的节点上

  • RDD本质上是一个逻辑的概念,代表多台机器上的多个分区的数据
  • RDD就类似于HDFS中的文件,RDD的分区就类似于HDFS中的Block块

代码演示

# step1:读取数据
input_rdd = sc.textFile("hdfs://node1:8020/spark/wordcount/input")

# step2:转换数据
rs_rdd = input_rdd \
  .filter(lambda line : len(line.strip()) > 0) \
  .flatMap(lambda line : re.split("\\s+",line.strip()))\
  .map(lambda word : (word,1)) \
  .reduceByKey(lambda tmp,item : tmp+item)

filter_rdd = input_rdd.filter
flatMap_rdd = filter_rdd.flatMap
  
# step3:输出结果
rs_rdd.saveAsTextFile("hdfs://node1:8020/spark/wordcount/output")

filter_rdd.foreach(lambda x: print(x))

在这里插入图片描述

二、RDD的五大特性

特性一:每个RDD都由一系列的分区构成

举例说明:

[1,2,3,4,5,6,7,8,9]构建成RDD类型,得到RDD1:RDD[int]

  • part0:1 2 3:node1
  • part1:4 5 6:node2
  • part2:7 8 9 : node3

特性二:RDD的计算操作本质上是对RDD每个分区的并行计算

RDD2 = RDD1.map(lambda x: x*2)

逻辑代码中可以通过调用算子对RDD进行转换操作

物理上真正执行的时候,会对这个RDD每个分区进行并行处理

举例说明:

RDD1 = sc.textFile(文件)
- part0:1 2 3:node1
- part1:4 5 6:node2
- part2:7 8 9:node3

RDD2 = RDD1.map(lambda x: x*2)
- part0:1 2 3:node1	->	task0	->  part0:2 4 6
- part1:4 5 6:node2	->	task1   ->  part1:8 10 12
- part2:7 8 9:node3	->	task2	->  part2:14 16 18

特性三:每个RDD都会保存与其他RDD之间的依赖关系(血缘关系)

RDD数据的计算是在内存中进行,如果因为事故导致内存溢出,Spark需要通过血缘关系保证RDD数据不丢失

血缘关系:Spark记录所有数据每一步的来源,当任何一个步骤中数据丢失的时候,都可以根据来源重新构建

举例说明:

# 读取数据放入内存中
RDD1 = sc.textFile(文件)
- part0:1 2 3:node1
- part1:4 5 6:node2
- part2:7 8 9:node3

# 对内存中RDD1的数据进行转换
RDD2 = RDD1.map(lambda x: x*2)
- part0:1 2 3:node1	->	task0	->  part0:2 4 6
- part1:4 5 6:node2	->	task1   ->  part1:8 10 12
- part2:7 8 9:node3	->	task2	->  part2:14 16 18

RDD2.foreach(lambda x: print(x))	# 打印过程中,某个分区的数据丢失
RDD2.saveAsTextFile(path)


# 此时RDD2记录了是如何通过RDD1得到的,RDD1记录了自己的数据是如何得到的
# 如果打印过程中,某个分区的数据丢失
# RDD2可以通过RDD1调用map算子得到的,DD1可以通过SparkContext读取文件得到的

特性四(可选):对于KV类型的RDD,在经过Shuffle时,可以自定义分区规则

Shuffle过程中:根据Key进行分区

Spark中提供了两种默认的分区器:HashPartitioner、RangePartitioner

  • HashPartitioner:最常用的,大多数分布式计算引擎默认的分区器都是Hash
    • 优点:相同的Key一定会进入同一个分区,用于实现分组
    • 缺点:数据分配不均衡,容易导致数据倾斜 select …… from table distribute by rand()
    • 算子:reduceByKey、groupByKey、repartition
  • RangePartitioner:特殊,Spark专门为排序准备的一个分区器
    • 只用于Spark的排序过程中,用于实现多个分区的情况下全局有序

Spark允许KV类型的RDD在经过Shuffle时,使用自己开发的分区器来干预分区规则


特性五(可选):Driver调度分配Task给Executor运行时可以计算最优分配路径和最优计算位置

思想移动存储不如移动计算。计算过程中要避免了大量数据在网络中传输,影响性能

Driver分配Task给Executor运行,怎么分配性能最好?

答:尽量将Task分配到对应处理的数据所在的节点的Executor中运行

  • PROCESS_LOCAL:Task直接运行在数据所在的Executor中
  • NODE_LOCAL:Task分配在与数据同机器的其他Executor中
  • RACK_LOCAL:Task分配在于数据同机架的不同机器的Executor中
  • NO_PREF:不做最优配置

举例说明:

① 如果将将Task随机分配,会导致每个Task都要通过网络到别的机器上下载数据到自己机器的内存中才能计算,影响性能
在这里插入图片描述

② 使用最优路径方案:Task就在数据所在的机器运行,效率是最高的

20220523120937626-1657978706722.png


三、RDD的构建

① 并行化一个已存在的集合:sc.parallelize(列表,分区个数)

在这里插入图片描述

② 读取外部存储系统数据源:sc.textFile(文件,最小分区个数)

在这里插入图片描述

四、RDD的分区规则

读取数据

sc.parallelize(列表,分区个数)

  • 无指定分区:由spark.default.parallelism参数值决定
  • 指定分区:指定几个,就是几个分区

sc.textFile(文件,最小分区个数)

  • 无指定分区:spark.default.parallelism和 2 取最小值,得到最小分区数,最终也是根据文件大小来
  • 指定分区:指定的是最小分区数,具体的分区数可以根据HDFS分片规则来
    • minPartitions = 2
    • 文件:100M => 2个分区
    • 文件:300M => 3个分区

处理数据

默认:子RDD的分区数 = 父RDD的分区数

  • 特殊:允许通过调用算子进行修改:repartition、coalesce、reduceByKey等

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

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

相关文章

项目运行久了很卡,手动执行垃圾回收机制,秒丝滑

问题 当项目运行久了,内存会被大量占用。如何不重启项目,释放内存,继续丝滑开发呢? 回答 手动执行垃圾回收机制 打开任务管理器康康: 巨卡,无敌卡,解决它! 打开命令行工具&…

Kaggle竞赛——Titanic泰坦尼克之灾(保姆级基础版)

Kaggle竞赛网址:https://www.kaggle.com/c/titanic 本次Kaggle泰坦尼克之灾分析过程大致分为: 第1步:了解数据 第2步:分析数据之间的关系 第3步:缺失项数据处理 第4步:特征因子化 第5步:处理特…

DBCO-SS-活性酯|DBCO-SS-NHS酯

DBCO-SS-活性酯|DBCO-SS-NHS酯 名称;DBCO-SS-活性酯|DBCO-SS-NHS酯 CAS NO:1435934-53-4 分子量:565.66 分子式:C28H27N3O6S2 含 量:>95% 外 观:固体粉末 保存:-20避光避湿 结构式: …

记录--手把手带你开发一个uni-app日历插件(并发布)

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 相信我们在开发各类小程序或者H5,甚至APP时,会把uni-app作为一个技术选型,其优点在于一键打包多端运行,较为强大的跨平台的性能。但是,只要开…

我为什么建议前端将Python 作为第二语言?

前言 “如何摆脱不停切图的困局?” 这不是一篇制造焦虑的文章,而是充满真诚建议的Python推广文。 当谈论到编程入门语言时,大多数都会推荐Python和JavaScript。 实际上,两种语言在方方面面都非常强大。 而如今我们熟知的ES6语…

用Java语言简单实现:炸金花,不知道你有没有兴趣跟着笔者来研究一下呀

说实话,到目前为止,笔者学习Java语言也有着进两个多月了吧!!但是,一直毫无进度!博客更新的也很少,仅仅10篇刚出头,而且浏览量也很少,这样很不符合我的气质!&a…

汉字风格迁移----FtransGAN

🚀针对的问题 以前的大多数作品都是通过将给定子集的风格转移到未见子集的内容来解决这个问题的。然而,他们只关注同一语言中的字体样式转换。在许多任务中,我们需要学习一种语言的字体信息,然后将其应用到其他语言。现有的方法很难完成这样的任务。 图1。几个应用实例。…

03_2排序算法:快速排序、归并排序

开始系统学习算法啦!为后面力扣和蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括概念,算法运行过程,以及代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私信博…

IIS2MDCTR传感器规格、ISM303DACTR磁力计应用、STPSC20H12WL二极管特点

IIS2MDC 3轴数字式磁性传感器具有高达50高斯的磁场动态范围以及16位数据输出。IIS2MDC设有I2C串行总线接口,可支持标准模式 (100kHz)、快速模式 (400kHz)、快速模式 (1MHz) 以及高速模式 (3.4MHz)。 该传感器还设有SPI串行标准接口,另外对其进行配置后可…

IBPS低代码产品公司流辰信息:用心研发,不负众望!

作为一家低代码产品公司,流辰信息一直以高标准严格要求自己,努力研发,努力提升服务品质,从专业的角度为中大型企业数字化转型积极赋能,共创价值。 IBPS低代码开发产品是流辰信息努力研发的硕果,是满足企业级…

教材推荐网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 高校教材推介交流平台的开发主要功能教师发布课程名称、用书信息,各出版社推荐样 书(线上&#…

CRTO 考试总结

写在最前:欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里:https://discord.gg/9XvvuFq9Wb 一起进步,一起 NB~ 背景 今天我结束了 Zero Point Security RTO I 的考试。证书到手。 Zero Point Security 是一家 Base 在英国的安全…

知乎zse-96算法-js补环境方案

文章目录 1. js代码定位与抠取2. 初步分析 开始补环境3. 完整的补全环境的js整合4. 编写python代码调用测试1. js代码定位与抠取 抠js和上篇jsrpc方案一样,传送门:知乎zse-96算法-jsrpc方案 这里简单提一下 直接进入encrypt方法里, 往上先把整个方法体给扣下来: "u…

c语言教工工资管理系统课程设计

序 言 借助现代信息技术和管理理论,建立学校管理信息系统势在必行。对学校而言,全面开发和应用计算机管理信息系统就是有必要的。在学校管理中,教师是学校的宝贵资源,也是学校的“生命线”,因此人事管理是学校的计算机…

JAVA中生成随机数Random VS ThreadLocalRandom性能比较

前言 大家项目中如果有生成随机数的需求,我想大多都会选择使用Random来实现,它内部使用了CAS来实现。 实际上,JDK1.7之后,提供了另外一个生成随机数的类ThreadLocalRandom,那么他们二者之间的性能是怎么样的呢&#x…

用JavaScript写代码将硬盘序列号从16进制字符串转换为ASCII字符串,兼谈EditPlus和Edge浏览器对JavaScript脚本支持的一点差别

之前写的系统信息收集报告程序SysInfo的一个功能就是收集并报告系统中的硬盘序列号。在之前的测试中这项功能表现不错,但前两天用SysInfo收集一台电脑的信息时,显示的硬盘序列号与其它硬盘序列号读取程序显示的顺序不一样。于是着手对SysInfo的相关代码进…

网络爬虫爬取数据并制作词云全过程【内附可执行代码注释完整】

文章目录前言网络爬取数据部分小知识点利用正则表达式在字符串中提取到url(https以及http)仅仅只保存字符串中的中文字符爬取数据生成词云jieba分词生成词云生成词云最终版代码总结前言 快期末了,有个数据挖掘的大作业需要用到python的相关知…

Json字符串转成对象

Json字符串转成对象 Hello吖😊,我是孤音(一个你理解不了的程序猿),今天来分享一个小技巧,能够大大滴提高效率额 问题😵 接收到一串JSON格式的字符串,需要获取其中某些字段的值 思路…

一天梳理完React所有面试考察知识点

性能优化 性能优化,永远是面试的重点,性能优化对于 React 更加重要 在页面中使用了setTimout()、addEventListener()等,要及时在componentWillUnmount()中销毁使用异步组件使用 React-loadable 动态加载组件shouldComponentUpdate(简称SCU …

更高效、更精确的预测性维护方案是如何实现的?

一、预测性维护的必要性 设备维护一般有三种模式:事后维护、预防性维护和预测性维护。事后维护通常是在设备产生故障后采取措施进行维护,是一种成本较大的维护方式。预防性维护属于事先维护,是一种基于时间、性能等条件,对设备进…