深入了解 RDD

news2024/11/17 19:38:25

深入了解 RDD

  • 案例

    1. 明确需求:

      在访问日志中,统计独立IP数量 TOP10

    2. 查看数据结构:

      IP,时间戳,Http,Method,Url……

    3. 明确编码步骤

      1. 取出IP,生成一个只有IP的数据集
      2. 简单清洗
      3. 统计IP出现的次数
      4. 排序,按照IP出现的次数
    4. 编写代码

      1. 拷贝数据集
      2. 创建代码文件
      3. 数据集已上传【access_log_sample.rar】
    5. code

      package cn.itcast.spark.rdd
      
      import org.apache.commons.lang3.StringUtils
      import org.apache.spark.{SparkConf, SparkContext}
      import org.junit.Test
      
      class AccessLogAgg {
      
        @Test
        def ipAgg():Unit = {
          // 1. 创建 SparkContext
          val conf = new SparkConf().setMaster("local[2]").setAppName("access_log")
          val sc = new SparkContext(conf)
          // 2. 读取文件,生成数据集
          val sourceRDD = sc.textFile("./dataset/access_log_sample.txt")
          // 3. 取出IP, 赋予出现次数为1
          val ipRDD = sourceRDD.map(item => (item.split(" ")(0),1))
          // 4. 简单清洗
          //    4.1 去掉空数据
          //    4.2 去掉非法数据
          //    4.3 根据业务再规整一下数据
          val cleanRDD = ipRDD.filter(item => StringUtils.isNoneEmpty(item._1)) // 去掉字符串里的空数据
          // 5. 根据IP出现的次数进行聚合
          val ipAggRDD = cleanRDD.reduceByKey( (curr, agg) => curr + agg)
          // 6. 根据IP出现的次数进行排序
          val sortedRDD = ipAggRDD.sortBy(item => item._2, ascending = false) // 降序
          // 7. 取出结果,打印结果
          sortedRDD.take(10).foreach(item => println(item))
        }
      }
      
  • 提出问题

    1. 文件特别大的时候怎样去处理

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    2. 如何放在集群中执行
      在这里插入图片描述

      简单来讲, 并行计算就是同时使用多个计算资源解决一个问题, 有如下四个要点

      1. 要解决的问题必须可以分解为多个可以并发计算的部分
      2. 每个部分要可以在不同处理器上被同时执行
      3. 需要一个共享内存的机制
      4. 需要一个总体上的协作机制来进行调度
    3. 任务如何拆解

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      概述

      1. 对于 HDFS 中的文件, 是分为不同的 Block 的
      2. 在进行计算的时候, 就可以按照 Block 来划分, 每一个 Block 对应一个不同的计算单元

      扩展

      1. RDD 并没有真实的存放数据, 数据是从 HDFS 中读取的, 在计算的过程中读取即可
      2. RDD 至少是需要可以 分片 的, 因为HDFS中的文件就是分片的, RDD 分片的意义在于表示对源数据集每个分片的计算, RDD 可以分片也意味着 可以并行计算

    4. 怎样移动计算

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      每一个计算单元需要记录其存储单元的位置, 尽量调度过去

    5. 如何容错

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      RDD1 → RDD2 → RDD3 这个过程中, RDD2 出错了, 有两种办法可以解决

      1. 缓存 RDD2 的数据, 直接恢复 RDD2, 类似 HDFS 的备份机制
      2. 记录 RDD2 的依赖关系, 通过其父级的 RDD 来恢复 RDD2, 这种方式会少很多数据的交互和保存

      如何通过父级 RDD 来恢复?

      1. 记录 RDD2 的父亲是 RDD1
      2. 记录 RDD2 的计算函数, 例如记录 RDD2 = RDD1.map(…), map(…) 就是计算函数
      3. 当 RDD2 计算出错的时候, 可以通过父级 RDD 和计算函数来恢复 RDD2
    6. 如果RDD之间的依赖链过长的时候,如何拆解

      在这里插入图片描述

      上面提到了可以使用依赖关系来进行容错, 但是如果依赖关系特别长的时候, 这种方式其实也比较低效,

      这个时候就应该使用另外一种方式, 也就是记录数据集的状态,在 Spark 中有两个手段可以做到

      1. 缓存
      2. Checkpoint
  • 深入定义RDD

    1. RDD 为什么会出现

      1. 在 RDD 出现之前, 当时 MapReduce 是比较主流的, 而 MapReduce 如何执行迭代计算的任务呢?

        在这里插入图片描述

        多个 MapReduce 任务之间没有基于内存的数据共享方式, 只能通过磁盘来进行共享。这种方式明显比较低效

      2. RDD 如何解决迭代计算非常低效的问题呢?

        在这里插入图片描述

        在 Spark 中, 其实最终 Job3 从逻辑上的计算过程是: Job3 = (Job1.map).filter, 整个过程是共享内存的, 而不需要将中间结果存放在可靠的分布式文件系统中

        这种方式可以在保证容错的前提下, 提供更多的灵活, 更快的执行速度, RDD 在执行迭代型任务时候的表现可以通过下面代码体现

        //线性回归
            val points sc.textFile(...)
                .map(...)
                .persist(...)
            val w randomValue
            for(i <- 1 to 10000){
              val gradient = points.map(p =>p.x * (1 / (1 exp(-p.y * (w dot p.x))) -1 ) * p.y)
                  reduce(_+_)
              w -= gradient
        

        在这个例子中,进行了大致 10000 次迭代,如果在 MapReduce 中实现,可能需要运行很多的 Job, 每个 Job 之间都要通过HDFS共享结果,熟快熟慢一看便知

    2. RDD 的特点

      1. RDD 不仅是数据集, 也是编程模型

        RDD 即是一种数据结构, 同时也提供了上层 API, 同时 RDD 的 API 和 Scala 中对集合运算的 API 非常类似, 同样也都是各种算子

        在这里插入图片描述

        RDD 的算子大致分为两类:

        1. Transformation 转换操作, 例如 map flatMap filter
        2. Action 动作操作, 例如 reduce collect show

        执行 RDD 的时候, 在执行到转换操作的时候, 并不会立刻执行, 直到遇见了 Action 操作, 才会触发真正的执行, 这个特点叫做 惰性求值

      2. RDD 可以分区

        在这里插入图片描述

        RDD 是一个分布式计算框架, 所以, 一定是要能够进行分区计算的, 只有分区了, 才能利用集群的并行计算能力

        同时, RDD 不需要始终被具体化, 也就是说: RDD 中可以没有数据, 只要有足够的信息知道自己是从谁计算得来的就可以, 这是一种非常高效的容错方式

      3. RDD 是只读的

        在这里插入图片描述

        RDD 是只读的, 不允许任何形式的修改. 虽说不能因为 RDD 和 HDFS 是只读的, 就认为分布式存储系统必须设计为只读的.

        但是设计为只读的, 会显著降低问题的复杂度, 因为 RDD 需要可以容错, 可以惰性求值, 可以移动计算, 所以很难支持修改.

        • RDD2 中可能没有数据,只是保留了依赖关系和计算函数,那修改啥?
        • 如果因为支持修改,而必须保存数据的话,怎么容错?
        • 如果允许修改,如何定位要修改的那一行?RDD 的转换是粗粒度的,也就是说,RDD 并不感知具体每一行在哪
      4. RDD 是可以容错的

        在这里插入图片描述

        RDD 的容错方式有两种:

        • 保存 RDD 之间的依赖关系,以及计算函数,出现错误重新计算
        • 直接将 RDD 的数据存放在外部存储系统,出现错误直接读取,Checkpoint
    3. 什么叫做弹性分布式数据集

      分布式

      RDD 支持分区,可以运行在集群中

      弹性

      • RDD 支持高校的容错
      • RDD 中的数据即可缓存在内存中,也可以在磁盘中,也可以缓存在外部存储中

      数据集

      • RDD 可以不保存具体数据,只保留创建自己的必备信息,例如依赖和计算函数
      • RDD 也可以缓存起来,相当于存储具体数据
  • 总结 RDD 的五大属性

    首先整理一下上面所提到的 RDD 所要实现的功能:

    1. RDD 有分区
    2. RDD 要可以通过依赖关系和计算函数进行容错
    3. RDD 要针对数据本地性进行优化
    4. RDD 支持 MapReduce 形式的计算,所以能够对数据进行 Shuffled

    对于 RDD 来说,其中应该有什么内容呢?如果站在 RDD 设计者的角度上,这个类中, 至少需要什么属性?

    • Partition List 分片列表,记录 RDD 的分片,可以在创建 RDD 的时候指定分区数目,也可以通过算子来生成新的 RDD 从而改变分区数目
    • Compute Function RDD 之间的依赖关系,要在RDD 中记录其上级RDD 是谁,从而实现容错和计算
    • Partitioner 为了执行 shuffled 操作,必须要有一个函数用来计算数据应该发往哪个分区
    • Preferred Location 优先位置,为了实现数据本地操作,从而移动计算而不是移动存储,需要记录每个 RDD 分区最好应该放在什么位置

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

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

相关文章

Tomcat Notes: Deployment File

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial&#xff0c;owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Tomcat deployment1.1、Two modes of …

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)九

