自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 Spark 中 distribute by、sort by、cluster by 深度解析

管“数据分到哪”(Shuffle 分区),sort by管“分区内怎么排”(局部排序),cluster by是二者的简化版(同字段);实现本质:三者均依赖 Spark Shuffle 机制,差异仅在“是否排序”和“字段是否相同”;数仓实操核心:预分区/控文件数:用;分区内有序:用;同字段简化写法:用cluster by;大数据排序:坚决不用order by,用并行优化。结合你的直播数仓场景,最常用的组合是。

2025-11-10 14:26:15 730

原创 Spark的persist和cache

cache()是persist()的简化版,仅支持内存存储;persist()更灵活,支持多存储级别;核心作用:避免重复计算,提升复用数据集的任务性能;数仓实操建议:维表用cache(),中间大数据集用,关键任务加副本(_2),用完及时。结合你的直播数仓场景,比如“清洗后的点击数据需用于聚合、关联、写入多个表”,直接用持久化,既能避免重复计算,又能防止 OOM,是性价比最高的选择。

2025-11-10 14:15:06 959

原创 Spark的Shuffle过程

Spark 的 Shuffle 是分布式计算中数据重分区的核心过程,目的是将不同 Executor 上的数据按照一定规则(通常是 Key 的哈希值)重新分配,确保相同 Key 的数据汇聚到同一节点进行聚合、连接等操作。例子:负责分区 0 的 Reduce Task 会得知:需要从 Executor 1 的 .data 文件中读取分区 0 的数据,以及从 Executor 2 的 .data 文件中读取分区 0 的数据。先按分区 ID 排序(确保同一分区的数据连续),再按 Key 排序(方便后续合并)。

2025-10-20 15:19:46 939

原创 Spark Shuffle 分区与 AQE 优化

Shuffle 分区:通过哈希映射实现数据重分布,核心参数决定 Shuffle 前的初始分区数,属于“静态预设”。AQE 优化:在 Shuffle 中期动态调整分区(合并/拆分),基于实际数据统计优化执行计划,属于“动态修正”。协同价值:二者结合既保证了 Shuffle 过程的基础稳定性,又解决了固定参数难以适配复杂数据场景的问题,是 Spark 高性能处理大规模数据的关键。

2025-10-17 14:50:14 1009

原创 Spark的宽依赖与窄依赖

窄依赖:父RDD的每个分区只被子RDD的一个分区所使用。1个子RDD的分区对应于1个父RDD的分区(如map、filter、union等算子);1个子RDD的分区对应于N个父RDD的分区(如co-partioned join,协同划分的join)。宽依赖:父RDD的每个分区都可能被多个子RDD分区所使用。1个父RDD分区对应非全部多个子RDD分区(如groupByKey、reduceByKey、sortByKey);1个父RDD分区对应所有子RDD分区(如未经协同划分的join)。

2025-10-15 15:56:59 980

原创 Spark核心数据(RDD、DataFrame 和 Dataset)

定义:Spark 最基础的分布式数据抽象,是不可变的、分区的对象集合。核心特性无 schema:数据以对象(如 Python 元组、Java 对象)形式存在,不预设字段结构。弹性容错:通过血缘关系(Lineage)记录依赖,某分区数据丢失可通过父 RDD 重算恢复。分布式并行:数据自动分区,支持跨节点并行计算。函数式操作:通过mapfilter等转换操作处理数据,不直接修改原 RDD。维度RDDDataFrame数据结构无 schema(对象集合)有 schema(二维表)

2025-10-15 14:26:06 815

原创 大数据场景下小文件问题及优化方案

在Hadoop/Spark/Hive生态中,小文件(通常指远小于HDFS块大小的文件)会导致NameNode内存占用过高、任务调度压力增大、计算效率下降等问题。本文围绕“小文件产生原因”“Shuffle合并原理(含distribute by实践)”“全链路优化方案”三大核心,系统整理相关知识与实践参数。

2025-10-13 16:33:00 365

原创 Spark 中 `count(distinct)` 不同场景的执行计划解析与对比

在 Spark SQL 中, 的执行逻辑会根据是否存在其他聚合函数、是否有分组()、 数量等场景动态调整,核心差异体现在 Shuffle 策略、聚合协同方式、中间数据处理 三个维度。以下结合三个典型场景的执行计划,完整解析其运行机制与优化逻辑。在分析前,先明确执行计划中高频节点的含义,为后续解析奠定基础:执行逻辑(2次 Shuffle,先去重再计数)1. 第一次 Shuffle:按 分区(全局去重)目的:通过 分组,确保相同 的数据进入同一个任务,每个 只保留一条记录(实现全局去重)。对应

2025-09-30 11:28:33 1119

原创 Spark任务运行流程

组件核心职责客户端(Client)提交任务,传递参数和应用代码管理集群资源(如 YARN RM 分配 Container),协调 Driver 和 Executor 启动Driver(AM)解析代码生成 DAG,划分 Stage,分配 Task,监控任务执行和容错Executor执行 Task,处理数据转换和 Shuffle,管理内存和线程池外部存储(HDFS 等)存储输入数据和输出结果,支持分布式读写这个流程中,

