IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Spark02——RDD具体介绍 -> 正文阅读

[大数据]Spark02——RDD具体介绍

因为RDD的实现原理和IO的实现原理差不多,我们先来说一下IO的实现原理:
其实真正进行读取数据的还是FileInputStream

IO实现原理图解:

在这里插入图片描述

RDD的工作流程:

在这里插入图片描述

  1. RDD不会存储数据;
  2. RDD也有装饰者模式;
  3. RDD只有调用collect方法,才会真正执行业务逻辑代码,封装操作都是对RDD的功能扩展

分区和并行度:

概念:
分区 & 并行的概念: 分区和并行度是可以不一样的, 当有2个分区和1个executor的时候,就还不是并行,只能并发执行

并行度执行解析:
对数据进行分区, 然后每个分区内必须一个一个执行,多个分区可以并行执行,做到执行区内有序,区外无序

例: 对数据 List(1,2,3,4), 两个分区
计算流程:

  1. 先进行分配,
    0号分区 => 1 ,2
    1号分区 => 3,4
  2. 如果再执行两次map的话, 就会先将每个分区的第一个数据的全部计算完成之后,才会进行执行第二个, 做到区内数据执行有序

在这里插入图片描述

RDD的特点:

介绍:RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型。

? 弹性
? 存储的弹性:内存与磁盘的自动切换(效率高);
? 容错的弹性:数据丢失可以自动恢复;
? 计算的弹性:计算出错重试机制;
? 分片的弹性:可根据需要重新分片(其实就是分区)。
? 分布式:数据存储在大数据集群不同节点上
? 数据集:RDD 封装了计算逻辑,并不保存数据(数据计算完成之后,就进行销毁了)
? 数据抽象:RDD 是一个抽象类,需要子类具体实现
? 不可变:RDD 封装了计算逻辑,是不可以改变的,想要改变,只能产生新的 RDD,在新的 RDD 里面封装计算逻辑
? 可分区、并行计算


创建RDD代码实现:

    //创建环境
    val conf = new SparkConf().setMaster("local").setAppName("RDD_Memory")
    val sc = new SparkContext(conf)

    //创建内存RDD,使用seq及其子类
   // val  seq=  Seq[Int](1,2,3,4)
//    val rdd: RDD[Int] = sc.makeRDD(seq)
    
    //创建文件RDD
    /*** 
     *  textFile : 以 ’行‘ 为单位读取字符串,
        wholeTextFiles: 元组, 以文件为单位进行读取,  元组的第一个元素是文件名, 第二个是文件内容
     */
    //sc.textFile("datas")
    val rdd:RDD[Int] = sc.wholeTextFiles("datas")
    rdd.collect().foreach(println)


    sc.stop()

RDD的分区源码解析:

  def main(args: Array[String]): Unit = {

    //准备环境
    val conf = new SparkConf().setAppName("RDD_Partition").setMaster("local[*]")
    conf.set("spark.default.parallelism","3")
    val sc = new SparkContext(conf)

    /**
     *
     */
    //指定并行度 :  第一个参数:数据        第二个参数: 分区的数量, 默认为当前运行环境的机器的最大核数,也可以通过下面配置参数进行配置
    //     defaultParallelism:  scheduler.conf.getInt("spark.default.parallelism", totalCores)
    val rdd = sc.makeRDD(List(1, 2, 3, 4,5))

    rdd.saveAsTextFile("output")


    //关闭资源
    sc.stop()
  }

数据进行分区的分配规则(源码):
内存:

//调用positions方法 
  val array = seq.toArray // To prevent O(n^2) operations for List etc
        positions(array.length, numSlices).map { case (start, end) =>
            array.slice(start, end).toSeq
        }.toSeq
//    主要实现逻辑代码,每一个区的数据范围分配
def positions(length: Long, numSlices: Int): Iterator[(Int, Int)] = {
      (0 until numSlices).iterator.map { i =>
        val start = ((i * length) / numSlices).toInt
        val end = (((i + 1) * length) / numSlices).toInt
        (start, end)
      }
    }

	/**
	*大概逻辑:  如果数据量为5个, 分区的个数为2个
	 data.length =5
	 num =2   分区的个数
	
     分区号:0 ->  [0,2)
	 分区号:1 ->  [2,5)
	*/

文件:
使用的还是hadoop的读取流程分配, 可以指定最小分区
分区计算公式: 数据量字节数量/最小分区 =数据量

  • 如果这个数据量> 每个分区的大小的1.1倍的话,会重新再增加一个分区
  • 如果<= 1.1倍的话,则会把剩下的数据量,和最后一个分区进行聚合

源码:
分区的数量:
在这里插入图片描述

    math.min(defaultParallelism, 2)  //默认最小分区是2

文件具体的数据的分配例子展示:
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:08:54  更:2021-07-26 12:11:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/20 4:44:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码