Spark常见的可以优化的点

Shuffle 复用

在这里插入图片描述

# 1.以下操作会复用的shuffle结果,只会读一遍数据源
val rdd1 = sc.textFile("hdfs://zjyprc-hadoop/tmp/hive-site.xml").flatMap(_.split(" ")).map(x => (x,1)).reduceByKey(_ + _).filter(_._2 > 1)
rdd1.count()
rdd1.filter(_._2 > 10).count()# 2.以下操作每次需要重新执行整个操作,会读两遍数据源
sc.textFile("hdfs://zjyprc-hadoop/tmp/hive-site.xml").flatMap(_.split(" ")).map(x => (x,1)).reduceByKey(_ + _).filter(_._2 > 1).count()sc.textFile("hdfs://zjyprc-hadoop/tmp/hive-site.xml").flatMap(_.split(" ")).map(x => (x,1)).reduceByKey(_ + _).filter(_._2 > 1).filter(_._2 > 10).count()

在第一个示例中,rdd1.count() 触发了计算,并且结果被存储,后续的 filter 和 count 操作都是在这个已经计算好的结果上进行的。而在第二个示例中,每次 count() 都是一个新的触发点,导致每次都需要重新计算。

并行度设置

shuffle并行度

如下图所示,作业中可能不止一个Job,shuffle数据只有几十mb,但是并行度设置了2000:
在这里插入图片描述

设置2000可能只是为了让作业中的一个Job的瓶颈更小:
在这里插入图片描述

rdd程序其实控制能力极强的,常见的瓶颈算子都可以直接单独设置并行度的。
例如上述图中的算子可以由 rdd.reduceByKey(keyName) 改为 rdd.reduceByKey(keyName,3000)

scan file并行度

如果从hadoop输入的数据在后续的stage计算可能出现了内存瓶颈(gc时间比较长)时,可以考虑减少数据每个分区的大小,提高并行度:

  • DataSource读法,特指使用SparkSession.read这种,默认128:
    spark.files.maxPartitionBytes=268435456

  • 使用rdd直接读的,例如HDFSIO.thriftSequence、直接使用rdd hadoop api等,默认256(注意这个没有合并小文件功能):
    spark.hadoop.mapred.max.split.size=268435456

REPARTITION 之后JOIN

在这里插入图片描述

  • 首先repartition是用来做什么的?
    改变下游stage的并行度。
  • 什么时候改变下游并行度是有用的?
    • 下游是一个迭代计算,输入数据很少但是可能迭代所需资源很大,那么多并行度可以上每个task的输入数据变少。
    • 输出文件后通过改变并行度,控制小文件。
  • 为什么说上面的repartition基本无效?
    因为repartition之后,没有任何操作,就进行shuffle,将数据shuffle输入给下游的join了。join需要根据join的key进行hash分布到不同的join的task中,上游这个repartition基本没任何意义了。

SQL中可能造成性能瓶颈的算子

Get json object

尤其是连续对一个json解析多个字段,如下图,效率很低:
在这里插入图片描述
优化方式:
批量解析用json_tuple替换get_json_object,通常是更加高效的
问题原因:

--- t1 构建的测试数据
with t1 as (SELECT  propertiesFROM VALUES ('{"a":1, "b":2, "c":3}') tab(properties)
)
--- 实际执行properties会被解析3次,效率较低
--- 期望只解析一次,复用解析后的结果,得到a,b,  c
select
properties,
get_json_object(properties, '$.a') as a,
get_json_object(properties, '$.b') as b,
get_json_object(properties, '$.c') as c
from t1

优化方法:

--- t1 构建的测试数据
with t1 as (SELECT  propertiesFROM VALUES ('{"a":1, "b":2, "c":3}') tab (properties)
)
--- 写法1(推荐)
--- 1.使用json_tuple指定要解析出来的字段 'a', 'b', 'c'
--- 2.将'a', 'b', 'c'中的'替换为`,作为别名
select  properties,  json_tuple(properties, 'a', 'b', 'c') as (`a`,`b`,`c`)
from t1--- 写法2--- 1.使用lateral view json_tuple指定要解析出来的字段 'a', 'b', 'c'--- 2.将'a', 'b', 'c'中的'替换为`,作为别名--- 3.直接指定select tb.*
--- select  properties, tb.*
--- from t1
--- lateral view json_tuple(properties, 'a', 'b', 'c') tb as `a`,`b`,`c`

array_union

这个算子会对array的对象去重,涉及到排序等操作,可能某些array比较大就会非常慢。

