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. 如何优化分布式计算性能?

参考资料

相关推荐
互联网中的一颗神经元4 小时前
04 — 安全撤销:改错了怎么退回去
大数据·安全·elasticsearch
marvelyu7 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
ZCBUS实时计算8 小时前
金融证券实时数仓建设实践:轻量化实时计算平台落地,实现交易数据端到端秒级处理
大数据·数据库·数据仓库·金融·flink·dba·etl
海上小飞龙8 小时前
Redis 分布式锁原理:从 SET NX EX 到 Redisson 看门狗
数据库·redis·分布式
烟雨江南7858 小时前
2026汽车制造与新能源整车柔性产线Agentic-Workflow白皮书:跨APS_MES_ERP多智能体动态排产与装配容错实战
大数据·网络·人工智能·自动化·ai客服·企业agent
明达智控技术10 小时前
国产PLC、远程IO模块在食品包装机的应用
分布式·自动化
zhexunnb10 小时前
专业SAP ERP实施,赋能制造企业构建一体化数字内核
大数据
明源云11 小时前
租赁管理系统软件推荐:如何选到真正好用的不动产租赁管理软件
大数据·人工智能·架构
Meya112712 小时前
机柜可视化不靠复杂坐标!三参数轻量化 U 位管理系统落地思路
大数据·人工智能
行思理12 小时前
OPPO PUSH新消息分类,新手教程
大数据·人工智能·推送