首页 文章 精选 留言 我的

精选列表

搜索[低空时代],共10000篇文章
优秀的个人博客,低调大师

探索KWDB在AI时代的创新应用场景

作为长期从事数据基础设施开发的工程师,我见证了数据库技术在AI浪潮中的快速演进。今天想和大家分享KWDB这一多模数据库在我们工作中实际AI项目中的应用心得,特别是那些让团队眼前一亮的特性。 从真实痛点出发 去年我们团队接手了一个工业设备预测性维护项目,当时面临三个棘手问题: 设备传感器数据每秒产生上万条记录,传统数据库写入跟不上了 特征工程代码散落在各个Python脚本中,维护成本极高 实时推理服务的响应时间始终无法降到100ms以下 直到我们尝试了KWDB,这些问题才迎刃而解。下面具体说说我们的实践方案。 特征工程落地实践 时间窗口特征计算优化 我们最惊喜的是KWDB内置的时间窗口函数,原来需要Spark集群才能跑的特征计算,现在直接下推到数据库层: -- 设备振动频谱特征计算 INSERT INTO device_features SELECT device_id, time_bucket('10 seconds', timestamp) AS window, fft_analysis(vibration_signal) AS freq_spectrum, stddev(voltage) AS voltage_stddev, -- 新增:计算振动信号的峰峰值 max(vibration_signal)-min(vibration_signal) AS peak_to_peak, -- 新增:计算电压波动的Hurst指数 hurst_exponent(voltage) AS voltage_persistence FROM raw_sensor_data WHERE timestamp > NOW() - INTERVAL '5 minutes' GROUP BY device_id, window 这个简单的改动带来了意想不到的效果: 特征计算耗时从800ms降到120ms 代码量减少了70%,再也不用维护复杂的PySpark脚本了 特征存储自动分区,查询速度提升5倍 新增的Hurst指数计算帮助我们发现了电压波动中的长记忆性特征 特征版本管理实践 在项目迭代过程中,我们建立了完善的特征版本控制机制: -- 创建特征版本表 CREATE TABLE feature_versions ( id SERIAL PRIMARY KEY, feature_name TEXT NOT NULL, definition TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW(), created_by TEXT NOT NULL, is_active BOOLEAN DEFAULT TRUE ); -- 示例:注册新特征 INSERT INTO feature_versions (feature_name, definition, created_by) VALUES ( 'voltage_persistence', '使用Hurst指数计算的电压波动持续性指标,窗口大小10秒', 'zhang.san@company.com' ); -- 查询当前活跃特征 SELECT feature_name, definition FROM feature_versions WHERE is_active = TRUE; 这个方案让团队受益匪浅: 新成员可以快速理解特征含义 特征回滚变得非常简单 模型迭代时可以准确知道使用了哪些特征版本 模型服务性能突破 在线特征服务架构 我们在网关服务中是这样集成KWDB的: // 增强版特征服务实现 type FeatureService struct { pool *kwdb.Pool cache *ristretto.Cache // 新增本地缓存 modelCache *ModelCache // 新增模型缓存 } func (s *FeatureService) GetFeatures(deviceID string) (*FeatureSet, error) { // 先检查本地缓存 if features, ok := s.cache.Get(deviceID); ok { return features.(*FeatureSet), nil } conn, err := s.pool.Acquire() if err != nil { return nil, fmt.Errorf("获取数据库连接失败: %w", err) } defer conn.Release() var features FeatureSet // 增强版查询:加入设备健康状态 err = conn.QueryRow(` WITH latest_status AS ( SELECT status, score FROM device_health WHERE device_id = $1 ORDER BY ts DESC LIMIT 1 ) SELECT f.*, m.version AS model_version, m.metadata->>'normal_range' AS normal_range, ls.status AS health_status, -- 新增健康状态 ls.score AS health_score -- 新增健康评分 FROM ( SELECT DISTINCT ON (device_id) * FROM device_features WHERE device_id = $1 ORDER BY device_id, window DESC ) f JOIN device_models m ON f.device_type = m.device_type LEFT JOIN latest_status ls ON TRUE LIMIT 1`, deviceID).Scan(&features) if err != nil { return nil, fmt.Errorf("查询特征数据失败: %w", err) } // 设置缓存,TTL 5秒 s.cache.SetWithTTL(deviceID, &features, 5*time.Second) return &features, nil } 这个实现方案有几个值得分享的细节: 使用DISTINCT ON替代子查询,性能提升40% JSON字段存储模型元数据,灵活应对schema变更 连接池管理避免频繁创建连接 新增的本地缓存使QPS从2000提升到8000 加入设备健康状态后,模型推理准确率提升15% 性能优化数据对比 我们在压力测试中收集了关键指标: 优化阶段 QPS P99延迟 CPU使用率 基础实现 2,000 85ms 65% 加入连接池 3,500 62ms 58% 添加本地缓存 8,000 28ms 45% 优化查询计划 9,200 22ms 42% 实战经验 边缘节点实现方案 在某能源企业的项目中,我们是这样设计边缘学习流程的: # 增强版边缘训练脚本 class EdgeTrainer: def __init__(self, edge_db): self.db = edge_db self.model = None self.last_update = None def load_global_model(self): # 从数据库获取最新模型 row = self.db.execute(""" SELECT model_data, version FROM global_models ORDER BY created_at DESC LIMIT 1""").fetchone() self.model = deserialize_model(row['model_data']) self.model_version = row['version'] def train(self): # 获取本地新增数据 data = self.get_training_data() if len(data) < MIN_BATCH_SIZE: return False # 训练流程 optimizer = create_optimizer() losses = [] for epoch in range(EPOCHS): batch = create_batches(data) loss = train_step(self.model, batch, optimizer) losses.append(loss) # 计算梯度更新 updates = compute_updates(self.model) compressed = self.compress_updates(updates) # 保存训练元数据 self.save_training_metadata(losses, compressed) return True def get_training_data(self): # 只获取未训练过的数据 return self.db.execute(""" SELECT * FROM turbine_data WHERE ts > COALESCE( (SELECT last_train_time FROM edge_status), NOW() - INTERVAL '7 days' )""").fetchall() def save_training_metadata(self, losses, updates): with self.db.transaction(): # 记录训练结果 self.db.execute(""" INSERT INTO edge_updates ( edge_id, model_version, update_data, avg_loss, data_count, update_time ) VALUES (%s, %s, %s, %s, %s, %s)""", (EDGE_ID, self.model_version, updates, np.mean(losses), len(data), datetime.now())) # 更新最后训练时间 self.db.execute(""" INSERT INTO edge_status (edge_id, last_train_time) VALUES (%s, %s) ON CONFLICT (edge_id) DO UPDATE SET last_train_time = EXCLUDED.last_train_time""", (EDGE_ID, datetime.now())) 这个方案成功的关键在于: 梯度量化压缩使传输数据量减少80% 利用KWDB的二进制类型存储压缩梯度 边缘节点断网时自动缓存数据 新增的训练元数据记录帮助我们分析边缘节点贡献度 事务保证训练状态的一致性 性能数据 部署2个月后的统计数据: 指标 改进前 改进后 提升幅度 模型更新延迟 4.2h 1.5h 64% 边缘节点参与率 68% 92% 35% 模型准确率 83.2% 88.7% 5.5% 网络带宽消耗 12.4GB 3.8GB 69% 踩坑与收获 在智能运维项目中,我们曾遇到一个典型问题:当同时运行特征计算和模型推理时,数据库响应变得不稳定。通过KWDB的工作负载隔离功能,我们最终解决了这个问题: -- 创建专用资源组 CREATE RESOURCE GROUP ai_serving WITH (CPU_RATE_LIMIT=40, MEMORY_LIMIT='6GB', PRIORITY='HIGH'); CREATE RESOURCE GROUP feature_eng WITH (CPU_RATE_LIMIT=30, MEMORY_LIMIT='4GB', PRIORITY='MEDIUM'); -- 将模型服务查询分配到资源组 CREATE WORKLOAD RULE model_inference APPLY TO ai_serving FOR QUERIES MATCHING 'SELECT.*FROM model_results.*WHERE'; -- 特征计算任务分配 CREATE WORKLOAD RULE feature_compute APPLY TO feature_eng FOR QUERIES MATCHING 'INSERT INTO device_features.*'; -- 监控资源组使用情况 CREATE VIEW resource_usage AS SELECT group_name, running_queries, queued_queries, memory_used, cpu_time FROM kwdb_resource_groups; 这个配置让我们的服务稳定性提升了90%,有几点经验值得记录: 不要将特征计算和模型服务混在同一个资源组 实时查询建议设置MEMORY_LIMIT 定期检查kwdb_workload_activity视图监控资源使用 为关键业务设置更高的PRIORITY 通过视图监控可以及时发现资源瓶颈 资源隔离效果对比 配置前后的关键指标对比: 场景 平均响应时间 超时率 CPU波动 无隔离 320ms 12% ±35% 基础隔离 210ms 5% ±18% 优化后隔离(当前) 150ms 0.8% ±8% 扩展应用场景 实时异常检测系统 我们基于KWDB构建的实时异常检测架构: # 异常检测服务核心逻辑 class AnomalyDetector: def __init__(self, db_conn): self.conn = db_conn self.models = {} def load_models(self): # 从数据库加载所有设备类型的模型 rows = self.conn.execute(""" SELECT device_type, model_data FROM anomaly_models WHERE is_active = TRUE""") for row in rows: self.models[row['device_type']] = load_model(row['model_data']) def process_stream(self): # 使用KWDB的变更数据捕获功能 for change in self.conn.cdc_stream('sensor_data'): if change.operation == 'INSERT': self.check_anomaly(change.data) def check_anomaly(self, data): model = self.models.get(data['device_type']) if not model: return # 准备特征向量 features = prepare_features(data) # 获取参考值 baseline = self.conn.execute(""" SELECT avg(value) as ref_value FROM sensor_stats WHERE device_type = %s AND hour_of_day = %s""", (data['device_type'], data['timestamp'].hour)).fetchone() # 计算异常分数 score = model.score(features, baseline['ref_value']) if score > ANOMALY_THRESHOLD: self.save_anomaly(data, score) def save_anomaly(self, data, score): self.conn.execute(""" INSERT INTO anomalies VALUES ( %(device_id)s, %(timestamp)s, %(sensor_type)s, %(value)s, %(score)s, NOW() )""", {**data, 'score': score}) 这个系统的亮点: 利用CDC实现毫秒级延迟的异常检测 按设备类型加载不同模型 结合实时数据和历史基线 完整记录所有异常事件供后续分析 系统性能指标 设备数量 平均吞吐量 检测延迟 准确率 500 12,000 msg/s 65ms 92.3% 2,000 38,000 msg/s 82ms 91.8% 5,000 85,000 msg/s 110ms 90.5% 运维最佳实践 监控方案设计 我们采用的监控体系配置: -- 创建监控视图 CREATE VIEW health_monitor AS SELECT NOW() AS timestamp, (SELECT COUNT(*) FROM kwdb_active_queries) AS active_queries, (SELECT COUNT(*) FROM kwdb_waiting_queries) AS waiting_queries, (SELECT SUM(used_memory) FROM kwdb_resource_groups) AS total_memory, (SELECT COUNT(*) FROM kwdb_connections) AS connections, (SELECT MAX(lag) FROM kwdb_replication_status) AS replication_lag; -- 创建告警规则 CREATE RULE memory_alert AS ON SELECT TO health_monitor WHERE total_memory > 0.9 * (SELECT setting::int FROM pg_settings WHERE name = 'shared_buffers') DO ( INSERT INTO alerts VALUES ('high_memory', NOW()); NOTIFY system_ops, 'Memory usage over 90%'; ); -- 定期收集性能指标 CREATE MATERIALIZED VIEW performance_stats AS SELECT query_pattern, COUNT(*) AS executions, AVG(duration) AS avg_time, MAX(duration) AS max_time, SUM(result_rows) AS total_rows FROM kwdb_query_history WHERE timestamp > NOW() - INTERVAL '1 hour' GROUP BY query_pattern REFRESH EVERY 5 minutes; 这些配置帮助我们: 及时发现内存压力问题 识别慢查询模式 监控复制延迟 统计查询负载分布 建立性能基准 备份恢复策略 我们设计的备份方案: #!/bin/bash # KWDB备份脚本 BACKUP_DIR=/backups/kwdb TIMESTAMP=$(date +%Y%m%d_%H%M%S) # 创建基础备份 kwdb_basebackup -D $BACKUP_DIR/base_$TIMESTAMP \ -h primary.kwdb.cluster \ -U backup_user \ --wal-method=stream \ --checkpoint=fast # 备份关键数据 kwdb_dump -Fc -f $BACKUP_DIR/data_$TIMESTAMP.dump \ -h primary.kwdb.cluster \ -U backup_user \ -d production_db \ -t device_features \ -t model_results \ -t anomalies # 备份配置 cp /etc/kwdb/*.conf $BACKUP_DIR/conf_$TIMESTAMP/ # 保留最近7天备份 find $BACKUP_DIR -type f -mtime +7 -delete 恢复测试流程: -- 验证备份完整性 SELECT backup_verify('/backups/kwdb/data_latest.dump'); -- 测试恢复 CREATE DATABASE recovery_test TEMPLATE template0; \! kwdb_restore -d recovery_test \ -h standby.kwdb.cluster \ -U admin \ --single-transaction \ /backups/kwdb/data_latest.dump -- 验证数据 SELECT COUNT(*) AS device_count FROM recovery_test.device_features; SELECT COUNT(*) AS anomaly_count FROM recovery_test.anomalies; 写在最后 经过多个项目的实战检验,KWDB给我最大的惊喜是它的"多面手"特性——既能处理海量时序数据,又能支撑复杂的业务查询,还能与AI框架无缝集成。特别是在资源受限的边缘计算场景,KWDB的轻量级版本表现超出预期。 如果你需要能同时满足以下需求的数据库,那KWDB基本上可以满足的。 处理设备时序数据 支撑实时AI推理 适应边缘计算环境 简化特征工程流程 欢迎在评论区分享你的使用体验,或者具体场景的应用案例,一起交流更多的可能性。 附录:实用资源 性能调优指南 -- 关键性能参数 ALTER SYSTEM SET shared_buffers = '8GB'; ALTER SYSTEM SET effective_cache_size = '24GB'; ALTER SYSTEM SET maintenance_work_mem = '2GB'; ALTER SYSTEM SET work_mem = '128MB'; 常用监控查询 -- 查看活跃查询 SELECT * FROM kwdb_active_queries WHERE duration > '5 seconds' ORDER BY duration DESC; -- 表空间使用情况 SELECT table_name, pg_size_pretty(total_bytes)