count(distinct()) group by 替换 size(collect_set() partition by)

窗口函数中collect_set是一种执行很慢的操作。

重复缓存数据

在算子内部或者分区内部不断重复缓存元素,导致内存占用

rdd.map(ele => {val list = ele.getListval set = list.toSetval result = list.map( *** )
})
rdd.foreachPartition(partition => {val result = new HashMap<String, String>while(partition.hashNext) {val next = partition.nextresult.put(next.key, next.value)}dealWithResult(result)
})

Cache 不合理

stage0:
在这里插入图片描述
stage3:
在这里插入图片描述
多次触发读相同的数据源,并且在同一个pipeline上使用了多次cache,但是并没有用上。

对比stage0和stage3, 在InstancePushMergeFeedProfileLabel2FeedImpressionWithInfoInFeed类第148行之前的逻辑是一致的。缓存应该对InstancePushMergeFeedProfileLabel2FeedImpressionWithInfoInFeed 148行的filter结果做缓存,后续使用缓存结果,避免重复读数据源。

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

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

相关文章

华为od-C卷200分题目2 - 找城市

华为od-C卷200分题目2 - 找城市 题目描述 一个城市规划问题&#xff0c;一个地图有很多城市&#xff0c;两个城市之间只有一种路径&#xff0c;切断通往一 个城市i的所有路径之后&#xff0c;其他的城市形成了独立的城市群&#xff0c;这些城市群里最大的城 市数量&#xff0…

JavaFX 场景

JavaFX场景对象是 JavaFX 场景图的根。换句话说&#xff0c;JavaFX 场景包含其中的所有可视 JavaFX GUI 组件。JavaFX 场景由类表示 javafx.scene.Scene。必须在JavaFX StageScene上设置对象 才能可见。在本 JavaFX教程中&#xff0c;我将向您展示如何创建 对象并向其添加 GUI …

什么是中断?STM32F407中断处理

什么是中断&#xff1f; 中断&#xff08;Interrupt&#xff09;是一种处理器处理异步事件的方法。当某个事件&#xff08;如外部设备的信号、定时器溢出等&#xff09;发生时&#xff0c;处理器可以暂停当前正在执行的任务&#xff0c;去处理这个事件&#xff0c;然后再返回继…

会声会影色彩校正在哪里 会声会影色彩素材栏在哪 会声会影中文免费版下载

会声会影是一款功能强大的视频编辑软件&#xff0c;它可以帮助用户轻松地编辑和制作视频。在进行视频编辑时&#xff0c;色彩校正是一个重要的步骤&#xff0c;它可以调整视频的色调、亮度和对比度等参数&#xff0c;使视频更加生动和鲜明。在会声会影中&#xff0c;色彩校正功…

使用shell脚本在Linux中管理Java应用程序

文章目录 前言一、目录结构二、脚本实现1. 脚本内容2. 使用说明2.1 配置脚本2.2 脚本部署2.3 操作你的Java应用 总结 前言 在日常开发和运维工作中&#xff0c;管理基于Java的应用程序是一项基础且频繁的任务。本文将通过一个示例脚本&#xff0c;展示如何利用Shell脚本简化这…

【Python/Pytorch - 网络模型】-- TV Loss损失函数

文章目录 文章目录 00 写在前面01 基于Pytorch版本的TV Loss代码02 论文下载 00 写在前面 在医学图像重建过程中&#xff0c;经常在代价方程中加入TV 正则项&#xff0c;该正则项作为去噪项&#xff0c;对于重建可以起到很大帮助作用。但是对于一些纹理细节要求较高的任务&am…

期权无风险套利(Risk-Free Arbitrage)举例以及期权无套利定价公式

期权市场的无风险套利 中文版 期权市场中的套利实例 为了清楚地说明&#xff0c;让我们通过一个现实的例子来展示套利。 期权市场中的套利实例 假设市场上有以下价格&#xff1a; 标的股票价格&#xff1a;100美元欧式看涨期权&#xff08;行权价100美元&#xff0c;3个月…

MySQL 保姆级教程(六):用通配符进行过滤

第 8 章 用通配符进行过滤 8.1 LIKE 操作符 通配符: 用来匹配值的一部分的特殊字符 搜索模式: 由字面值、通配符或两者组合构成的搜索条件 为了在搜索子句中使用通配符&#xff0c;必须使用 LIKE 操作符 8.1.1 百分号&#xff08;%&#xff09;通配符 输入: SELECT server_…

MongoDB~分片数据存储Chunk;其迁移原理、影响,以及避免手段