第二部分、线性表详解&#xff1a;数据结构线性表10分钟入门 线性表&#xff0c;数据结构中最简单的一种存储结构&#xff0c;专门用于存储逻辑关系为"一对一"的数据。 线性表&#xff0c;基于数据在实际物理空间中的存储状态&#xff0c;又可细分为顺序表&#xff…

Java 基础知识点1 (含面试题)

本次Java 知识点主要是关于SE的相关基础&#xff0c;同时也包含了数据结构中的一些API&#xff0c;例如Set,List,Map等&#xff0c;最后也附上了相关重要的面试题&#xff0c;可供大家学习与参考&#xff01; 目录 重要知识点数据结构API面试题 重要知识点 Java 是一门面向对象…

linux下超级程序!在linux界面实现类图像化界面的操作体验!

linux下超级程序&#xff01;在linux界面实现类图像化界面的操作体验&#xff01; 本期带来一个超级程序&#xff01;在linux界面实现类图像化界面的操作体验。具体功能代码如下: 1500行完整代码想要完成部署&#xff0c;只需在本地创建一个LinuxGJ.sh的文件&#xff0c;然后…

传感数据分析——高通滤波与低通滤波

传感数据分析——高通滤波与低通滤波 文章目录 传感数据分析——高通滤波与低通滤波前言一、运行环境二、Python实现总结 前言 对于传感信号而言&#xff0c;我们可以提取其中的高频信息和低频信息&#xff0c;低频信息往往是信号的趋势&#xff0c;高频信息往往是一些突变或异…