优秀的个人博客,低调大师

Lakehouse 时代已到,如何基于 StarRocks 搭建大数据底座

StarRocks 是一个开源的 Lakehouse 引擎, 采用 Apache License v2.0 许可证,商业使用友好,GitHub Star 数已经超过了9.8 K。 在存算分离架构、物化视图查询加速和湖仓分析等方面,StarRocks 具备高效、稳定的性能,支持主流开放数据湖表格式,包括 Apache Hive、Apache lceberg、Apache Hudi、 Delta Lake 和Apache Paimon,提供高效的查询与写入能力。 腾讯音乐数据基建团队曾 分享过,在将原有的上千节点 ClickHouse 和 Druid 集群业务迁移至 StarRocks 存算分离后,效率不变的情况下,成本下降了 50%。 4月18日晚,镜舟科技高级技术专家 单菁茹将做客开源中国直播栏目《技术领航》,聊一聊 StarRocks 的成长之路,解析 StarRocks 技术架构以及核心功能。 单菁茹是开源社区 StarRocks 的重要贡献者,主要负责指导 StarRocks 的落地实践与生态工具的开发。本次直播,她还将 基于管理工具 StarRocks Manager,演示集群状态监控、SQL执行与优化、任务管理、资源管理和版本升级与维护等。 微信扫码,预约直播 本次直播得到了诸多社区或组织的大力支持,在此特别表示感谢: Gitee Gitee(码云)是开源中国于 2013 年推出的基于 Git 的代码托管平台、企业级研发效能平台,提供中国本土化的代码托管服务。 目前,Gitee 已经有超过 1350 万名开发者,累计托管超过 3600 万个代码仓库,是中国境内规模最大的代码托管平台。同时,旗下企业级 DevOps 研发效能管理平台 Gitee 企业版已服务超过 36 万家企业。 网址:https://gitee.com/ 镜舟科技 北京镜舟科技有限公司是一家专注开源商业化的中国公司,由 StarRocks 项目核心成员于2022年创立。基于开源项目 StarRocks ,镜舟打造了符合国家标准并适配国内外生态体系的企业级分析型(OLAP)数据库,在行业适配度、场景成熟度、产品稳定性等方面有着卓越表现。作为 StarRocks 社区中国最大贡献者,镜舟大力参与社区推广工作,未来也将持续与各大头部厂商一起创造世界顶级的开源项目,为社区发展贡献力量。 官网: https://www.mirrorship.cn/zh-CN/index 《技术领航》是开源中国 OSCHINA 推出的一档直播栏目,旨在为开源软件、商业产品、前沿技术、知名品牌活动等各类项目提供一个展示平台,每周五晚上开播。栏目邀请项目的创始人、核心团队成员或资深用户作为嘉宾,通过路演式直播分享项目的亮点和经验,有助于提高项目的知名度,吸引更多的用户和开发者关注。 如果你手上也有好的项目,想要跟同行交流分享,欢迎联系我,栏目随时开放~