2025-09-29 14:11:15 840

原创 RDD 核心特性、Spark 容错体系与实例解析

RDD是基础:其“逻辑数据集+依赖链+分区计算”是容错的底层逻辑,决定“数据如何精准重算”;临时数据是关键:未持久化数据“用完无用则释放”,持久化数据“主动保留”,直接影响重算范围;容错是体系:RDD解决“数据恢复”,Driver/Executor/Yarn解决“进程/节点故障”,两者结合确保分布式环境下任务稳定运行——核心原则是“能复用则复用,需重算则精准重算,不做无意义的全量重来”。

2025-09-29 14:05:56 878

原创 Spark算子

分析 SQL 执行计划,优化低效操作(如将改为定位性能问题(如Exchange算子耗时过长可能是 Shuffle 数据量过大);设计更高效的数据处理逻辑(如用替代处理小表关联)。实际调试中,可结合算子的输入输出数据量、耗时、分区数等信息,针对性优化代码。

2025-09-25 11:31:16 711

原创 Spark中的各类关联

优先用 Broadcast Join:小表+大表+等值条件(性能最优)。其次用 Shuffle Hash Join:两表较大但内存可容纳+等值条件。最后用 Sort Merge Join:超大表+等值条件(内存不足时)。被迫用 Nested Loop Join:非等值条件或复杂逻辑+至少一表极小。实际开发中,应尽量避免非等值条件,通过表大小和关联字段设计引导 Spark 选择高效策略(如广播小表、避免笛卡尔积)。

2025-09-25 11:05:59 1032

原创 数据湖(Data Lake)

一个集中式存储库,能够以原始格式(如原始日志、JSON、CSV、Parquet、图片、视频等)存储海量的结构化、半结构化和非结构化数据,同时支持通过多样化的计算引擎(如Spark、Flink、Presto)进行数据处理、分析和挖掘,最终服务于报表、机器学习、业务决策等场景。数据湖的核心价值是“打破数据孤岛,释放全类型数据的价值”——通过原始存储、灵活计算、分层治理,让“所有数据”都能被高效利用。

2025-09-25 10:49:29 1036

原创 常见排序算法及Python实现

对于小规模数据,简单排序算法(冒泡、选择、插入)可能更高效对于大规模数据,应选择O(n log n)复杂度的算法(快速、归并、堆排序)快速排序在实践中通常表现最佳,但最坏情况性能较差归并排序提供稳定的O(n log n)性能,但需要额外空间堆排序不需要额外空间,但实现相对复杂且不稳定在实际开发中,Python内置的sorted()函数使用的是Timsort算法(归并排序和插入排序的混合体),在大多数情况下性能都非常优秀。

2025-09-24 14:24:55 738

原创 Parquet、ORC、Hive表、Iceberg

是“数据的物理载体”,负责“怎么高效存”;Hive表/Iceberg是“数据的逻辑抽象”,负责“怎么管表(元数据、事务、分区)”;实际使用中,通常是“创建Hive表/Iceberg表,指定底层用Parquet/ORC存储”,再基于表结构进行查询分析,形成“表抽象→文件格式→分布式存储”的完整数据链路。

2025-09-24 14:24:37 615

原创 常见OLAP引擎介绍与对比

开源低成本:ClickHouse/Presto/Doris(社区活跃,部署简单)。商业高可靠性:SAP HANA(适合大型企业核心业务)。追求单表性能,选ClickHouse;追求跨源灵活查询,选Presto/Trino;追求固定报表速度,选Kylin;追求湖仓一体,选Iceberg+Trino;追求国产企业级适配,选Doris。实际落地时,通常会结合多种引擎(如“ClickHouse做日志分析 + Presto做跨源关联 + Kylin做固定报表”),形成互补的OLAP分析体系。

2025-09-24 14:24:23 985

原创 CUBE、ROLLUP、GROUPING SETS 与 GROUPING 函数详解

允许手动指定需要汇总的维度组合,灵活性最高。

2025-09-24 14:24:00 897

原创 数仓数据能力评估&架构设计

先明边界:现有业务评估数据能力,新业务调研需求,避免“无的放矢”;再定核心:用“业务过程→粒度→维度→事实”四步法锚定模型,确保贴合业务;最后落地:按分层架构实现,平衡质量(校验)、效率(预聚合/索引)、成本(归档/清理)。整个过程核心是“以业务为中心”,而非技术驱动——模型服务于分析需求,架构支撑业务长期发展。

2025-09-24 14:23:46 734

原创 Doris调优

分桶与索引:Doris 分桶仅基于哈希,优先用数值型分桶列;索引需按查询场景选择(等值用哈希、范围用排序键、低基数用 Bitmap),避免盲目建索引。字段选择:int/bigint/DATE 在存储、计算、索引适配性上全面优于 string,是分桶、排序键、索引的首选类型。调优平衡:所有调优手段均有“收益”与“成本”,需结合业务频率(如高频查询用 Rollup)、数据量(如大表用分区+分桶)动态选择,最终实现“存储省、查询快、维护易”的目标。

2025-09-23 16:44:49 780

原创 数仓三要素

数据质量:通过“全链路校验+自动化监控”实现主动防控,核心是6大维度。效率与成本:以“模型优化+预计算+存储分级”为核心,提升效率的同时减少资源消耗。三者平衡:质量是底线,效率是体验,成本是保障,需通过标准化流程和技术工具协同推进。

2025-09-23 16:36:36 942

原创 Hive 与 Spark 分桶技术对比&分桶分区对比

分桶通过哈希函数将数据分散到固定数量的桶中,实现数据均匀分布。为预定义的桶数量,同一桶内数据具有相同或相近的哈希值。

2025-09-23 16:30:17 361

原创 全量表、增量表、拉链表、分区快照表&事实表

表类型核心逻辑数据存储特点全量表每次覆盖旧数据,仅保留当前最新状态无历史版本,单份完整数据增量表仅记录新增或变化的数据需结合初始全量才能获得完整数据拉链表通过生效/失效时间标记数据生命周期保留所有历史版本分区快照表按时间分区存储各时间点全量快照各分区独立存储。

2025-09-23 16:24:19 416

原创 新零售:低价高效的数据赋能之路(2018-08)

刘润,国内著名商业咨询顾问,出生于江苏南京,毕业于南京大学,复旦MBA。润米咨询创始人,前微软战略合作总监,中国最大私人商学院《刘润·5分钟商学院》创始人,任海尔、百度、恒基地产、中远国际、晨兴资本、康宝莱、拍拍贷等多家企业的战略顾问,香港上市公司恒富控股独立董事,互联网转型专家。

2025-09-11 15:38:52 893

原创 商品分析相关应用

(类目-商品-货品)-见case4。

2025-09-11 15:03:32 597

原创 Spark Hive 小文件合并

如果结果表有动态分区,不同的分区是写到不同的目录下,令第i个动态分区dp的基数(cardinality)为card(dpi),那么如果k个动态分区,最多写出的文件数为card(dp1) * card(dp2) * ...* card(dpk ) * T。在写入HDFS之后,计算平均文件大小,merge小文件(但是这种做法只能缓解NN元数据的压力,由于存在写小文件,统计平均文件大小,读小文件、写出大文件这一连串操作,会增加NN RPC的压力,在NN负载高的时候,还会增加作业本身的执行时间)。

2025-09-11 14:20:16 761

原创 小文件问题

确认是否存在 文件数量 >= 1000 && 平均文件大小 < 1M 的分区​为什么通过shuffle方式做小文件合并?在这个案例中,使用进行shuffle操作来做小文件合并的原因是为了解决动态分区导致的小文件问题。:当使用动态分区(如)时,Spark/Hive无法预先知道最终会有多少个分区以及每个分区的数据量分布:在动态分区写入时,每个task都可能需要向多个分区写入数据,导致:每个task产生多个小文件(每个分区一个文件)文件数量 = task数量 × 分区数量:通过。

2025-09-11 14:16:58 594

原创 数据倾斜

将A对B的关联改成 A和B1的广播关联,然后再和B2进行关联,在和B2关联的时候判断A的内容如果已经和B1关联上了,则将A的关联键进行打散,找表中离散程度较大的字段进行hash化,并拼接一些特殊字符串作为关联键。这种情况也是我们工作中经常遇到的事实表和维表关联获取维表信息的场景。可以查看在sparkUI上查看任务的DAG图,如果AQE已经成功处理数据倾斜则会在DAG的SortMergeJoin节点显示skew=true,并且在UI的物理执行计划树中显示倾斜的分区数和最大倾斜的分区、最小倾斜的分区的大小。

2025-09-11 14:10:37 491

原创 Spark相关文章

例如,map就 是一种transformation操作,它用于将已有RDD的每个元素传入一个自定义的函数,并得到一个新的元素,然后将所有的新元素组成一个新的 RDD。Spark中Task,Partition,RDD、节点数、Executor数、core数目的关系和Application,Driver,Job,Task,Stage理解。Spark中Task,Partition,RDD、节点数、Executor数、core数目的关系和Application,Driver,Job,Task,Stage理解。

2025-09-11 11:55:21 454

原创 Spark参数

- 与 hive.merge.size.per.task 类似,设置额外的合并 job 的 map 端输入 size. 合并小文件时候,实际的 map 输入 size=max (spark.sql.mergeSmallFileSize, spark.sql.targetBytesInPartitionWhenMerge , spark.hadoopRDD.targetBytesInPartition)-- 开启 spark.sql.adaptive.enabled 后,合并之后最少会生成的分区数。

2025-09-11 11:53:52 445

原创 随记SQL

OOM调整spark.executor.memory,get RpcResponse timeout调整spark.driver.memory,并且不要所有dim表都broadcast,占driver内存。通过一下链接找到作业AM的日志:(其中application_xxx 替换为自己作业的applicationId)不可以用hash(rand())一旦某个task失败为了避免数据重复,任务会被置为失败,而不会重试task。列转行 lateral view。

2025-09-11 11:42:32 147

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除