构建自己的私人GPT

创作不易&#xff0c;请大家多鼓励支持。 在现实生活中&#xff0c;很多人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的私人GPT变得非常重要。 一、本地部署…

win10下vscode+cmake编译C代码操作详解

0 工具准备 1.Visual Studio Code 1.85.1 2.cmake 3.24.01 前言 当我们只有一个.c文件时直接使用vscodeCode Runner插件即可完成编译&#xff0c;如果我们的工程很复杂包含多个.c文件时建议使用cmake来生成对应的make&#xff0c;指导编译器完成编译&#xff0c;否则会提示各…

数字图像处理(图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波)

数字图像处理&#xff08;图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波&#xff09; 目录 1 图像灰度变换 1.1 灰度线性变换 1.2 图像二值化 1.3 负象变换 1.4 灰度非线性变换 1.5 程序设计流程图 2 图像直方图及均衡 2.1 直方图 2…

无心剑七绝《高斯黎曼》

七绝高斯黎曼 高耸云端四海惊 斯人伟绩震豪英 黎霞璀璨通灵处 曼妙方程万世名 2024年1月6日 平水韵八庚平韵 《七绝高斯黎曼》是无心剑所作的一首以数学家为主题的七言绝句。全诗巧妙地将两位杰出的数学家——高斯&#xff08;Carl Friedrich Gauss&#xff09;与黎曼&#…

