自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ClickHouse多表join的性能优化:原理与源码详解

本文深入探讨了ClickHouse中多表JOIN的底层原理和实现方式,旨在帮助初学者理解其工作机制。首先,文章介绍了JOIN的基本概念和ClickHouse中JOIN的特点,包括列式存储、分布式处理、内存优化和多种JOIN算法。接着,详细解释了JOIN的核心步骤,如读取数据、匹配键、合并结果和优化执行,并分析了列式存储对JOIN操作的影响。文章还介绍了ClickHouse中常用的JOIN算法,如HashJoin、MergeJoin和NestedLoopJoin,并通过伪代码示例展示了HashJoin的实现过

2025-05-09 17:21:24 602

原创 Java 的 Monitor 机制:原理与源码详解

Monitor(监视器)是 Java 中实现线程同步的核心机制,可以看作一个“独占门锁”。想象一个只有一张票的电影院(共享资源),Monitor 就像检票员,确保同一时间只有一个观众(线程)能进去看电影,其他人得在门口排队等着。在 Java 中,Monitor 是 synchronized 关键字的底层实现,用于保证多线程访问共享资源时的线程安全。每个 Java 对象都可以关联一个 Monitor,充当锁的角色。Monitor 是什么?

2025-05-08 15:01:24 791

原创 Java的对象头:原理与源码详解

在Java中,每个对象(比如new Object()创建的对象)在内存中不仅存储了它的实际数据(字段值),还有一个额外的“标签”部分,称为对象头这个对象是否被锁住?这个对象属于哪个类?这个对象的年龄(用于垃圾回收)?对象头就像一个“管理面板”,JVM(Java虚拟机)通过它来管理对象的生命周期、锁状态和内存分配。private:// Mark Word的实际值(64位机器上是64位)public:// 获取锁状态// 获取线程ID(偏向锁)// 获取哈希码// 获取分代年龄。

2025-05-08 14:09:58 1000

原创 Java 的锁机制:原理与源码详解

锁(Lock)就像现实生活中房间的门锁:当多个人(线程)同时想进入同一个房间(访问共享资源,比如一个变量或对象)时,锁确保只有一个人能进去,其他人得在门外等着。这样可以避免混乱,比如防止两个人同时修改一个银行账户余额导致数据错误。在Java中,锁是用来解决多线程并发访问共享资源时可能出现的数据不一致问题。简单说,锁是多线程编程中保证线程安全的工具。问题背景:多线程并发访问共享资源可能导致数据不一致,需要锁来保证线程安全。锁的实现。

2025-05-08 10:05:16 774

原创 Spark 的 Shuffle 机制:原理与源码详解

