吃透大数据算法-算法地图(备用)
在大数据架构组件中,算法的核心作用是解决 “大规模数据处理的效率、精度、资源平衡” 问题,除动态规划、贪心算法外,更多算法聚焦于 “分布式计算、数据存储优化、近似统计、流处理、图分析” 等场景。以下按核心场景分类,以表格形式梳理常用算法及实际应用:
大数据架构组件常用算法分类表
核心场景 | 算法名称 | 核心逻辑 | 大数据组件应用实例 |
---|---|---|---|
一、分布式计算与数据分片 | 1. 分治算法(Divide and Conquer) | 将大规模任务拆分为多个独立子任务,并行计算后合并结果,降低单节点压力。 | - MapReduce:将计算拆分为 Map(分片处理)和 Reduce(结果合并);- Spark Shuffle:按 Key 哈希分片,实现分布式聚合。 |
2. 哈希分区算法(Hash Partitioning) | 基于数据的 Key 哈希值分配到不同节点 / 分区,确保相同 Key 的数据集中存储,减少跨节点传输。 | - Kafka:按 Topic 的 Key 哈希分配分区,保证同 Key 消息有序;- Spark:Shuffle 阶段默认 Hash 分区,HBase 按 RowKey 哈希分配 Region。 | |
3. 一致性哈希算法(Consistent Hashing) | 将节点 / 数据映射到环形哈希空间,节点新增 / 下线时仅影响少量数据迁移,避免全量重分布。 | - Redis Cluster:用于节点负载均衡,减少槽位迁移;- HBase:RegionServer 扩容时的 Region 分配,降低数据迁移开销。 | |
二、数据存储与索引优化 | 1. LSM 树算法(Log-Structured Merge Tree) | 写操作先存内存(MemTable),满后异步合并到磁盘(SSTable),通过多阶合并优化读写性能。 | - HBase/RocksDB:底层存储引擎,支持高写入吞吐量;- Hudi/Milvus:用于增量数据存储与索引维护。 |
2. 布隆过滤器算法(Bloom Filter) | 用多个哈希函数映射数据到位数组,快速判断 “数据是否可能存在”(允许低误判率),避免无效磁盘 IO。 | - HBase:用于 RowKey 过滤,减少不存在数据的磁盘查询;- Spark:Join 操作前过滤不存在的 Key,减少 Shuffle 数据量。 | |
3. Z-Order / 希尔伯特曲线(空间填充曲线) | 将多维数据(如经纬度、时间 + ID)编码为一维序列,保持空间局部性,优化多维范围查询。 | - Hudi/Iceberg:用于多维数据重排序(如时间 + 用户 ID),加速跨维度查询;- ClickHouse:用于地理空间数据存储,提升区域查询效率。 | |
三、近似统计与精准度平衡 | 1. HyperLogLog(HLL) | 通过 “概率性计数” 估算数据基数(唯一值数量),用少量内存(如 12KB)处理亿级数据,误差可控制在 2% 以内。 | - Spark SQL:approx_count_distinct 函数,用于 UV 统计;- Flink:流处理中实时估算用户活跃度(DAU/MAU)。 |
2. Count-Min Sketch(CMS) | 用多个哈希函数映射数据到二维计数器数组,估算数据出现频率,支持流数据热点统计(允许低误差)。 | - Flink:实时检测热门商品 / 高频日志(如 “10 万 / 秒弹幕中的高频关键词”);- Redis:用于限流算法(如滑动窗口限流中的频率估算)。 | |
3. 抽样算法(Reservoir Sampling) | 从动态流数据中随机抽取固定大小的样本(如 1000 条),无需存储全量数据,保证样本随机性。 | - Spark:sample 算子,用于大表数据探索性分析;- Flink:流处理中实时抽取样本,用于异常检测模型训练。 | |
四、流处理与实时计算 | 1. 窗口算法(滑动 / 滚动 / 会话窗口) | 按时间(如每 5 分钟)或数据量(如每 1000 条)划分 “窗口”,对窗口内数据批量计算,支持乱序数据处理。 | - Flink:支持基于 Watermark 的事件时间窗口,处理实时订单聚合(如 “每 1 分钟更新的 5 分钟销量”);- Kafka Streams:滚动窗口统计 Topic 消息频次。 |
2. Watermark 算法 | 生成 “事件时间戳的延迟阈值”(如允许 3 秒延迟),标记窗口内数据是否完整,解决流数据乱序问题。 | - Flink:核心乱序处理机制,确保窗口计算不丢数据、不重复计算;- Spark Streaming:Structured Streaming 的事件时间对齐依赖 Watermark。 | |
3. Space-Saving 算法 | 流数据中实时维护 “TopK 高频项”,用有限内存记录候选高频项及其计数,无需存储全量数据,精度接近精确值。 | - Flink:实时 TopK 统计(如 “实时热搜榜 Top10”);- 日志系统:检测高频错误日志类型,用于运维告警。 | |
五、图计算与关联分析 | 1. PageRank 算法 | 通过 “节点的入链权重” 迭代计算节点重要性(如网页排名),支持分布式迭代计算,处理亿级边的图数据。 | - Spark GraphX:用于社交网络中 “用户影响力排名”;- Neo4j(分布式版):知识图谱中实体重要性评估。 |
2. Dijkstra 算法 | 基于 “贪心策略” 寻找图中两点间的最短路径(适用于非负权边),支持分布式并行计算,优化大规模图路径查询。 | - Spark GraphX:物流系统中 “仓库到网点的最短运输路径”;- HBase:地理信息系统(GIS)中两点间最优路线规划。 | |
3. 连通分量算法(Union-Find) | 又称 “并查集”,快速判断图中节点是否属于同一连通分量,支持动态合并集合,用于图聚类与关联分析。 | - Spark GraphX:社交网络中 “用户社群划分”;- 风控系统:识别 “关联欺诈账号组”(同一连通分量的账号视为关联)。 | |
六、查询优化与执行 | 1. 哈希连接(Hash Join) | 将小表构建哈希表(内存中),遍历大表时通过哈希表快速匹配关联 Key,避免大表排序,适合大表 Join。 | - Spark SQL:小表(<10GB)与大表 Join 的默认算法;- ClickHouse:分布式 Join 中 “小表广播 + 大表哈希匹配”。 |
2. 排序合并连接(Sort Merge Join) | 先将两张表按 Join Key 排序,再并行遍历两张表合并结果,适合两张均为大表的 Join 场景,避免内存溢出。 | - Spark SQL:大表 Join(如 100GB + 表)的优化算法;- Hive:Tez 执行引擎中多表关联的默认 Join 方式。 | |
3. 基于成本的优化(CBO)统计算法 | 收集表的统计信息(如行数、列值分布、NDV),估算不同执行计划的 “CPU/IO 成本”,选择最优计划。 | - Spark SQL:优化 Join 顺序、索引选择(如是否用 Bloom Filter);- StarRocks:多列联合统计信息用于选择最优扫描算子。 |
总结:算法选择逻辑
- 写入密集场景(如日志存储):优先选 LSM 树(优化写入)、一致性哈希(减少节点迁移);
- 实时统计场景(如 UV/TopK):优先选 HLL(基数估计)、Space-Saving(实时 TopK),平衡精度与性能;
- 大规模 Join / 聚合:小表用 Hash Join,大表用 Sort Merge Join,配合 Bloom Filter 过滤无效数据;
- 图 / 关联分析:用 PageRank(节点重要性)、Union-Find(连通分量),依托分布式图计算框架(如 Spark GraphX)实现。
(欢迎关注。欢迎订阅 本专栏 )