Spark03:RDD编程接口

2024-09-01 08:18
文章标签 接口 编程 rdd spark03

本文主要是介绍Spark03:RDD编程接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

公众号:数据挖掘与机器学习笔记

Spark中提供了通用接口来抽象每个RDD,包括:

  • 分区信息:数据集的最小分片
  • 依赖关系:指向其父RDD
  • 函数:基于父RDD的计算方法
  • 划分策略和数据位置的元数据

image-20200902104853809

1.RDD分区

RDD的分区是一个逻辑概念,变换前后的新旧分区在物理上可能是同一块内存或存储,这种优化防止函数式不变性导致的内存需求无限扩张。在RDD操作中可以使用Partitions方法获取RDD划分的分区数,也可以设定分区数目。如果没有指定将使用默认值,而默认数值是该程序所分配到的CPU核数,如果是从HDFS文件创建,默认为文件的数据块数。

//默认两个分区
val part=sc.textFile("input/input1.txt")
println(part.partitions.size)//显式设置为4个partitions
val part=sc.textFile("input/input1.txt",minPartitions = 4)
println(part.partitions.size)

2. RDD首选位置(PreferredLocations)

Spark在形成任务的DAG时,会尽可能把计算分配到靠近数据的位置,减少数据网络传输。当RDD产生的时候存在首选位置,如HadoopRDD分区的首选位置就是HDFS块所在的节点;当RDD分区被缓存,则计算应该发送到缓存分区所在的节点进行,再不然回溯RDD的“血统”一直找到具有首选位置属性的父RDD,并据此决定子RDD的位置。

3.RDD依赖关系

Spark中RDD存在两种依赖:窄依赖(Narrow Dependencies)和宽依赖(Wide Dependencies)。

image-20200902111336831
  • 窄依赖:每个父RDD的分区至多被一个子RDD的分区使用
  • 宽依赖:多个子RDD的分区依赖一个父RDD的分区

区别:

  • 窄依赖允许在单个集群节点上流水线式执行,这个节点可以计算所有父级分区;宽依赖需要所有父RDD的数据可用,并且数据已经通过类MR操作Shuffle完成
  • 在窄依赖中,节点失败后的恢复更加高效。因为只有丢失的父级分区重新计算,并且这些丢失的父级分区可以并行地在不同节点上重新计算。而在宽依赖地继承关系中,单个节点地失败可能导致一个RDD的所有祖先RDD中的一些分区丢失,导致计算的重新执行。
val part = sc.textFile("input/input1.txt")val wordmap = part.flatMap(_.split(" ")).map(x => (x, 1))println(wordmap)//wordmap的依赖关系为OneToOneDependency,属于窄依赖wordmap.dependencies.foreach {dep =>println("dependency type:" + dep.getClass)println("dependency RDD:" + dep.rdd)println("dependency partitions:" + dep.rdd.partitions)println("dependency partitions size:" + dep.rdd.partitions.length)}val wordreduce = wordmap.reduceByKey(_ + _)println(wordreduce)wordreduce.dependencies.foreach{dep =>println("dependency type:" + dep.getClass)println("dependency RDD:" + dep.rdd)println("dependency partitions:" + dep.rdd.partitions)println("dependency partitions size:" + dep.rdd.partitions.length)}
image-20200903100355916

4.RDD分区计算

RDD的基本单位是partition,计算函数都是对迭代器进行复合,不需要保存每次计算的结果。如mapPartitions对每个分区内容作为整体来处理。

 val a = sc.parallelize(1 to 12, 3)a.mapPartitions {x =>var res = List[(Int, Int)]()var pre = x.next()while (x.hasNext) {val cur = x.next()res ::= (pre, cur)pre = cur}res.iterator}.foreach(t2 => print(t2))

image-20200903101735418

上述代码把每个分区中的元素和下一个元素组成一个Tuple,因为分区中最后一个元素没有下一个元素,所以没有(4,5)和(8,9)

5. RDD分区函数

分区的划分对于Shuffle类操作很关键,决定了该操作的父RDD和子RDD之间的依赖类型。在Spark中默认提供两种分区划分器:哈希分区划分器(HashPartitioner)和范围分区划分器(RangePartitioner),且Partitioner只存在于(K,V)类型的RDD中,对于非(K,V)类型的Partitioner值为None。

    val mapRDD = sc.textFile("input/input1.txt")println(mapRDD.partitioner)val groupRDD = mapRDD.map(x => (x, x)).groupByKey(new HashPartitioner(4))print(groupRDD.partitioner)

参考:

[1]《图解Spark:核心技术与案里实战》
在这里插入图片描述

这篇关于Spark03:RDD编程接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126406

相关文章

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决