深入了解 RDD

深入了解 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 分区最好应该放在什么位置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【小沐学CAD】开源Assimp库导入三维模型(C++、Python)

文章目录 1、简介2、下载编译3、代码测试3.1 C3.2 pyassimp&#xff08;Python&#xff09; 结语 1、简介 https://github.com/assimp/assimp Open Asset Import Library 是一个库&#xff0c;用于将各种 3D 文件格式加载为共享的内存格式。它支持 40 多种用于导入的文件格式和…

openssl3.2 - 编译

文章目录 openssl3.2 - 编译概述OpenSSL源码下载编译目标如何编译前置环境 - perl前置环境 - VS前置环境 - NASM快速编译步骤编译 - Quick startInstall PerlInstall NASMUse Visual Studio Developer Command Prompt with administrative privilegesFrom the root of the Open…

I.MX6ULL开发笔记(二)——硬件外设操作

0x01 点亮第一个RGB灯 在文章http://t.csdnimg.cn/EGWt9中有介绍Linux下文件目录&#xff0c;那么在Linux系统下&#xff0c;RGB灯也是一个设备&#xff0c;所以我们需要到/sys目录下去操作这个设备。 之后&#xff0c;我们进入到class目录&#xff0c;这里挂载着开发板上的外…

关于一个热成像仪的总结(一)硬件篇电源电路

1、电源部分 电源部分电路原理是这样的通过3.7V的锂电池供电&#xff0c;用Type-C选用TP4056作为充电电路给电池充电。使用MP2161开关电源作为5转3.3V 电源为MCU供电。 1-1电池 待定 1-2充电管理芯片TP4056 参考datasheet&#xff1a;https://atta.szlcsc.com/upload/publi…

[蓝桥杯学习] 线段树

学习blibli 定义 线段树是一种特殊的平衡二叉查找树&#xff0c;使用线段树&#xff0c;可以实现数据的添加、查找和删除。 树的根结点表示了一个完整的单元区间&#xff0c;左右孩子的区间是将父结点的区间进行二分&#xff0c;左右孩子的区间之和&#xff0c;就是他们的根…

studio3T mongodb 根据查询条件更新字段 或 删除数据

1. mongodb 等于、不等于$ne、不包含 $nin 以及批量更新数据的使用。 业务场景&#xff1a; 在集合中&#xff0c;根据查询条件&#xff0c;更新数据状态。 实现代码&#xff1a; 1. 部门名称为XXX、状态不等于“完好”的、并且不包含这些编码的数据先查询出来2. 再把状态更…

基于Java+SSM+JSP实现全功能电子商城

&#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩项目推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 基于SpringBoot的旅游网站 基于SpringBoot的MusiQ音乐网站 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及…

解决Android AAPT: error: resource android:attr/lStar not found. 问题

错误信息 /xxx/gjc/.gradle/caches/transforms-2/files-2.1/930c42acd29d295ce5bc495c3b84423e/core-1.9.0/res/values/values.xml:104:5-113:25: AAPT: error: resource android:attr/lStar not found. not found 资源位置 场景 原Android studio中的项目都是在git上面拉的老项…

react-hooks-kit v1 正式发布

evanpatchouli/react-hooks-kit - (npmjs.com) v1.0.0 正式发布&#xff01; 下载安装 npm i evanpatchouli/react-hooks-it -S官方文档 在 Gitee 阅读在 Github 阅读 概览 这是一个无依赖的轻量级 React Hooks 库&#xff0c;总共有 60 hooks。 它包含了一系列易于使用…

端口被占用:Port 8000 was already in use.

一、前言&#xff1a; APPLICATION FAILED TO START Description: Web server failed to start. Port 8000 was already in use. Action: Identify and stop the process that’s listening on port 8000 or configure this application to listen on another port. Proces…

C#,冒泡排序算法(Bubble Sort)的源代码与数据可视化

排序算法是编程的基础。 常见的四种排序算法是&#xff1a;简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显&#xff0c;一般使用递归方式实现&#xff0c;但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。本文搜集发布四种算法…

