Spark 中的分桶分化

Spark 中的分桶分化

Bucketing是 Spark 和 Hive 中用于优化任务性能的一种技术。在分桶桶(集群列)中确定数据分区并防止数据混洗。根据一个或多个分桶列的值,将数据分配给预定义数量的桶。

分桶有两个主要好处:

  • 改进的查询性能:在连接时,我们可以在相同的分桶列上明确指定桶的数量。由于每个存储桶包含相同大小的数据,因此映射端连接的性能优于存储桶表上的非存储桶表。在 map-side join 中,左侧表存储桶将准确知道右侧存储桶包含的数据集,以便以结构良好的格式执行表联接。
  • 改进的采样:数据已经被分成更小的块,因此采样得到了改进。
  • 加快连接操作的性能与尽量少的性能消耗:连接操作只需要定位各个桶,非整个数据集

何时使用桶列

  • 表大小很大(> 200G)。
  • 该表具有高基数列,这些列经常用作过滤和/或连接键。
  • 中等大小的表,但主要用于连接一个巨大的桶化表,桶化它仍然是有益的
  • 排序合并连接(没有存储桶)由于随机播放而不是由于数据倾斜而变慢

如何配置存储桶列

  • 选择高基数列作为桶列。
  • 尽量避免数据倾斜。
  • 至少 500 个桶(因为小桶数会导致并行执行不佳)。
  • 排序桶是可选的,但强烈推荐。

如何在 Spark 中创建数据桶

  • 下面是在 SparkAPI 中创建存储桶的示例。bucketBy是在 spark 中创建存储桶的函数。我们需要将桶的信息保存在某处,所以这里需要使用saveAsTable来保存桶表的元数据信息。

n 是要创建的桶数

df.write.mode(“save_mode”)
.option(“path”, “s3 path/hdfs path”) \
*.bucketBy(n, ‘col1’, ‘col2’…) *
*.sortBy(‘col1’, ’ col2’) *
.saveAsTable(‘table_name’, format=‘parquet’)
df = spark.table(‘table_name’)

CREATE TABLE
  `temp`.`dm_log_app_activityinfo_user` (`log_id` STRING, `mid` STRING,
  `app_name` STRING, `start_time` STRING, `user_name` STRING, `is_new_visitor`
  INT, `user_class` STRING, `user_group` STRING, `user_id` STRING, `user_label`
  STRING, `session_id` STRING, `dt` STRING)
  USING orc
  OPTIONS (
  `serialization.format` '1'
  )
  PARTITIONED BY (dt)
  CLUSTERED BY (log_id)
  SORTED BY (log_id)
  INTO 4000 BUCKETS;
  • 在上面的示例中,我们使用了 bucketBy 和 sortBy,因为在某些情况下我们有多个连接键,并且希望将整数键放在 bucketBy 中,将字符串键放在 sortBy 中。当我们做数据桶时,sortBy 是可选的。
  • 可以根据数据大小和我们对数据运行的查询来决定存储桶大小的数量。通常,每个存储桶可能更喜欢 100 MB 到 200 MB。
  • 存储桶表将使用以下命名约定将表保存在路径中。

如何在 Spark 上启用分桶?

默认情况下启用分桶。
或者,您可以在 Spark Shell 或属性文件中设置以下属性。

设置 spark.sql.sources.bucketing.enabled=true

Spark 中对表进行分桶的优点

  • 优化表。
  • 使用预洗牌分桶表时优化联接。
  • 当您在分桶列上定义谓词时,启用更有效的查询。
  • 优化了对表数据的访问。_在桶列上使用 WHERE 条件时,您将最小化给定查询的表扫描。
  • 将数据均匀分布在不同的存储桶中,从而实现对表数据的最佳访问。

转换列表

以下转换将受益于分桶:

  • 加入
  • 清楚的
  • 通过…分组
  • 减少

Spark Bucket 的限制

Spark Bucketing 有其自身的局限性,我们在创建分桶表以及将它们连接在一起时需要非常小心。

为了优化连接并在 Spark 中使用分桶,我们需要确保以下几点:

  1. 两个表都使用相同数量的存储桶进行存储 如果加入表中的桶号不同,则不会应用预洗牌。
  2. 两个表都存储在同一列上以进行连接 由于数据是根据给定的分桶列进行分区的,如果我们不使用同一列进行连接,那么您就没有使用分桶,它会影响性能。

Spark 分桶与 Hive 分桶有何不同?

在 Hive 中,我们需要根据需要创建文件数量的 reducer。

而在 Spark 分桶中,我们没有减速器。因此,它最终会根据任务的数量创建 n 个文件。

分桶表实践

将增量大表与存量历史大表(rows≈百亿)的full join去重过程优化,通过历史表分桶方式避免 TB级别表的shuffle过程,相同过程中 图2修改成了历史数据分桶表 避免自身exchange过程,
相同task数测试性能将200分钟压缩至50分钟左右

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【存储】cosbench对象存储测试工具

目录 简略说明 原理 用法 详细说明 简介 用法 一 安装 二 简单验证 三 编写配置文件 四 提交配置文件下IO 五 测试结果查看 结果概览 查看详情 每秒钟的io情况查看 工作负载配置 参数配置(controller和driver) 查看错误的方法和错误记录 查看错误的方法 …

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息(查看其他题解发现显示的是:我有一个数据库,但里面什么也没有~ 不信你找) 但也不是明显信息,通过dirsearch扫描得到robots.txt,然后在里面得…

123.Mit6.S081-实验1-Xv6 and Unix utilities