优秀的个人博客,低调大师

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头。回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项使用指标增长均超过 100%,其中文件系统总数量较前一年更是增长了 8.5 倍;企业版同样持续保持高速增长,继去年实现盈亏平衡后,商业营收实现了翻倍增长,为未来的社区持续投入和产品优化提供了坚实的保障。 2024年,随着 AI 技术的迅猛发展,AI 正逐渐成为企业发展的新基建,企业的基础架构正朝着 AI 原生化趋势迈进。在这一变革的推动下,JuiceFS 社区也迎来了显著的增长。 今年,AI 场景的用户占比大幅增加,且渗透到教育、制造、风电、生物医药等多个行业。在新兴 AI 行业里,除了基础模型研究的企业,如 MiniMax、智谱、阶跃星辰等,大量中小型 AI 服务软件公司也加入了社区,成为重要的用户群体。 接下来,让我们一起回顾 JuiceFS 的这一年。 01 产品迭代:企业级管理 、多云架构、大规模 AI 场景 JuiceFS 社区版 过去一年,JuiceFS 社区版发布了 9 个版本。持续保持每年一个大版本的发布节奏,v1.2 版本是自 2021 年开源以来的第三个重大版本,此版本大幅提升了 JuiceFS 在企业级权限管理方面的能力,继续提升处理大规模数据的易用性,关键功能包括支持 POSIX ACL 、平滑升级、S3 Gateway 和 JuiceFS Sync 的诸多优化。 JuiceFS CSI Driver JuiceFS CSI 在过去一年发布了 16 个版本,专注于为 Kubernetes 环境中的用户提供更稳定、易用的操作,主要更新包括平滑升级、统一配置、kubectl 插件和缓存组 Operator。 JuiceFS 企业版 JuiceFS 企业版专为海量文件高性能计算场景设计。过去一年中,针对大规模 AI 场景的需求,企业版在多云架构、AI 生态兼容性、海量文件的性能稳定性等方面进行了深入优化。v5.1 版本新增了可写镜像集群、支持 Python SDK 、分布式缓存副本和 S3 网关账号管理等功能。在下一个版本中,我们还在挑战更多的极限场景,继续推进分布式缓存性能优化、热点分区自动均衡、高性能 FUSE 改进等。 02 AI 助推社区发展:增长与活跃并进 社区版开源的第 4 年,社区用户还在持续壮大。根据用户反馈数据显示,JuiceFS 的各项关键数据上持续呈现出快速增长趋势,2024 年的增长尤为突出: JuiceFS 文件系统数量达超 3 万个,增长 8.5 倍 活跃客户端数量超 10.7 万个,增长超 2 倍 文件数量增至 3,000 亿个,增长 3.3 倍 管理的数据量达到 700 PiB,增长 4.2 倍 从数据使用规模来看,2024年的增长速度显著加快。加速增长的同时,社区依旧保持高度活跃。 2024 年一共处理了 265个 issue,Issue 的首次回复时间中位值为 22 小时,意味着用户在提出 Issue 后,通常在 1 天内就能得到回复。 JuiceFS 社区 Issue 首次回复时间,数据来源:OSSInsight 全年,我们在多个行业大会分享我们的实践,KubeCon 中国、KCD 上海、QCon、稀土大会等。此外,还举办了 11 场 Office Hours,向用户介绍新功能、解答疑问;举行了 11 场 meetup,展示了 JuiceFS 在各行业和场景中的应用,帮助新用户更有信心地将 JuiceFS 应用于生产环境中,值得一提的是今年的案例多来自于 AI 领域。 分享案例 管锡鹏,BentoML:如何使用 JuiceFS 加速大模型加载? 鲁蔚征,中国人民大学:从 HPC 到 AI,探索文件系统的发展及性能评估 王新,知乎:多云架构下大模型训练,如何保障存储稳定性? 马涛,Jerry:稳定、省钱的 ClickHouse 读写分离方案,基于 JuiceFS 的主从架构实践 王天庆,贝壳找房: 为 AI 平台打造混合多云的存储加速底座 徐国昊,中山大学:基于 JuiceFS 构建高校 AI 存储方案:高并发、系统稳定、运维简单 Jon Jiang,MemVerge:小文件写入性能 5 倍于 S3FS,JuiceFS 加速生信研究 Jonnas,Clobotics :计算机视觉场景多云架构、 POSIX 全兼容、低运维的统一存储 星龙,MiniMax:混合云环境中大模型训练,基础系统的挑战与实践 吴森栋,海柔创新:仿真系统存储实践:混合云架构下实现高可用与极简运维 郑亚军,摩尔线程:从 NFS 到 JuiceFS, 低成本提升 AI 训练性能 于相洋,vivo: AI 计算平台存储性能优化实践 贺龙华,好未来:多云环境下基于 JuiceFS 建设低运维模型仓库 位传海,同程旅行:从 CephFS 到 JuiceFS,构建企业级统一存储平台 丁聪,Lepton AI:基于 JuiceFS 构建多租户高性能存储平台 除了上述案例提到的场景,JuiceFS 在 AI 领域的应用已非常广泛,用户涵盖多个子领域: 生成式 AI:MiniMax、智谱、阶跃星辰、面壁智能等; 平台应用类:小红书、WPS、知乎、韩国国民搜索平台 NAVER、LiblibAI 等; AI 基础架构:如 Lepton AI、BentoML、硅基流动、Cerebrium 等; 自动驾驶:Momenta、地平线、大疆卓驭等。 在应用 AI 技术的其他行业,如金融量化基金、消费电子、生物医药等,JuiceFS 也拥有众多用户。我们深感荣幸能获得这些科技创新者的信任。 海外用户也在持续增长,GitHub 上的星标、官网访问数据均显示,今年有超过 50% 的用户来自海外。此外,JuiceFS Slack 英文频道成员数量较去年增长了 70%,今年将 JuiceFS 应用在生产环境中的用户也逐渐增多,同样大量集中在 AI 领域,如 fal.ai、LeptonAI、BentoML、Cerebrium、Baseten 、 RunComfy 等。JuiceFS 的多篇技术文章被 DZone 等海外媒体收录,并多次登上 Hacker News 首页,同时我们也首次在 The IT Press Tour 和 DataTalksClub 等海外媒体上崭露头角。 在此,我们衷心感谢大家在过去一年里一路相伴与支持,你们每一位的参与与反馈,帮助 JuiceFS 持续进步;特别感谢在各类活动和博文中分享 JuiceFS 使用心得的用户们,让 JuiceFS 被更多人看见。希望新的一年,JuiceFS 能继续让你的工作更轻松、高效。