一致化和一致量纲化问题

归一化/标准化实质是一种线性变换&#xff0c;线性变换有很多良好的性质&#xff0c;这些性质决定了对数据改变后不会造成“失效”&#xff0c;反而能提高数据的表现&#xff0c; &#xff08;1&#xff09;无量纲化 例如房子数量和收入&#xff0c;因为从业务层知道&#xf…

Java:爬虫htmlunit

为什么htmlunit与HttpClient两者都可以爬虫、网页采集、通过网页自动写入数据&#xff0c;我们会推荐使用htmlunit呢? 一、网页的模拟化 首先说说HtmlUnit相对于HttpClient的最明显的一个好处&#xff0c;HtmlUnit更好的将一个网页封装成了一个对象&#xff0c;如果你非要说H…

计算机组成原理18——CPU的结构和功能2(书中重点及习题)

本系列文章是学习了网课《哈尔滨工业大学–计算机组成原理》之后&#xff0c;用以梳理思路而整理的听课笔记及相关思维拓展。本文涉及到的观点均为个人观点&#xff0c;如有不同意见&#xff0c;欢迎在评论区讨论。 目录 中断系统中断请求标记和中断判优逻辑中断服务程序入口地…

【教学类-45-01】X-Y之间的三连加题(a+b+c=)

作品展示&#xff1a; 背景需求&#xff1a; 我常去的大4班孩子们基本都适应了0-5之间的加法题&#xff0c;做题速度极快。 为了增加“花样”&#xff0c;吸引幼儿参与&#xff0c;修改参数&#xff0c;从二连加12变为三连加111。 素材准备: 代码重点 代码展示 X-Y 之间的3…

【hcie-cloud】【18】华为云Stack灾备服务介绍【容灾解决方案介绍、灾备方案架构介绍、管理组件灾备方案介绍、高阶云服务容灾简介、缩略词】【下】

文章目录 灾备方案概述、备份解决方案介绍容灾解决方案介绍华为云容灾解决方案概览云容灾服务云硬盘高可用服务 (VHA)VHA组网结构VHA逻辑组网架构VHA管理组件介绍VHA服务实现原理云服务器高可用服务&#xff08;CSHA&#xff09;CSHA物理组网架构CSHA逻辑组网架构CSHA服务组件间…

PLSQL Developer 15安装和oracle客户端安装

文章目录 前言一、PLSQL Developer1.下载2.安装 二、oracle客户端1.下载2.环境变量 三、使用1. oci2. 连接3. 配置文件 总结 前言 oracle是经常使用的数据库&#xff0c;PLSQL Developer是众多产品中比较不错的一款工具&#xff0c;接下来我们来介绍PLSQL Developer的安装和使…

【Filament】基于物理的光照(PBR)

1 前言 自定义Blinn Phong光照模型中实现了基础的自定义光照&#xff0c;与现实的光照还是有些差别&#xff0c;本文将实现更逼真的光照效果&#xff0c;即基于物理的光照&#xff08;PBR&#xff09;。 读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环…

超维空间M1无人机使用说明书——01、ROS机载电脑使用说明——远程连接

引言&#xff1a;远程连接通常采用两种方式&#xff0c;一种是通过可视化软件&#xff0c;如VNC、Nomachine等&#xff0c;另外一种是使用SSH。各有优缺点&#xff0c;两种远程登录方式的优缺点做一个简单的对比&#xff1a; 1、SSH优缺点 优点:1、消耗网络资源 2、运行稳定 …

Stable Diffusion好用的显卡推荐

Stable Diffusion 是一款顶级的人工智能艺术生成工具&#xff0c;以其快速的性能、用户友好的界面和显着的效果而闻名。然而&#xff0c;在沉浸体验之前&#xff0c;有必要验证您的计算机&#xff08;显卡&#xff09;是否符合最佳功能所需的严格规范。今天我们将介绍三款高性价…