分片数据存储&#xff1a;Chunk存储 Chunk&#xff08;块&#xff09; 是 MongoDB 分片集群的一个核心概念&#xff0c;其本质上就是由一组 Document 组成的逻辑数据单元。每个 Chunk 包含一定范围片键的数据&#xff0c;互不相交且并集为全部数据。 分片集群不会记录每条数据…

Python 基础:类

目录 一、类的概念二、定义类三、创建对象并进行访问四、修改属性的值方法一&#xff1a;句点表示法直接访问并修改方法二&#xff1a;通过方法进行修改 五、继承继承父类属性和方法重写父类方法 六、将实例用作属性七、导入类导入单个类从一个模块中导入多个类导入整个模块导入…

C语言的基本输入输出函数+构造类型数据——数组

C语言的基本输入输出函数 1. 字符输入输出函数 getchar()、putchar() getchar()&#xff1a;从标准输入&#xff08;通常是键盘&#xff09;读取一个字符&#xff0c;并返回其ASCII值。putchar()&#xff1a;将指定的字符&#xff08;由其ASCII值表示&#xff09;写入标准输出…

Java Stream流 takeWhile,dropWhile

一. takeWhile 顺序返回符合条件的值,一旦条件不符合立即停止继续判断在元素5之后,虽然还有 < 5 的数据,但是不会作为条件进行判断 // 创建一个Stream流 Stream<Integer> streamNum1 Stream.of(2, 3, 4, 5, 6, 1, 1, 3);List<Integer> numList1 streamNum1.…

10_Transformer预热---注意力机制(Attention)

1.1 什么是注意力机制(attention) 注意力机制&#xff08;Attention Mechanism&#xff09;是一种在神经网络中用于增强模型处理特定输入特征的能力的技术。它最早被应用于自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;特别是在机器翻译中&#xff0c;如Google的…

python14 字典类型

字典类型 键值对方式&#xff0c;可变数据类型&#xff0c;所以有增删改功能 声明方式1 {} 大括号&#xff0c;示例 d {key1 : value1, key2 : value2, key3 : value3 ....} 声明方式2 使用内置函数 dict() 创建1)通过映射函数创建字典zip(list1,list2) 继承了序列的所有操作 …

Linux基础I/O之文件描述符fd 重定向(上)

目录 一、预备知识 二、C语言中的文件接口 三、系统调用中的文件接口 一、预备知识 首先我们要明确的一个观点是 --- 文件 内容 属性。而且我们之前也还将过一个概念&#xff0c;那就是Linux下一切皆文件。 内容是数据&#xff0c;属性也是数据 --- 那么也就是说我…

使用STL算法函数有效提升STL列表的搜索速度(附源码)

STL(Standard Templete Library)活动模板库已被广泛地应用于各种C++程序的开发中,STL中vector、list、map等列表极大地方便了我们日常的开发,不再需要我们去实现链表等数据结构,使用这些列表能基本能解决开发过程中遇到的各种问题。网上关于STL的文章比较多,今天我们就来…

代码随想录——组合总和Ⅱ(Leetcode 40)需要回顾

题目链接 回溯 本题的难点在于&#xff1a;集合&#xff08;数组candidates&#xff09;有重复元素&#xff0c;但还不能有重复的组合。 思想&#xff1a;元素在同一个组合内是可以重复的&#xff0c;怎么重复都没事&#xff0c;但两个组合不能相同。所以要去重的是同一树…

统计套利—配对交易策略

配对交易是一种基于统计学的交易策略&#xff0c;通过两只股票的差价来获取收益&#xff0c;因而与很多策略不同&#xff0c;它是一种中性策略&#xff0c;理论上可以做到和大盘走势完全无关。 配对交易的基本原理是&#xff0c;两个相似公司的股票&#xff0c;其股价走势虽然在…

SpringSecurity(JWT、SecurityConfig、Redis)

可能会报错Last unit does not have enough valid bits 把jwtUtils的KEY改成偶数位 主要用于校验&#xff0c;授权 导入依赖 <dependency) <groupId>org.springframework. boot</groupId> <artifactId>spring-boot-starter-security</artifactId) <…

[Linux] TCP协议介绍(3): TCP协议的“四次挥手“过程、状态分析...

TCP协议是面向连接的 上一篇文章简单分析了TCP通信非常重要的建立连接的"三次握手"的过程 本篇文章来分析TCP通信中同样非常重要的断开连接的"四次挥手"的过程 TCP的"四次挥手" TCP协议建立连接 需要"三次握手". "三次挥手&q…