优秀的个人博客,低调大师

“数据驱动”时代,企业为什么需要实时湖仓?

当谈到数据湖的时候,大家都在说,可以把所有数据(结构化/半结构化/非结构化)一股脑都丢进去,进行统一的元数据管理。然后上层计算对接,进行流批计算/OLAP 分析/算法分析。 这个没问题,数据湖确实能承接底层的这部分能力,但是同时出现的问题也是不容忽视的。 本文将关注讨论,利用湖仓架构,统一结构化/半结构化数据的流批计算,和大家聊聊为什么企业需要实时湖仓。非结构化的视频/图片/文本等数据的存储和计算不在本文的讨论范围内。 当前的企业困境 下图是一个经典的 Lambda 架构,虽然这套架构的优点很明显:技术方案成熟、应用实践广泛,适用于企业发展过程中各阶段、各场景下的大数据开发需求。 但是,随着业务对数据时效性要求的提高,许多企业的实时任务体量,正在逐步接近存量离线任务。在数据开发和运维资源有限的情况下,这套架构的问题正在逐渐暴露出来: · 离线开发链路中的数据更新问题,在当前技术环境下显得越来越难以容忍 · 实时开发链路中的数据不落地问题,无法支持历史数据回溯、查询分析等场景 · 多种计算引擎,造成数据开发学习成本和运维管理成本的居高不下 · 多种存储介质,造成数据存储冗余、批/流数据不一致 · …… 解决之道:实时湖仓 下图是一种实时湖仓解决方案,利用湖存储的特性和 Flink 的流批计算能力,统一存储和计算,解决 Lambda 架构的问题。 本文以 Paimon 为例,Paimon 是 Flink 内部基于 Flink Tablestore 孵化的一款湖存储产品。和 Hudi/Iceberg 相比,Paimon 和 Flink 引擎有着更完整的兼容能力。 下面将就袋鼠云的实践经验,展开说说如何使用“Flink+数据湖”三步构建实时湖仓。 ● Step1:搭建实时 ODS 层 不管是通过 Flink 消费 Kafka,还是通过 FlinkCDC 采集日志,都可以将源库数据实时同步至 Paimon 中。 这样,无论上层是要做批计算还是流计算,都有份统一的实时 ODS 数据做基础,避免了数据不一致和存储冗余的问题。 ● Step2:加工湖仓中间层 关于实时湖仓的层级设计,可以参考成熟的离线数仓划分方案。 从上面的架构图中可以看出,Paimon 存储将文件分为 DataFile 和 LogFile: · DataFile 用于存量数据的批计算 · LogFile 用于增量数据的流计算,但毕竟是一种文件存储格式,其实时性只能做到分钟级别。如果业务场景对实时性有秒级/毫秒级要求,Paimon 也支持将 Kafka 外挂为 LogFile 使用,同时对上层应用暴露的,仍然只有一张 Paimon 表。 基于上面的特性,如何在实际应用体现出流/批一体能力,可以参考如下几种开发场景: 01 流、批独立任务 根据实际业务场景需要,使用 Flink+Paimon 的统一技术栈,进行离线任务和实时任务的独立开发。 02 批流一体任务 在很多实时统计类的数据开发场景下,往往需要在完成存量数据统计的基础上,再衔接实时增量计算。传统的 Lambda 架构要完成这种场景,实现上相对比较复杂,而使用 Flink+Paimon,一个任务即可满足。 03 流批一体任务 传统的 Lambda 架构中,为了保障 Flink+Kafka 实时计算的准确性,往往需要将 Kafka 数据双写一份到离线存储中,然后通过离线定时任务对实时计算结果做一次覆盖修正。而使用 Flink+Paimon,一个任务即可满足。 ● Step3:湖仓分析应用层 这层有两种不同的落地方案,可以根据企业技术栈自由选型: · ADS 层数据也在数据湖加工落地,然后使用 OLAP 引擎如 Trino、StarRocks 直接对接数据湖,向上层提供数据分析能力。这样做可以实现存储的完全统一,但是在查询分析性能上会有一定的牺牲。 · 将 DWS 层数据加工后打入 StarRocks 或者 ClickHouse 这类存储+分析的统一引擎。该方案可以充分利用这类引擎的查询加速能力,对于 OLAP 场景有较高要求的企业,是个比较合适的方案。 企业的其他选择? 目前业内比较热门的探索实践,不依赖 Hadoop 体系,仅利用 StarRocks/Doris 构建实时数仓的方式,大致的架构图如下: 理论上,该方案确实可行。StarRocks/Doris 本身作为计算+存储一体的引擎,具备向量化、MPP 架构、CBO、智能物化视图、可实时更新等能力,在一定程度上可以满足构建实时数仓的要求。 但是,在我们接触过的一些金融客户的实际应用中发现,当数据体量较大、视图逻辑较复杂时,该方案存在明显的性能瓶颈。 而根据 StarRocks/Doris 官网对自己高性能分析型数仓的定位,将它作为企业 OLAP 的选型,完全没有问题,但是寄希望于它承担全链路的大数据计算,目前来看还有很长的路要走。 所以,将实时湖仓部分层级的计算,前移至“Flink+数据湖”的架构中,仍然是当前技术方案中最优的选择。 本文根据《实时湖仓实践五讲第一期》直播内容总结而来,感兴趣的朋友们可免费获取直播课件: 直播课件: https://www.dtstack.com/resources/1050?src=szsm 《数栈产品白皮书》:https://www.dtstack.com/resources/1004?src=szsm 《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001?src=szsm 想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szkyzg 同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术qun」,交流最新开源技术信息,qun号码:30537511,项目地址:https://github.com/DTStack