在 Spark 中,数据以分布式方式在集群的多个节点(计算机)上处理。每个节点处理数据的子集,称为分区(Partition)。窄变换(Narrow Transformations)(如mapfilter):这些操作在单个分区上执行,无需数据在节点之间移动。宽变换(Wide Transformations)(如groupByjoin):这些操作需要跨分区重新分配数据,因为一个分区的输出可能依赖于其他分区的数据。Shuffle是在宽变换期间重新分配数据的过程。它确保相关数据(例如,groupBy。

2025-05-06 17:35:55 1354

原创 HashMap 为什么从头插法改用尾插法

头插法是指将新插入的键值对节点放在链表的头部。在 Java 7 及更早版本的 HashMap 中,插入新节点时使用的是头插法。所谓头插法,就是在创建链表的时候,每次拿到一个新的节点就插在Head之后。即如果用3个整形数1,2,3来创建链表,如果按照数字升序输入数据,那么用头插法创建后得到的链表则为3->2->1尾插法是指将新插入的键值对节点放在链表的尾部。从 Java 8 开始,HashMap 改用尾插法来解决头插法在扩容时的死循环问题。

2025-05-06 13:58:16 900

原创 MapReduce的shuffle过程详解

在 MapReduce 中,Map 任务处理输入数据并生成中间键值对 〈key,value〉。这些中间结果需要传递给 Reduce 任务进行进一步处理。然而,Map 任务的输出通常分布在多个节点上,且键值对需要根据键进行分组和排序,以便每个 Reduce 任务处理特定的键范围。Shuffle 过程分区(Partitioning):将 Map 输出的键值对分配到不同的 Reduce 任务。排序(Sorting):对每个 Reduce 任务的输入数据按键进行排序。合并(Merging)

2025-04-29 11:39:38 766

原创 Java 内存泄漏 详解

在 OpenJDK 中,GC Roots 由oopClosure和OopStorage等类处理,定义在目录下。栈中的局部变量和参数。方法区中的静态变量。本地方法栈中的 JNI 引用。运行时常量池中的引用。源码片段break;break;// 其他原因垃圾回收从 GC Roots 开始,调用markOop方法标记可达对象。Java 内存泄漏的本质是对象因不必要的引用而无法被垃圾回收器回收。常见原因包括静态变量、未关闭资源、监听器未移除和缓存未清理。代码层面:正确管理引用、资源和缓存。

2025-04-27 17:26:56 770

原创 HDFS 的硬链接 详解

硬链接是文件系统中的一种机制,允许多个文件名指向同一个物理数据块。在HDFS中,硬链接意味着多个文件路径(文件名)可以引用相同的底层数据,而不复制数据本身。类比:想象一个图书馆的书目系统。一本书(数据)在图书馆只有一份,但可以在多个分类目录下有不同的条目(文件名)。无论通过哪个条目找到这本书,内容都是同一本。特点硬链接与原始文件共享相同的inode(在传统文件系统中,inode存储文件的元数据和数据块指针;在HDFS中,类似的概念是文件的元数据)。

2025-04-25 16:07:01 1077

原创 Java 类加载过程中的ClassLoaderValue 类详解

类定义是一个final类,不能被继承。它继承自,后者定义了一些通用的逻辑(比如存储键值对的底层机制;支持通过 sub 方法创建子类加载器值,形成层级结构;提供线程安全的原子操作,如 computeIfAbsent,确保在多线程环境下正确计算和存储值;内部使用 ConcurrentHashMap 和 Memoizer 类实现高效且延迟加载的值管理。),用于管理与类加载器(ClassLoader)相关的键值对。泛型<V>V表示值的类型。比如,可以用>>来存储类对象,或者来存储字符串。泛型让这个类非常灵活。

2025-04-25 15:09:01 671

原创 Kafka 保证多分区的全局顺序性的设计方案和具体实现

单一分区路由:简单易实现,适合低吞吐量场景。外部排序:适合需要高吞吐量但全局顺序的场景,需关注缓冲区管理。:适合复杂流处理,需额外计算资源。主题级顺序控制:折衷方案,适合已有单一分区主题的系统。通用建议使用 Kafka 监控工具(如 Prometheus + Grafana)跟踪分区负载、延迟和消费者 lag。配置重试机制和死信队列(DLQ)处理异常消息。定期测试故障恢复,确保顺序性和一致性。

2025-04-23 17:35:28 1168

原创 从一个简单的HelloWorld来完整介绍Java的类加载过程

类加载是 Java 虚拟机(JVM)将类文件(.class文件或字节码)加载到内存,并将其转换为可执行的对象的过程。它是 Java 程序运行的基础,确保程序所需的类在需要时被正确加载、验证和初始化。阶段类方法作用启动JVM 内部实现,(无 Java 方法,由 JVM 调用)初始化 JVM,加载核心类库(如加载查找并读取.class文件,生成Class对象。验证JVM 内部,(无直接 Java 方法,JVM 验证器)检查字节码合法性。准备JVM 内部,Class。

2025-04-23 15:19:53 1066

原创 Java类加载器(ClassLoader)及其相关类 简介

Java 的类加载机制主要围绕类及其相关类和接口。以下是与类加载器直接相关的核心类、抽象类和接口(基于 Java 17,主要参考java.lang和抽象类普通类(内部实现)接口:无直接接口,类加载器通过方法签名与 JVM 交互。关系总结继承是核心,等扩展其功能,继承。协作:类加载器通过双亲委派模型协作,生成Class和Package,与Module管理模块化,提供键值存储,辅助资源加载。

2025-04-23 15:03:21 983

原创 代理设计模式:从底层原理到源代码 详解

它通过创建一个代理对象来控制对目标对象的访问。代理对象充当客户端和目标对象之间的中介,允许在不修改目标对象的情况下添加额外的功能(如权限控制、日志记录、延迟加载等)。代理对象可以在客户端和目标对象之间添加额外的逻辑,比如检查你是否有足够的钱(权限控制)、记录你买了什么(日志记录),或者延迟去商店直到你确认要买(延迟加载)。代理对象封装了对目标对象的访问,客户端通过代理间接调用目标对象的方法。代理设计模式通过引入一个代理对象,控制对目标对象的访问,并在不修改目标对象的情况下添加额外功能。

2025-04-22 22:16:41 797

原创 Flink的 RecordWriter 数据通道 详解

根据 Flink 官方文档,是 Flink 数据流(DataStream)处理中用于将记录(Record)写入到输出通道的核心组件。它是 Flink 运行时(Runtime)层的一部分,位于任务的输出端,负责将上游算子处理后的数据发送到下游算子的输入端。为了让初学者彻底理解,我将的工作流程总结为以下步骤,并为每一步提供通俗解释和公式推导(如果适用)。接收数据记录描述:上游算子调用,传入一条数据。类比:快递员收到一个包裹。推导:无复杂计算,只是将record传递给。选择目标通道返回目标通道索引。

2025-04-11 19:45:00 1079

原创 Flink的数据流图中的数据通道 StreamEdge 详解

StreamEdge是 Apache Flink 中用于表示数据流图(Stream Graph)中两个算子(Operator)之间数据传输关系的对象。简单来说,它是一条“数据通道”,定义了数据如何从一个算子流向下游的另一个算子。想象成一条水管,上游的水(数据)通过这条管子流到下游。为什么需要 StreamEdge?Flink 是一个分布式流处理框架,数据需要在不同的任务(Task)之间传递。StreamEdge。

2025-04-10 22:00:00 1785

原创 Flink 反压下的 TCP 流控制

反压(Backpressure)是什么?反压是分布式流处理系统中一种自我调节机制。当下游处理数据的速度跟不上上游发送数据的速度时,反压会让上游放慢发送速度,以避免系统过载甚至崩溃。简单来说,就像水管里水流太快,下游接不住,上游就得“憋一憋”。在 Flink 中,反压是内置的特性,主要通过其数据传输机制和网络层来实现。它确保整个数据处理管道(Pipeline)的稳定性。TCP 流控制是什么?TCP 流控制是 TCP 协议的一部分,用来协调发送端和接收端的数据传输速度。

2025-04-09 21:45:00 894

原创 JVM中的运行时常量池详解

保存编译时确定的常量(数字、字符串、方法引用等)。在程序运行时,把这些符号解析成实际的内存地址或数据。确保代码里的每一部分都能找到它需要的东西,正确执行。

2025-03-21 16:35:07 916

原创 完整的类在JVM中的生命周期详解

在。

2025-03-21 15:41:53 1350

原创 Java 中的引导类加载器(Bootstrap ClassLoader) 详解

原生实现:由 C/C++ 编写,非 Java 类。核心职责:加载 JVM 运行所需的核心类库。委托模型:作为类加载器层次结构的顶端,确保类加载的顺序和唯一性。不可见性:在 Java 中表现为null,无法直接操作。从底层看,它是 JVM 启动的关键组件;从源代码看,它通过 JNI 与 Java 的体系协作,共同完成类的动态加载。理解引导类加载器不仅有助于深入掌握 JVM 内部机制,还能更好地调试类加载相关问题(如上面的内容不太易于理解,因此我下面用更加通俗易懂的解释,方便读者理解。

2025-03-19 15:34:58 968

原创 双机算法:主备、主主 对比

怎么实现:ZooKeeper集群有3个或更多节点,只有一个Leader写数据,其他Follower同步数据并处理读请求。为什么:分布式系统需要一个“指挥官”协调,避免混乱。原理:用Zab协议(类似Paxos),确保写操作顺序一致,故障时快速选新Leader。特性主备 (ZooKeeper)主主 (Memcached)节点角色1主多备全主0备数据同步主节点实时同步到备无同步,数据分片一致性强一致性弱一致性性能主节点瓶颈高并发,线性扩展故障处理选举切换,短暂停机局部失效,无切换复杂度。

2025-03-18 15:14:03 904

原创 主备(主从)方案 详解

特性冷备温备热备运行状态备份系统关机备份系统待机备份系统运行数据同步定期手动定期自动实时自动切换时间几小时到几天几分钟到几小时几秒到毫秒成本低中高复杂度简单中等复杂数据丢失多(几小时-几天)少(几小时)几乎无。

2025-03-18 14:48:27 929

原创 任务分配器做负载均衡方案对比和选择

性能优先:F5 > LVS > HAProxy ≈ Nginx > 交换机(仅 L2/L3)。成本优先:Nginx ≈ HAProxy > LVS > 交换机 > F5。易维护性:Nginx > HAProxy > F5 ≈ 交换机 > LVS。高可用性:F5 > 交换机 ≈ LVS > HAProxy ≈ Nginx。选择时需根据业务规模、技术团队能力、预算和具体需求(如第 4 层还是第 7 层)综合权衡。小型项目从软件方案起步,中大型项目可逐步引入 LVS 或硬件设备以满足增长需求。

2025-03-17 11:11:47 880

原创 数据中台联接方式:以对象(主体)为中心联接

Users:存储用户信息。Orders:存储订单信息,关联到用户。-- 创建用户表UserID INT PRIMARY KEY, -- 用户IDUserName VARCHAR(100), -- 用户姓名Email VARCHAR(100), -- 用户邮箱RegisterDate TIMESTAMP -- 注册日期-- 创建订单表OrderID INT PRIMARY KEY, -- 订单IDUserID INT, -- 用户ID。

2025-01-23 14:16:58 799

原创 CAP原则中的P:分区容错性(Partition tolerance)

一致性(Consistency):所有节点的数据始终保持一致。可用性(Availability):系统始终能够响应请求,无论请求是否成功。分区容错性(Partition Tolerance):系统能够在部分机器故障、网络故障、机房停电等异常情况下继续运行。CAP 定理的核心内容是,在一个分布式系统中,分区容错性(P)和一致性(C)可用性(A)三者之间是相互制约的。也就是说,如果发生网络分区,系统只能选择保证一致性或可用性,但不能同时保证这两者。

2025-01-23 11:26:43 1302

原创 数据中台联接方式:以业务流(事件)为中心联接

订单创建事件(OrderCreatedEvent)当用户下单时,系统会生成一个订单创建事件。OrderID(订单ID),UserID(用户ID),(订单金额),(订单状态,初始为“未支付”)。支付完成事件(PaymentCompletedEvent)当用户完成支付时,系统会生成一个支付完成事件。OrderID(订单ID),(支付金额),(支付时间)。事件驱动:订单创建事件触发了订单的初始状态,而支付完成事件通过匹配支付金额和订单金额,更新了订单的状态为“已支付”。联接方式:我们通过SQL的。

2025-01-23 10:56:53 858

原创 可扩展性设计架构模式——开闭原则

在架构设计中,遵循开闭原则(Open/ClosedPrinciple,OCP)是实现可扩展性的关键。这个原则指导我们设计系统时,应使其对新增功能开放,而对现有代码的修改封闭。这样,当系统需求变化或需要添加新功能时,我们可以通过添加新的代码模块而不是修改现有代码来实现,从而减少了对现有系统稳定性和已有功能的风险。开闭原则基于抽象构建架构。系统中稳定的部分(例如数据模型、核心逻辑)应该通过抽象接口或者抽象类来定义,而变化的部分(例如具体实现、附加功能)则通过具体的实现类来扩展。这种方式使得核心架构保持稳定,

2025-01-22 11:00:26 517

原创 大数据和人工智能融合展望

大数据技术和人工智能(AI)的融合是科技发展的方向,其实很多年前就已经提出来并在不断前行,未来几年将会因为算力的进步和AI技术的飞速发展继续加速。

2025-01-21 17:23:30 1059

原创 数据标准化——数据字典发布

数据字典发布是数据标准化的关键环节,为企业的数据治理、共享和使用提供了基础支持。从底层原理看,它通过标准化描述减少认知差异,促进数据资产化和治理闭环的实现。通过系统化的步骤,如内容规范、收集整理、发布与动态维护,企业能够确保数据字典的高效发布和持续利用,为业务决策和开发效率提供强有力的保障。

2025-01-17 17:23:05 1144

原创 数据入湖的前提条件:数据标准 之 元数据注册

是数据入湖的核心步骤,通过系统化管理元数据,确保数据的可发现性、可理解性、可追溯性和可治理性。它既是数据治理的基础设施,也是数据资产化的重要环节。只有完成元数据注册,才能真正实现数据湖中数据的高效管理和价值挖掘。元数据是描述数据的“数据”,包括数据的结构、来源、用途等关键信息。下面从底层原理、操作步骤及背后原因进行全面解析。记录和管理数据的元信息(Metadata),为数据的理解、发现、管理、使用和治理提供依据。是数据入湖的重要前提条件之一,其核心目的是。

2025-01-17 16:25:01 1080

原创 数据入湖的前提条件:数据标准 之 数据质量评估

是数据入湖前必须满足的核心标准之一,其目的是确保数据的准确性、完整性、一致性和可靠性。通过系统化评估,能够最大限度地提升数据的价值,降低数据问题对业务决策的负面影响。下面从底层原理、详细步骤及背后原因进行全面解析。数据质量评估是数据入湖前的重要保障,确保数据的真实性、完整性和可用性。通过质量评估,企业能够优化数据治理流程,提升数据的业务价值,

2025-01-17 16:15:28 1004

原创 数据入湖的前提条件:数据标准 之 明确数据源

是数据入湖的重要前提,通过记录数据来源、生成逻辑、责任人和合法性,确保数据的真实性、可追溯性和合规性。它不仅是数据治理的基础,也是数据安全和高效管理的核心环节,能够有效避免“数据沼泽”、提升数据价值。确保数据的来源合法、清晰、可追溯,为数据的可靠性、完整性和可用性提供基础保障。下面从底层原理、具体操作以及其背后原因进行详细解析。是数据入湖的重要前提条件之一,其核心目的是。

2025-01-16 16:03:46 1051

原创 数据入湖的前提条件:数据标准 之 定义数据密级

是数据入湖前必须完成的步骤,它确保了数据的安全性、合规性和高效管理。通过科学的密级分类、清晰的判定标准和有效的保护策略,企业可以在保护数据的同时,最大限度地支持业务需求,平衡安全与效率。是对数据敏感性和重要性的分类,明确数据的保密程度和使用权限。它是确保数据安全、合规、合理使用的关键环节。下面从底层原理层面逐步解析数据密级定义的原因及其详细实现步骤。

2025-01-16 15:27:42 689

原创 数据入湖的前提条件:数据标准 之 发布数据标准

在数据入湖(Data Ingestion)过程中,“发布数据标准”是确保数据治理规范化、数据质量一致性以及后续数据可用性的核心环节。从底层原理来看,数据标准的发布涉及定义、审核、发布和执行多个阶段,贯穿技术、业务和治理逻辑。总结而言,发布数据标准是数据入湖治理中不可或缺的环节,其从定义、发布到执行的全过程,构建了确保数据质量与规范性的系统性保障。数据标准是关于数据属性、结构、质量、语义等方面的规范,它是数据入湖的基础条件,发布数据标准不仅是定义标准,还涉及审核、发布和监督执行的流程。

2025-01-16 12:10:37 1077

原创 数据入湖的前提条件:数据标准 之 明确数据Owner

明确数据Owner,就像给每一块“田地”分配一个具体的“农夫”。这个农夫负责田地的种植、维护、收获。如果田地没人管理,它可能荒废;如果有人管理,它就会不断产生价值。通过明确数据Owner,公司可以清楚知道数据的责任人是谁,提升数据质量,确保安全合规,最终让数据更高效地服务于业务需求。

2025-01-14 17:22:39 1310

原创 领域驱动设计(Domain-Driven Design,DDD)详解

领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,一种软件设计方法,帮助软件开发团队准确理解复杂业务需求,并创建反映这些需求的高效、可维护的软件系统。它强调的是基于业务领域的复杂性进行建模,并通过语言和实现这些模型的方法促进软件项目和业务专家之间的沟通。这种方法论特别适用于那些业务规则复杂、业务逻辑多变的环境。此设计方法由Eric Evans在其2004年的书《领域驱动设计:软件核心复杂性应对之道》中首次提出。

2025-01-10 16:45:28 1568

原创 领域驱动设计(DDD)——限界上下文(Bounded Context)详解

每个街区都有自己的规则和运作方式(比如商业区禁止夜间施工,住宅区保持安静),虽然它们同属于一个城市,但它们的行为是互相独立的。,帮助我们将复杂的业务系统划分成多个相对独立的上下文,每个上下文内都有自己独立的模型、规则和语义。这样,每个上下文的模型都是独立的,能够根据上下文的需求量身定制。限界上下文的一个重要原则是:每个上下文都应该是自治的,即使一个上下文失效,也不会影响到其他上下文的正常运行。通过限界上下文,我们能够构建出模块化、易维护且高效协作的业务系统,是 DDD 中解决复杂系统问题的重要策略。

2025-01-10 16:43:25 1317

原创 领域驱动设计(DDD)——实体(Entity)和值对象(Value Object) 详解和示例

例如,一个用户的 ID 是其身份的唯一标识,即使姓名或其他信息发生变化,用户的身份不变。值对象通常用来表示实体的属性或某些业务概念,帮助实体表达更复杂的业务逻辑,如地址(Address)、货币金额(Money)等。理解实体与值对象的区别和正确使用场景,可以帮助我们设计更清晰的领域模型,减少复杂度,增强代码的可维护性和可读性。即使实体的其他属性值发生变化,只要它的唯一标识(ID)保持不变,它仍然是同一个实体。值对象没有唯一标识,它通过属性值来判断是否相同(两个值对象如果属性值相同,就认为它们是相等的)。

2025-01-10 15:57:06 1125

原创 领域驱动设计(DDD)——聚合 详解和示例

聚合根是聚合的入口点,对聚合内的所有对象负责。聚合帮助我们定义哪些对象需要一起变化、被一起操作,同时帮助我们控制领域模型的复杂性。

2025-01-09 15:51:50 854

原创 领域驱动设计(DDD)——仓储(Repository)详解和示例

*** 订单(Order):这是领域模型中的聚合根。* 聚合根是领域模型中的一个重要概念,表示领域的一部分及其边界。*/// 订单的唯一标识// 用户 ID// 订单总金额// 订单创建时间// Getter 和 Setter 方法/*** 订单仓储接口(Order Repository)。* 定义了对订单领域对象的基本操作。*//*** 保存订单。* @param order 要保存的订单对象*//*** 根据订单 ID 查找订单。

2025-01-09 12:29:57 1176

空空如也

空空如也

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

TA关注的人

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