大模型机器人原理解析:如何从RT/RT2、Berkeley Gello到发展到斯坦福Mobile ALOHA、Google家务机器人

前言 23年7月&#xff0c;我在朋友圈评估Google的RT2说道&#xff1a; “大模型正在革新一切领域啊&#xff0c;超帅&#xff0c;通过大模型不仅能理解“人话”&#xff0c;还能对“人话”进行推理&#xff0c;并转变为机器人能理解的指令&#xff0c;从而分阶段完成任务。回…

express框架

目录 一、express介绍二、express 使用2.1 express下载2.2 express初体验 三、express 路由3.1 路由的使用3.2 获取参数3.3 获取路由参数 四、express响应设置五、express中间件5.1 什么是中间件5.2 中间件的作用5.3 中间件的类型5.3.1 定义全局中间件5.3.2 多个全局中间件5.3.…

协程池与新脚本语言

今天的主人公名为——Melang。 这是一款使用C语言开发的“新”的脚本语言&#xff0c;然而其已经默默问世了6年之久。 下面笔者就带你走进Melang world。 What is Melang Melang是一款协程并发脚本语言。它是一款解释型&#xff0c;而非编译型语言。 在Melang中&#xff…

html中的form表单以及相关控件input、文本域、下拉select等等的详细解释 ,点赞加关注持续更新~

文章目录 表单创建表单forminput 标签input标签的value属性设置input标签格式单选框多选框上传文件下拉菜单文本域设置文本域格式label 标签按钮 表单 作用&#xff1a;收集用户信息。 使用场景&#xff1a; 登录页面注册页面搜索区域 创建表单form <form action".…

实战环境搭建-linux下安装jdk1.8

查看安装jdk版本信息,主要是怕之前有遗漏的,或者安装失败的java rpm -qa | grep java 显示如下信息: 卸载: rpm -e --nodeps java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 还有一些其他的命令…

MATLAB插值函数

一、MATLAB插值函数概览 1&#xff09;本节重点介绍的插值函数 MATLAB插值函数适用情况基础句式interp1 函数interp1 主要用于一维数据的插值interp1(x, y, x_interp, ‘linear’); 其中 x 和 y 是已知数据点&#xff0c;x_interp 是要插值的目标点。interp2 函数interp2 用于…

【STM32】PWR电源控制

1 PWR简介 PWR&#xff08;Power Control&#xff09;电源控制 PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到P…

回首2023,期待2024!

2023&#xff0c;在改变中到来 2023年1月1日&#xff0c;我从成都冷清的学校回到了哈尔滨的老家&#xff0c;开始了保研之前的最后一个寒假 当时的目标是将之前的科研理论转化为实际&#xff0c;生产出一篇sci&#xff0c;助力保研加分 星移斗转&#xff0c;事与愿违&#x…

从零实现CLIP模型

1. 引言 CLIP代表语言图像对比预训练模型&#xff0c;是OpenAI于2021年开发的一个深度学习模型。CLIP模型中图像和文本嵌入共享相同的潜在特征空间&#xff0c;从而能够在两种模式之间直接进行对比学习。这是通过训练模型使相关的图像和文本更紧密地结合在一起&#xff0c;同时…

MySQL高级DBA的理论与实践,MySQL数据库管理员从入门到精通

一、教程描述 数据库管理员&#xff08;Database Administrator&#xff09;&#xff0c;简称DBA&#xff0c;想要成为高级的MySQL DBA&#xff0c;就要耐得住寂寞&#xff0c;持续不断地学习&#xff0c;除了数据库专业知识外&#xff0c;还需要了解主机、系统、网络、存储、…

SSD固态硬盘的黄金原则:抱最高的希望,做最坏的打算-1

随着SSD固态硬盘日益普及&#xff0c;在个人电脑中已成为基本的配置选项。在体验SSD固态硬盘带来的性能优势的同时&#xff0c;你有没有想过一个问题&#xff0c;SSD的数据如果误删除或发生故障丢失&#xff0c;还有没有可能找回来呢&#xff1f;这也许是固态硬盘飞入寻常百姓家…