今天我们来进行Mit6.S081实验一的内容。 实验任务 一、启动xv6(难度:Easy) 获取实验室的xv6源代码并切换到util分支。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 Cloning into xv6-labs-2020... ... $ cd xv6-labs-2020 $ git checkout util Branch util …

xshell的基本命令

1. 创建虚拟环境: conda create -n 虚拟环境名称 python3.7 2. 激活进入虚拟环境 conda activate 虚拟环境名称 3. 退出虚拟环境 conda deactivate 4. 查看所有虚拟环境 conda env list 5. 卸载环境 conda remove -n 虚拟环境名称 --all 6. 执行py文件: python3.py文…

微软刚开源就删库的WizardLM-2:MT-Bench 榜单评测超越GPT-4,7B追平Qwen1.5-32B

前言 微软最近发布的WizardLM-2大型语言模型因其先进的技术规格和短暂的开源后突然撤回,引起了科技界的广泛关注。WizardLM-2包括三个不同规模的模型,分别是8x22B、70B和7B,均展现了在多语言处理、复杂对话、推理和代理任务上的卓越能力。 H…

如何用PHP语言实现远程语音播报

如何用PHP语言实现远程语音播报呢? 本文描述了使用PHP语言调用HTTP接口,实现语音播报。通过发送文本信息,来实现远程语音播报、语音提醒、语音警报等。 可选用产品:可根据实际场景需求,选择对应的规格 序号设备名称1…

IDEA代码重构

重构 重构的目的: 提高代码的可读性、可维护性、可扩展性和性能。 重命名元素 重命名类 当我们进行重命名操作的时候可以看到第六行存在一个R(rename),点击后就会弹出所偶有引用,这样可以避免我们在修改后存在遗漏引用处未修改。 我们可以通过…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」:2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 操作系统有4个安全目标,也就是说想要保证操作系统的安全,就必须实现这4个需求: 标识系统…

YoloV9改进策略:下采样改进|自研下采样模块(独家改进)|疯狂涨点|附结构图

文章目录 摘要自研下采样模块及其变种第一种改进方法 YoloV9官方测试结果改进方法测试结果总结 摘要 本文介绍我自研的下采样模块。本次改进的下采样模块是一种通用的改进方法,你可以用分类任务的主干网络中,也可以用在分割和超分的任务中。已经有粉丝用…

单细胞+RIP-seq项目文章| Cell ReportshnRNPU蛋白在小鼠精原干细胞池建立的关键作用

精原干细胞(SSCs)是负责精子发生的干细胞,具有自我更新和分化产生功能性精子的能力。SSCs的持续再生对于维持雄性生育力至关重要。然而,SSC池的发育起源尚不清楚。在哺乳动物中,SSCs源自名为 prospermatogonia&#xf…

端口被占用的解决方案汇总

端口被占用的解决方案汇总 【一】windows系统端口被占用【二】Linux系统端口被占用【三】Linux的ps命令查找(1)ps命令常用的方式有三种(2)ps -ef |grep 8080 【一】windows系统端口被占用 (1)键盘上按住Wi…

Ubuntu-18.04本地化部署Rustdesk服务器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、配置防火墙二、安装三大件1.下载三大件2.安装三大件 三、安装客户端1.下载客户端1.Windows2.Linux 四、配置客户端连接服务器五、总结 前言 如果你是想数据…

JS-47-Node.js06-fs模块-读写文件

Node.js内置的fs模块就是文件系统模块,负责读写文件。 和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法。 一、回顾:异步方法VS同步方法 1-1、异步方法 因为JavaScript的单线程模型,执行IO操作时&#xff…

.gitignore语法及配置问题

语法及配置 前言.gitignore语法Git 忽略规则优先级gitignore规则不生效Java项目中常用的.gitignore文件c项目中常用的.gitignore注意事项 前言 在工程中,并不是所有文件都需要保存到版本库中,例如“target”目录及目录下的文件就可以忽略。在Git工作区的…

AI视频分析技术的常用开源模型及TSINGSEE青犀AI视频识别分析能力介绍

AI视频分析技术是指利用人工智能技术来对视频数据进行分析和处理的技术。开源模型是指可以免费获取和使用的代码模型,可以帮助开发人员快速构建和部署AI视频分析应用程序。 以下是一些业内常用的用于AI视频分析技术的开源模型: OpenCV:Open…

MySQL—一条查询SQL语句的完整执行流程

MySQL—一条查询SQL语句的完整执行流程 表结构和数据如下: 我们分析的sql语句如下: select tb_id,tb_name,tb_address from tb_user where tb_id 66;大体来说,MySQL可以分为Server层和存储引擎层两部分: Server层 包括:连接器、查询缓存、…

OpenCV-基于阴影勾勒的图纸清晰度增强算法

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 大家在工作和学习中,无论是写报告还是论文,经常有截图的需求,比如图表、图纸等&…

【PCL】教程global_hypothesis_verification 通过验证模型假设来实现 3D 对象识别与位姿估计...

测试程序1 milk.pcd milk_cartoon_all_small_clorox.pcd 终端输出1: Model total points: 12575; Selected Keypoints: 193 Scene total points: 307200; Selected Keypoints: 7739 [pcl::SHOTEstimation::computeFeature] The local reference frame is not valid!…

若依集成mybatisplus报错找不到xml

引用:https://blog.csdn.net/qq_65080131/article/details/136677276 MybatisPlusAutoConfiguration中可以知道,系统会自动配置SqlSessionFactory,,但是,当你有自定义的SqlSessionFactory,,就会…

Spark-机器学习(4)回归学习之逻辑回归

在之前的文章中,我们来学习我们回归中的线性回归,了解了它的算法,知道了它的用法,并带来了简单案例。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请…