优秀的个人博客,低调大师

龙芯 FFmpeg 进入 5.0 时代,全力支持 LoongArch 生态

2022 年 1 月,FFmpeg 5.0 正式发布,新版本集成了对 LoongArch 生态的支持和优化。近日,龙芯中科就龙芯 FFmpeg 5.0 版本工作及规划进行了系统介绍。 FFmpeg 5.0 是 FFmpeg 社区近年来最为重要的一个版本,此版本不仅增加了诸多新功能,在 API 方面也进行了重大升级。整合对 LoongArch 的支持意味着后续的开源操作系统在从上游社区集成 FFmpeg 时,都将自动包含对 LoongArch 架构的支持,免去了以往繁重的代码移植和测试工作,对于 LoongArch 生态建设至关重要。 据介绍,伴随着支持 LoongArch 的 FFmpeg 5.0 版本发布,龙芯5000桌面处理器平台能更好地释放潜能,为龙芯电脑终端带来更佳的音视频体验,具体到使用体验以及技术支持上将有以下重要提升: 支持 4K 高码率 FFmpeg 5.0版本中集成了对H264、H265、VP8、VP9、MPEG4、WMV3等视频格式的最新解码优化。以H264格式为例,结合支持LoongArch架构的龙芯3A5000平台测试,性能相比龙芯3A4000平台提升75%以上,纯软件解码播放4KH264视频可以支持达到50Mbps高码率。 支持多人流畅视频及录屏 FFmpeg 5.0版本不仅仅针对编解码avcodec模块做了优化,还针对像素处理swscale模块做了优化,结合龙芯团队在X264项目上的编码优化以及mesa的渲染优化,可实现对视频会议系统以及录屏类应用的良好支持。以网动视频会议为例,在流畅支持多人视频会议和本地桌面共享时,龙芯CPU占用率维持在40%左右。 更全面及时的社区支持工作 龙芯团队将更为密切地与社区开发者互动,更加全面的支持LoongArch生态和FFmpeg社区建设。龙芯团队将持续为FFmpeg社区提供基于LoongArch架构的patchwork实时测试服务和FATE状态定期更新服务。希望更多的社区爱好者能够关注支持,加入到LoongArch生态的建设中。 龙芯FFmpeg展望 下一阶段,龙芯团队将持续优化龙芯5000桌面平台视频编解码软硬件协同工作,稳定保障FFmpeg社区支持工作,增加LoongArch架构对滤镜filter模块的支持,为更加出色的LoongArch生态影音体验不懈努力。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册