RDD行动算子和血缘关系

news/2024/7/5 4:09:39

wordCount分布式运行

  1. 将wordCount进行打包上传,path使用args参数传参
  2. 启动hdfs和yarn
  3. 提交任务
[atguigu@hadoop102 spark-yarn]$ bin/spark-submit \
--class com.atguigu.spark.WordCount \
--master yarn \
./WordCount.jar \
/input \
集群模式:client/cluster
/output

注意: 如果集群模式选择为cluster,代码中的local[*]必须改为yarn,否则会报错。

foreach和collect

foreach底层是多线程打印的,出现的结果是分区间有序,但是整体无序,如果需要有序,只能将分区数设置为1,可以节省一些流量。
collect是将各个Executor计算的结果聚合在一起,输出结果是整体有序的。

行动算子

算子名称作用
collect按顺序从各个executor中收取数据
foreach直接在各个executor中操作数据
count统计元素个数
first返回0号分区的第一个值
take(int n)根据参数个数提取数据
countByKeyrdd需要是kv对集合,根据key统计个数,返回map结果
save以特定格式,一般为textFile, 保存数据

Spark之Kryo序列化

适合简单数据的序列化,比hadoop的序列化更加轻量。使用方法如下:

  1. 替换默认的序列化机.set(“spark.serializer”, “org.apache.spark.serializer.KryoSerializer”)
  2. 注册序列化对象,参数为数组类型new 类名[]{类1,类2}
  3. 后面使用conf对象创建sc即可
// 1.创建配置对象
        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore")
                // 替换默认的序列化机制
                .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
                // 注册需要使用kryo序列化的自定义类
                .registerKryoClasses(new Class[]{Class.forName("com.atguigu.bean.User")});

        // 2. 创建sparkContext
        JavaSparkContext sc = new JavaSparkContext(conf);

血缘关系

RDD.toDebugString().sout可以查看所有RDD的血缘关系。
打印的关系如下所示,其中(2)表示分区数量,±表示进行了shuffle,分区数量有所改变。如果进入了shuffle,计算时就会划分为多个阶段,即阶段数 = shuflle数量 +1。

常见的会走shffle的算子有reduceByKey和sortBy.

(2) ShuffledRDD[4] at reduceByKey at WordCount2.java:56 []
 +-(2) MapPartitionsRDD[3] at mapToPair at WordCount2.java:47 []
    |  MapPartitionsRDD[2] at flatMap at WordCount2.java:36 []
    |  input/1.txt MapPartitionsRDD[1] at textFile at WordCount2.java:33 []
    |  input/1.txt HadoopRDD[0] at textFile at WordCount2.java:33 []

宽依赖:分区数量改变了,即走了shuffle
窄依赖:分区数量和分区规则不变,不走shuffle.

注: join操作如果是分桶join时,不需要走shuffle,其他普通join时则需要打散分区进行shuffle操作。

Stage任务划分

  1. 提交任务后,画出DAG有向无环图
  2. 划分阶段,阶段划分的标志是是否有Shuffle.
  3. 划分Task,任务运行的最小基本单位,按照分区进行划分, 每一份分区一个Task.
  4. 任务交给Worker即executor去执行,executor中的线程数等于CPU个数,每个CPU可以去执行一个Task。
  5. job划分,每执行一个行动算子就是一个job。如果算子计算过程中有sortBy算子,会划分为两个job。因为sortBy底层调用了collect, save行动算子,进行数据的落盘。

注意: 多个stage之间是串行执行的,stage间的Task是并行执行的。故分区越多,并发度越高。并不是调用了带有分区器的算子就一定会走shuffle,需要分区数量和分区规则变化时才会。


http://lihuaxi.xjx100.cn/news/1704039.html

相关文章

Spring 解决获取请求参数的乱码问题

解决获取请求参数的乱码问题 解决获取请求参数的乱码问题&#xff0c;可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter&#xff0c;但是必须在web.xml中进行注册 <!--配置springMVC的编码过滤器--> <filter><filter-name>CharacterEncodingFilt…

LRC2024:Lightroom Classic 2024 (WinMac)

Lightroom Classic是一款由Adobe公司开发的数字图像处理和管理工具。它以强大的照片调整、处理、管理和分享功能而著称&#xff0c;被认为是专业摄影师的必备利器。 主要特性如下&#xff1a; 增强的校正工具&#xff1a;Lightroom Classic提供了丰富的照片校正工具&#xff0…

linux 查看内核版本 发行版本

Linux 查看当前系统的内核与发行版本信息_linux内核版本怎么看-CSDN博客

高项.项目管理经验、理念、教训

一、项目管理的一些经验 管项目重在管理&#xff0c;而不是死抠无关紧要的技术细节等等。 真正的团队一定是11>2&#xff0c;要把重心放在凝聚团队协力&#xff0c;共同完成目标上。 项目的推进永远都是不确定性的&#xff0c;真正考验项目经理的是不断出现的需求变更和状…

内存中的计量单位

二进制位 数据传输大多是以“位”&#xff08;bit&#xff0c;又名“比特”&#xff09;为单位&#xff0c;一个位就代表一个 0 或者 1&#xff08;即二进制&#xff09; 位是数据存储的最小单位 电流通过机器设备时候必然会产生电压&#xff0c;人们设定了规则&#xff0c;取…

项目管理实战总结(一)-沟通路径问题

前言 那是2021年春节之后&#xff0c;我决定主动申请参与到这个项目&#xff0c;是知道工作强度大、难度大的情况的。有很多的同事是想躲&#xff0c;而我是明知山有虎偏向虎山行。我确定&#xff0c;通过这个项目&#xff0c;一定有我需要的东西。现在项目已经完成了终验专家…

JAVA实现Jfilechooser搜索功能

JAVA实现Jfilechooser搜索功能 背景介绍需求描述思路和方法Java代码实现和注释相关知识点介绍视频演示结语 背景介绍 Java是一种面向对象的编程语言&#xff0c;广泛应用于各种应用程序开发中。文件搜索是我们在日常工作或者学习中经常会遇到的需求&#xff0c;比如查找某个文…

Node介绍(nvm安装和npm常用命令)

文章目录 Node 介绍为什么要学习 Node.jsNode.js 是什么Node能做什么 nvm常用的 nvm 命令npm 快捷键npm 常用命令切换 npm 下包镜像源常用命令 Node 介绍 为什么要学习 Node.js 企业需求 具有服务端开发经验更改front-endback-end全栈开发工程师基本的网站开发能力 服务端前端…