DolphinDB分布式计算:MapReduce模

目录

    • 摘要
    • 一、分布式计算概述
      • [1.1 什么是分布式计算](#1.1 什么是分布式计算)
      • [1.2 分布式计算优势](#1.2 分布式计算优势)
      • [1.3 DolphinDB分布式计算特点](#1.3 DolphinDB分布式计算特点)
    • 二、MapReduce模式
      • [2.1 MapReduce原理](#2.1 MapReduce原理)
      • [2.2 Map阶段](#2.2 Map阶段)
      • [2.3 Reduce阶段](#2.3 Reduce阶段)
    • 三、分布式聚合
      • [3.1 基本分布式聚合](#3.1 基本分布式聚合)
      • [3.2 多维分布式聚合](#3.2 多维分布式聚合)
      • [3.3 分布式窗口聚合](#3.3 分布式窗口聚合)
    • 四、分布式JOIN
      • [4.1 分布式表JOIN](#4.1 分布式表JOIN)
      • [4.2 分区对齐JOIN](#4.2 分区对齐JOIN)
    • 五、任务调度
      • [5.1 查看任务状态](#5.1 查看任务状态)
      • [5.2 任务管理](#5.2 任务管理)
      • [5.3 并行度控制](#5.3 并行度控制)
    • 六、分布式计算优化
      • [6.1 分区裁剪](#6.1 分区裁剪)
      • [6.2 数据本地性](#6.2 数据本地性)
      • [6.3 结果缓存](#6.3 结果缓存)
    • 七、实战案例
      • [7.1 分布式数据统计](#7.1 分布式数据统计)
      • [7.2 分布式异常检测](#7.2 分布式异常检测)
    • 八、总结
    • 参考资料

摘要

本文深入讲解DolphinDB分布式计算技术。从分布式计算原理到MapReduce模式,从任务调度到结果合并,从分布式聚合到性能优化,全面介绍分布式计算的核心方法。通过丰富的代码示例,帮助读者掌握分布式计算的核心技能。


一、分布式计算概述

1.1 什么是分布式计算

分布式计算将计算任务分散到多个节点并行执行:
#mermaid-svg-qIXl8KX1SG6tWVzh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qIXl8KX1SG6tWVzh .error-icon{fill:#552222;}#mermaid-svg-qIXl8KX1SG6tWVzh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qIXl8KX1SG6tWVzh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qIXl8KX1SG6tWVzh .marker.cross{stroke:#333333;}#mermaid-svg-qIXl8KX1SG6tWVzh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qIXl8KX1SG6tWVzh p{margin:0;}#mermaid-svg-qIXl8KX1SG6tWVzh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster-label text{fill:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster-label span{color:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster-label span p{background-color:transparent;}#mermaid-svg-qIXl8KX1SG6tWVzh .label text,#mermaid-svg-qIXl8KX1SG6tWVzh span{fill:#333;color:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .node rect,#mermaid-svg-qIXl8KX1SG6tWVzh .node circle,#mermaid-svg-qIXl8KX1SG6tWVzh .node ellipse,#mermaid-svg-qIXl8KX1SG6tWVzh .node polygon,#mermaid-svg-qIXl8KX1SG6tWVzh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qIXl8KX1SG6tWVzh .rough-node .label text,#mermaid-svg-qIXl8KX1SG6tWVzh .node .label text,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape .label,#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape .label{text-anchor:middle;}#mermaid-svg-qIXl8KX1SG6tWVzh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qIXl8KX1SG6tWVzh .rough-node .label,#mermaid-svg-qIXl8KX1SG6tWVzh .node .label,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape .label,#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape .label{text-align:center;}#mermaid-svg-qIXl8KX1SG6tWVzh .node.clickable{cursor:pointer;}#mermaid-svg-qIXl8KX1SG6tWVzh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qIXl8KX1SG6tWVzh .arrowheadPath{fill:#333333;}#mermaid-svg-qIXl8KX1SG6tWVzh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qIXl8KX1SG6tWVzh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qIXl8KX1SG6tWVzh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qIXl8KX1SG6tWVzh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qIXl8KX1SG6tWVzh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qIXl8KX1SG6tWVzh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster text{fill:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster span{color:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qIXl8KX1SG6tWVzh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh rect.text{fill:none;stroke-width:0;}#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape p,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape .label rect,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qIXl8KX1SG6tWVzh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qIXl8KX1SG6tWVzh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qIXl8KX1SG6tWVzh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 分布式计算架构
客户端
协调节点
数据节点1
数据节点2
数据节点3
局部计算
结果合并
最终结果

1.2 分布式计算优势

优势 说明
并行计算 多节点并行
数据本地 计算靠近数据
可扩展 横向扩展
高可用 容错能力

1.3 DolphinDB分布式计算特点

特点 说明
自动分区 数据自动分布
自动调度 任务自动调度
自动合并 结果自动合并
透明访问 用户无感知

二、MapReduce模式

2.1 MapReduce原理

#mermaid-svg-kjhzp1frOWKwV4nV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kjhzp1frOWKwV4nV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kjhzp1frOWKwV4nV .error-icon{fill:#552222;}#mermaid-svg-kjhzp1frOWKwV4nV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kjhzp1frOWKwV4nV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kjhzp1frOWKwV4nV .marker.cross{stroke:#333333;}#mermaid-svg-kjhzp1frOWKwV4nV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kjhzp1frOWKwV4nV p{margin:0;}#mermaid-svg-kjhzp1frOWKwV4nV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster-label text{fill:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster-label span{color:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster-label span p{background-color:transparent;}#mermaid-svg-kjhzp1frOWKwV4nV .label text,#mermaid-svg-kjhzp1frOWKwV4nV span{fill:#333;color:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .node rect,#mermaid-svg-kjhzp1frOWKwV4nV .node circle,#mermaid-svg-kjhzp1frOWKwV4nV .node ellipse,#mermaid-svg-kjhzp1frOWKwV4nV .node polygon,#mermaid-svg-kjhzp1frOWKwV4nV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kjhzp1frOWKwV4nV .rough-node .label text,#mermaid-svg-kjhzp1frOWKwV4nV .node .label text,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape .label,#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape .label{text-anchor:middle;}#mermaid-svg-kjhzp1frOWKwV4nV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kjhzp1frOWKwV4nV .rough-node .label,#mermaid-svg-kjhzp1frOWKwV4nV .node .label,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape .label,#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape .label{text-align:center;}#mermaid-svg-kjhzp1frOWKwV4nV .node.clickable{cursor:pointer;}#mermaid-svg-kjhzp1frOWKwV4nV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kjhzp1frOWKwV4nV .arrowheadPath{fill:#333333;}#mermaid-svg-kjhzp1frOWKwV4nV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kjhzp1frOWKwV4nV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kjhzp1frOWKwV4nV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kjhzp1frOWKwV4nV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kjhzp1frOWKwV4nV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kjhzp1frOWKwV4nV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kjhzp1frOWKwV4nV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster text{fill:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster span{color:#333;}#mermaid-svg-kjhzp1frOWKwV4nV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kjhzp1frOWKwV4nV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kjhzp1frOWKwV4nV rect.text{fill:none;stroke-width:0;}#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape p,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape .label rect,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kjhzp1frOWKwV4nV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kjhzp1frOWKwV4nV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kjhzp1frOWKwV4nV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MapReduce流程
输入数据
Map阶段
中间结果
Reduce阶段
最终结果

2.2 Map阶段

python 复制代码
// Map阶段:数据分片并行计算
// DolphinDB自动将数据分片到各节点

// 创建分布式表
db = database("dfs://mr_db", VALUE, 1..100)
schema = table(1:0, `device_id`timestamp`value,
               [INT, TIMESTAMP, DOUBLE])
db.createPartitionedTable(schema, `sensor_data, `device_id)

// 插入数据
loadTable("dfs://mr_db", "sensor_data").append!(
    table(
        take(1..100, 1000000) as device_id,
        take(now(), 1000000) as timestamp,
        rand(20.0..30.0, 1000000) as value
    )
)

// Map阶段:各分区并行计算
t = loadTable("dfs://mr_db", "sensor_data")

// 查询自动触发Map
select device_id, avg(value) as avg_value
from t
group by device_id

2.3 Reduce阶段

python 复制代码
// Reduce阶段:合并Map结果

// DolphinDB自动执行Reduce
// 例如:avg = sum / count
// Map: 各分区计算 sum, count
// Reduce: 合并 sum, count,计算 avg

// 分布式聚合
select device_id,
       avg(value) as avg_value,
       sum(value) as sum_value,
       max(value) as max_value,
       min(value) as min_value,
       count(*) as cnt
from t
group by device_id

三、分布式聚合

3.1 基本分布式聚合

python 复制代码
// 基本分布式聚合
t = loadTable("dfs://mr_db", "sensor_data")

// 分组聚合
select device_id,
       avg(value) as avg_value,
       std(value) as std_value,
       max(value) as max_value,
       min(value) as min_value
from t
group by device_id

3.2 多维分布式聚合

python 复制代码
// 多维分布式聚合
// 创建多分区表
db = database("dfs://multi_db", COMPO, [VALUE, 1..10, RANGE, 2024.01.01..2024.12.31])
schema = table(1:0, `device_id`date`value,
               [INT, DATE, DOUBLE])
db.createPartitionedTable(schema, `data, `device_id`date)

// 多维聚合
t = loadTable("dfs://multi_db", "data")

select device_id, month(date) as month,
       avg(value) as avg_value,
       sum(value) as sum_value
from t
group by device_id, month(date)

3.3 分布式窗口聚合

python 复制代码
// 分布式窗口聚合
select device_id,
       bar(timestamp, 1h) as hour,
       avg(value) as avg_value,
       max(value) as max_value
from t
group by device_id, bar(timestamp, 1h)

四、分布式JOIN

4.1 分布式表JOIN

python 复制代码
// 创建两个分布式表
db = database("dfs://join_db", VALUE, 1..100)

// 表1:传感器数据
schema1 = table(1:0, `device_id`timestamp`value,
                [INT, TIMESTAMP, DOUBLE])
db.createPartitionedTable(schema1, `sensor_data, `device_id)

// 表2:设备信息
schema2 = table(1:0, `device_id`device_name`location,
                [INT, STRING, STRING])
db.createTable(schema2, `device_info)

// 分布式JOIN
t1 = loadTable("dfs://join_db", "sensor_data")
t2 = loadTable("dfs://join_db", "device_info")

select t1.device_id, t1.timestamp, t1.value,
       t2.device_name, t2.location
from t1
left join t2 on t1.device_id = t2.device_id

4.2 分区对齐JOIN

python 复制代码
// 分区对齐JOIN:分区相同,性能更好
// 两表使用相同分区策略

db1 = database("dfs://aligned_db1", VALUE, 1..100)
db2 = database("dfs://aligned_db2", VALUE, 1..100)

// 创建相同分区的表
schema = table(1:0, `device_id`timestamp`value,
               [INT, TIMESTAMP, DOUBLE])
db1.createPartitionedTable(schema, `table1, `device_id)
db2.createPartitionedTable(schema, `table2, `device_id)

// 分区对齐JOIN
t1 = loadTable("dfs://aligned_db1", "table1")
t2 = loadTable("dfs://aligned_db2", "table2")

select t1.device_id, t1.value as value1, t2.value as value2
from t1
inner join t2 on t1.device_id = t2.device_id and t1.timestamp = t2.timestamp

五、任务调度

5.1 查看任务状态

python 复制代码
// 查看集群节点
getClusterPerf()

// 查看任务状态
getJobStat()

// 查看最近任务
getRecentJobs()

5.2 任务管理

python 复制代码
// 取消任务
cancelJob(jobId)

// 查看任务进度
getJobProgress(jobId)

5.3 并行度控制

python 复制代码
// 控制并行度
// 通过配置参数控制
// maxPartitionNumPerQuery: 单查询最大分区数
// maxQueryJobPerNode: 单节点最大并发查询

六、分布式计算优化

6.1 分区裁剪

python 复制代码
// 分区裁剪:只扫描需要的分区
t = loadTable("dfs://mr_db", "sensor_data")

// 不推荐:全表扫描
select count(*) from t

// 推荐:分区裁剪
select count(*) from t
where device_id in 1..10  // 只扫描10个分区

6.2 数据本地性

python 复制代码
// 数据本地性:计算靠近数据
// DolphinDB自动优化

// 分区策略影响数据本地性
// VALUE分区:相同key在同一节点
// RANGE分区:连续范围在同一节点

6.3 结果缓存

python 复制代码
// 结果缓存:避免重复计算
// 使用中间表缓存结果

// 计算并缓存
result = select device_id, avg(value) as avg_value
         from t
         group by device_id

// 后续使用缓存结果
select * from result where avg_value > 25

七、实战案例

7.1 分布式数据统计

python 复制代码
// ========== 分布式数据统计 ==========

// 创建分布式表
db = database("dfs://stats_db", VALUE, 1..1000)
schema = table(1:0, `device_id`timestamp`temperature`humidity`pressure,
               [INT, TIMESTAMP, DOUBLE, DOUBLE, DOUBLE])
db.createPartitionedTable(schema, `sensor_data, `device_id)

// 插入数据
loadTable("dfs://stats_db", "sensor_data").append!(
    table(
        take(1..1000, 10000000) as device_id,
        take(now(), 10000000) as timestamp,
        rand(20.0..30.0, 10000000) as temperature,
        rand(40.0..60.0, 10000000) as humidity,
        rand(1000.0..1020.0, 10000000) as pressure
    )
)

// 分布式统计
t = loadTable("dfs://stats_db", "sensor_data")

// 设备级统计
select device_id,
       count(*) as cnt,
       avg(temperature) as avg_temp,
       std(temperature) as std_temp,
       max(temperature) as max_temp,
       min(temperature) as min_temp
from t
group by device_id

// 时间窗口统计
select device_id, bar(timestamp, 1h) as hour,
       avg(temperature) as avg_temp,
       avg(humidity) as avg_humidity
from t
group by device_id, bar(timestamp, 1h)

7.2 分布式异常检测

python 复制代码
// ========== 分布式异常检测 ==========

// 分布式计算统计指标
stats = select device_id,
               avg(temperature) as avg_temp,
               std(temperature) as std_temp
        from t
        group by device_id

// 分布式检测异常
select t.device_id, t.timestamp, t.temperature,
       abs(t.temperature - stats.avg_temp) > 3 * stats.std_temp as is_anomaly
from t
left join stats on t.device_id = stats.device_id
where abs(t.temperature - stats.avg_temp) > 3 * stats.std_temp

八、总结

本文详细介绍了DolphinDB分布式计算:

  1. 分布式原理:并行计算、数据本地性
  2. MapReduce模式:Map阶段、Reduce阶段
  3. 分布式聚合:基本聚合、多维聚合、窗口聚合
  4. 分布式JOIN:分区对齐、性能优化
  5. 任务调度:任务管理、并行度控制
  6. 性能优化:分区裁剪、数据本地性、结果缓存

思考题

  1. 如何设计分布式计算任务?
  2. MapReduce模式有什么优势?
  3. 如何优化分布式计算性能?

参考资料

相关推荐
ApacheSeaTunnel1 小时前
当多表数据涌入,Apache SeaTunnel 如何巧妙化解主键冲突?
大数据·开源·数据集成·seatunnel·技术分享·数据同步
大大大大晴天3 天前
Hudi Metadata Table 与 Hive Sync (HMS)怎么选?
大数据
手可摘星辰7773 天前
一次线上FlinkCDC异常排查复盘
大数据·flink
大大大大晴天3 天前
Hudi技术内幕:Metadata Table原理与实践
大数据
大大大大晴天4 天前
Hudi技术内幕:深入解析Index索引机制
大数据
阿里云大数据AI技术4 天前
Flink Forward Asia 2026 深圳启幕:Agentic Streaming for AI,开启实时智能新范式
大数据·flink
SelectDB5 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
大大大大晴天8 天前
Hudi技术内幕:RecordPayload到RecordMerger
大数据
SelectDB9 天前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
WhoAmI9 天前
MapReduce框架原理解析一:InputFormat
大数据·hadoop