首页 文章 精选 留言 我的

精选列表

搜索[AI提效],共10000篇文章
优秀的个人博客,低调大师

高效协同破局,赋能团队提效——WorkBuddy团队协作场景深度使用心得

在数字化团队办公常态化的当下,绝大多数企业部门与项目团队,都长期面临着各式各样的协作痛点:成员信息不同步、任务权责划分模糊、文档版本反复混乱、项目进度难以追踪、跨岗位沟通内耗严重。尤其是多人参与的长线项目推进中,文件来回传输、修改版本杂乱、工作衔接断层、复盘追溯无依据等问题,直接造成项目推进缓慢、返工率居高不下,极大拖累团队整体工作效率与执行力。

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

封面新闻接入伙伴开源的鸿蒙RdbStore数据库组件,提效鸿蒙应用开发

在移动应用体验至上的今天,应用的启动速度与流畅度很大程度上决定了用户留存。近日,国内新闻资讯平台封面新闻率先深度集成由伙伴参与共建、面向鸿蒙生态开源的分布式数据库组件——RdbStore。这一关键实践,不仅带来了应用启动速度与流畅度的显著提升,更在开发模式上实现业内创新,为鸿蒙生态新闻资讯类App的开发与适配提供了实践范例。 传统开发困境,过程式编码成为“效率枷锁” 新闻资讯类应用通常较为依赖实时数据,高效的本地数据管理至关重要,但在传统开发模式中,数据管理开发却容易遇上困难和瓶颈。归因于繁琐的过程式编码,开发团队不仅需要手动编写和维护大量易错的SQL语句,更需在每次数据操作中,重复进行业务对象与ValueBucket的复杂映射、解析组装等。 不仅如此,在开发中更棘手的是,数据库版本迁移、全链路操作日志等关键能力均需从零实现。这些繁琐、繁重的编码任务生产了大量难以维护的代码,在应用快速迭代中演变成沉重的技术负担,不仅拖慢开发速度,更令开发者难以专注于核心业务创新。 鸿蒙方案破局:RdbStore以声明式开发重塑流程 由头部资讯伙伴共建的鸿蒙分布式数据库RdbStore的开源,为上述开发痛点提供了系统性解决方案。RdbStore作为鸿蒙数据库能力的核心组件之一,其前身为合作伙伴在多年业务场景中沉淀优化的关系映射数据库框架,具备强大的查询优化、升级自动化、日志采集与调优能力。 为更好服务鸿蒙生态,合作伙伴将该数据库能力开放出来,积极参与鸿蒙开发能力的共建工作,并与华为团队深度配合完成鸿蒙化适配和全链路性能调优,最终形成RdbStore开源版本。此次在鸿蒙版封面新闻中的成功落地,是该共建成果的规模化应用实践之一。 RdbStore组件库提供了一套先进的声明式开发框架,从根本上改变了数据库的开发范式。RdbStore通过声明式数据库配置与Entity类自动映射表结构,有效避免开发者手写SQL、减少手动干预,显著提升开发效率。其面向对象的数据库增删改查操作能力,能减少手动映射字段的代码、提升可读性。 此外,RdbStore提供的重新创建新数据库能力,特别适用于“版本需要快速更新迭代”的应用,显著简化了开发流程并提升了可维护性。内置的日志能力还能令版本迭代与问题排查变得轻而易举,维护效率显著提升。 用户体验跃升:智能缓存策略实现“瞬时呈现” 基于RdbStore高效可靠的API能力,鸿蒙版封面新闻实现了“首页瞬时呈现”的流畅体验,而实现该流畅体验的核心在于一套智能本地缓存策略:当用户首次访问应用时,首页频道数据以及第一页信息流数据便已异步至本地RdbStore数据库中建立缓存;后续启动应用时,界面线程可直接从RdbStore中读取已缓存数据,最大化消除了网络请求导致的白屏等待,实现近乎零延迟的首屏瞬时渲染。这一优化使应用首页加载流畅度显著改善,即便在弱网环境下,用户也能获得“秒开”的畅快体验。 现如今,倘若某位用户想要在拥挤的早高峰地铁车厢里阅读新闻,那么该用户只需打开鸿蒙系统适配版的封面新闻APP,即可实现顺畅阅读,再也不必担心出现“新闻内容刷新不出来、界面长时间白屏”的窘境了。 拥抱简单、高效的组件,共绘鸿蒙蓝图 封面新闻的此次实践,有效印证了RdbStore在性能与开发效率上的双重优势。而RdbStore所代表的华为与伙伴联合共建创新的模式,正是鸿蒙生态吸引开发者的核心价值。目前,华为已联合伙伴共建了91项鸿蒙场景化创新能力,帮助了1007位伙伴提升开发效率和优化应用体验。面向未来,华为还将继续坚持“共建创新”的理念,携手更多伙伴面向底座技术、通用能力、垂类行业等场景推出系列开发者场景化解决方案,不断提升鸿蒙应用的创新体验和开发效率,与广大开发者共建繁荣的鸿蒙生态。

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

研发提效新选择:Oinone 企业级产品化引擎正式开源 ,邀你体验

不少软件企业长期陷于“交付优先”,重复开发、规范难落地、资产难沉淀,既要应对高强度的个性化需求,又要维护统一标品,效率与质量常陷拉扯。解决的关键是将产品迭代与项目交付分离,在统一架构下沉淀可复用的模块与扩展包,让项目逐步转化为可升级、可规模化的标品 Oinone产品化架构:上层承接客户差异化与行业特性,中层直面市场的标准业务产品,底层沉淀通用能力与标准,确保迭代稳定。通过将需求拆解为模块与扩展包,实现标准化与个性化在同一框架内协同;依托低/无代码一体化、“被集成”原则及国产化全栈支持,保障生态适配与持续演进。现场演示中,标准产品与个性化需求都能快速落地,开发到上线全程在统一规范下完成。 Oinone demo 体验 演示环境 相关视频 ⚡ 直达演示环境 ☕ 账号:admin ☕ 密码:admin 🎬 1. [数式Oinone] #产品化演示# 后端研发与无代码辅助 🎬 2. [数式Oinone] #产品化演示# 前端开发 🎬 3. [数式Oinone] #个性化二开# 后端逻辑 🎬 4. [数式Oinone] #个性化二开# 前端交互 🎬 5. [数式Oinone] #个性化二开# 无代码模式 6.2.0 版本正式开源 Gitee: 后端:https://gitee.com/oinone/oinone-pamirs 前端:https://gitee.com/oinone/oinone-kunlun 20250822 升级内容 镜像版本升级:6.2.11-->6.2.12 后端版本升级:6.2.11-->6.2.12 修复集成设计器新建或复制API时未正确记录日志的问题 修复发布为开放接口时出入参转换异常的问题 修复开放接口调用集成接口时日志保存异常的问题 20250818 升级内容 镜像版本升级:6.2.10-->6.2.11 后端版本升级:6.2.10-->6.2.11 前端版本升级 集成应用-集成接口新增测试功能 集成设计器集成接口详情页面新增测试功能 集成设计器body参数支持保留空值功能 集成设计器的集成接口发布为开放接口后,删除时进行二次确认提示 集成设计器数据库连接支持断开连接和重新连接功能(支持分布式启停) 集成设计器WebService API支持xml解析功能 修复元数据继承计算未正确处理由界面设计器创建的提交动作的问题 修复界面设计器复制视图到子模型时无法复制提交动作的问题 修复界面设计器复制时切换模型时验证不通过的问题 修复从上游生成的菜单无法正确导出的问题 修复集成设计器导出时出现getDriver序列化异常的问题 修复数据可视化快捷日期选择错误的问题 开放dataflow-api和eip-designer-api包 doc教程文档:https://guide.oinone.top/zh-cn/DevManual/Tutorials/#%E4%B8%80%E3%80%81%E5%AD%A6%E4%B9%A0%E5%90%8E%E7%AB%AF%E5%92%8C%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6

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

每日一博 | 提效 7 倍,Apache Spark 自适应查询优化在网易的深度实践及改进

本文基于 Apahce Spark 3.1.1 版本,讲述 AQE 自适应查询优化的原理,以及网易数帆在 AQE 实践中遇到的痛点和做出的思考。 前言 自适应查询优化(Adaptive Query Execution, AQE) 是 Spark 3.0 版本引入的重大特性之一,可以在运行时动态的优化用户的 SQL 执行计划,很大程度上提高了 Spark 作业的性能和稳定性。AQE 包含动态分区合并、Join 数据倾斜自动优化、动态 Join 策略选择等多个子特性,这些特性可以让用户省去很多需要根据作业负载逐个手动调优,甚至修改业务逻辑的痛苦过程,极大的提升了 Spark 自身的易用性和灵活性。 作为网易大数据基础软件的缔造者,网易数帆旗下网易有数团队自 AQE 诞生起就关注其应用。第一个应用 AQE 的系统是 Kyuubi。 Kyuubi 是网易开源的一款企业级数据湖探索平台,它基于 Spark SQL 实现了多租户 SQL on Hadoop 查询引擎。在网易内部,基于 Kyuubi 的 C/S 架构,在保证 SQL 兼容性的前提下,服务端可以平滑地实现 Spark 版本升级,将社区和内部的最新优化和增强快速赋能用户。从 Spark 3.0.2 开始,网易有数就在生产环境中逐步试用和推广 AQE 的特性。而在 Spark 3.1.1 发布后,AQE 在 Kyuubi 生产环境中已经是用户默认的执行方式。在这个过程中,我们还端到端地帮助某个业务迁移了 1500+ Hive 历史任务到 Spark 3.1.1 上,不仅实现了资源量减半,更将总执行时间缩短了 70%以上,综合来看执行性能提升 7 倍多。 当然,AQE 作为一个“新”特性,在实践过程中我们也发现它在很多方面不尽如人意,还有很大的优化空间。秉着坚持开源策略,网易有数努力将团队遇到的问题和 Spark 社区分享,将我们的优化努力合进社区。以下章节,我们将展开介绍这半年多来 AQE 特性在网易的实践经验和优化改进。 AQE 的设计思路 首先明确一个核心概念,AQE 的设计和优化完全围绕着 shuffle,也就是说如果执行计划里不包含 shuffle,那么 AQE 是无效的。常见的可能产生 shuffle 的算子比如 Aggregate(group by), Join, Repartition。 不同于传统以整个执行计划为粒度进行调度的方式,AQE 会把执行计划基于 shuffle 划分成若干个子计划,每个子计划用一个新的叶子节点包裹起来,从而使得执行计划的调度粒度细化到 stage 级别 (stage 也是基于 shuffle 划分)。这样拆解后,AQE 就可以在某个子执行计划完成后获取到其 shuffle 的统计数据,并基于这些统计数据再对下一个子计划动态优化。 图片来自 databricks博客 有了这个调度流程之后,AQE 才可能有接下来的优化策略,从宏观上来看 AQE 优化执行计划的策略有两种:一是动态修改执行计划;二是动态生成 shuffle reader。 动态修改执行计划 动态修改执行计划包括两个部分:对其逻辑计划重新优化,以及生成新的物理执行计划。我们知道一般的 SQL 执行流程是,逻辑执行计划 -> 物理执行计划,而 AQE 的执行逻辑是,子物理执行计划 -> 父逻辑执行计划 -> 父物理执行计划,这样的执行流程提供了更多优化的空间。比如在对 Join 算子选择执行方式的时候可能有原来的 Sort Merge Join 优化为 Broadcast Hash Join。执行计划层面看起来是这样: 动态生成 Shuffle Reader 先明确一个简单的概念 map 负责写 shuffle 数据,reduce 负责读取 shuffle 数据。而 shuffle reader 可以理解为在 reduce 里负责拉 shuffle 数据的工具。标准的 shuffle reader 会根据预设定的分区数量 (也就是我们经常改的 spark.sql.shuffle.partitions),在每个 reduce 内拉取分配给它的 shuffle 数据。而动态生成的 shuffle reader 会根据运行时的 shuffle 统计数据来决定 reduce 的数量。下面举两个例子,分区合并和 Join 动态优化。 分区合并是一个通用的优化,其思路是将多个读取 shuffle 数据量少的 reduce 合并到 1 个 reduce。假如有一个极端情况,shuffle 的数据量只有几十 KB,但是分区数声明了几千,那么这个任务就会极大的浪费调度资源。在这个背景下,AQE 在跑完 map 后,会感知到这个情况,然后动态的合并 reduce 的数量,而在这个 case 下 reduce 的数量就会合并为 1。这样优化后可以极大的节省 reduce 数量,并提高 reduce 吞吐量。 Join 倾斜优化相对于分区合并,Join 倾斜优化则只专注于 Join 的场景。如果我们 Join 的某个 key 存在倾斜,那么对应到 Spark 中就会出现某个 reduce 的分区出现倾斜。在这个背景下,AQE 在跑完 map 后,会预统计每个 reduce 读取到的 shuffle 数据量,然后把数据量大的 reduce 分区做切割,也就是把原本由 1 个 reduce 读取的 shuffle 数据改为 n 个 reduce 读取。这样处理后就保证了每个 reduce 处理的数据量是一致的,从而解决数据倾斜问题。 AQE 优化规则实现都是非常巧妙的,其他更多优化细节就不展开了,推荐阅读 Kyuubi与AQE。 社区原生 AQE 的问题 看起来 AQE 已经是万能的,我们经常遇到的问题点都被覆盖到了,那么实际用起来的时候真的有这么丝滑吗?这里列举一些网易在使用 AQE 过程中遇到的痛点。 覆盖场景不足 就拿 Join 倾斜优化来说,这真的是一个非常棒的 idea,什么都很好但是有一个缺陷:覆盖的场景有限。在网易的深度实践过程中,经常会遇到一些 Join 明明就是肉眼可见的倾斜,但却没有被优化成想象中的样子。这种情况对用户来说会带来极大的困扰,在成百上千行的 SQL 里,哪些 Join 能被优化,哪些不能被优化?要花费很大一部分时间来去校验确认。 广播 Join 不可逆 广播配置 spark.sql.autoBroadcastJoinThreshold 是我们最常修改的配置之一,其优势是可以把 Join 用广播的形式实现,避免了数据 shuffle。但是广播有个很严重的问题:判定一张表是否可以被广播是基于静态的统计数据,特别是在经过一系列的过滤操作后,再完美的代价估计都是不精确的。由这个问题引发的任务失败报错就很常见了,Driver 端的 OOM,广播超时等。而 AQE 中的广播是不可逆的,也就是说如果一个 Join 在进入 AQE 优化前已经被选定为广播 Join,那么 AQE 无法再将其转换为其他 Join (比如 Sort Merge Join)。这对于一些由于错误估计大小而导致被广播的表是致命的。也是我们遇到影响任务稳定性的一大因素。 配置不够灵活 虽然 AQE 真的很好用,但是配置还是不够灵活。比如 stage 级别的配置隔离,我们知道 AQE 是基于 stage 的调度,那么更进一步的,SQL 的配置也可以是 stage 级别的,这样可以最细粒度的优化每一次 shuffle。听起来可能有点过犹不及的感觉,但是最容易遇到的一个需求就是单独设置最后一个 stage 的配置。最后一个 stage 是与众不同的,它代表着写操作,也就是说它决定了最终产生文件的数量。所以矛盾和痛点就这样出现了,最后一个 stage 考虑的是存储,是文件数,而过程中的 stage 考虑的是计算性能,是并发。 网易数帆在 AQE 上的改进 网易是 AQE 这个特性的重度使用者,当然不应该放着这些痛点不管,基于社区版本的分支下我们做了一系列的优化和增强,并且已经把其中的一部分内容 push 到了社区。在开源这个话题上,网易秉持着开放的理念。 回合社区补丁 Spark 的发布周期没有那么频繁,就算小版本迭代一般也要小半年,那么我们不可能只眼睁睁看着一系列的 bug 存在于旧分支。因此网易在 Spark 分支管理上的策略是:自己维护小版本,及时跟进大版本 (小版本可能是从 3.0.1 到 3.0.2,大版本则是从 3.0 到 3.1)。在这个策略下,我们可以及时回合社区新发现的问题。比如 AQE 相关的补丁 SPARK-33933,这个补丁的作用是在执行子物理计划的时候优先执行广播其次 shuffle,从而减小在调度资源不足情况下广播超时的可能性。社区的这个补丁需要到 3.2.0 分支才能发布,但是出于稳定性的考虑,网易内部把它回合到了 3.1.1 分支。 回馈社区 提高广播 Join 的稳定性 为了解决静态估计执行计划的统计数据不准确以及广播在 AQE 中不可逆的问题,我们支持了在 AQE 自己的广播配置 SPARK-35264。这个方案的思路是增加一个新的广播配置 spark.sql.adaptive.autoBroadcastJoinThreshold 和已有的广播配置隔离,再基于 AQE 运行时的统计数据来判断是否可以用广播来完成 Join,保证被广播表的数据量是可信的。在这个条件下,我们可以禁用基于静态估计的广播 Join,只开启 AQE 的广播,这样我们就可以在享受广播 Join 性能的同时兼顾稳定性。 增加 Join 倾斜优化覆盖维度 我们对 Join 倾斜优化做了很多增强,这个 case 是其中之一。在描述内容之前,我们先简单介绍一个 SHJ 和 SMJ (Shuffled Hash Join 简称为 SHJ,Sort Merge Join 简称 SMJ)。SMJ 的实现原理是通过先把相同 key shuffle 到同一 reduce,然后做分区内部排序,最后完成 Join。而 SHJ 相对于 SMJ 有着优秀的时间复杂度,通过构建一个 hash map 做数据配对,节省了排序的时间,但缺点也同样明显,容易 OOM。 一直以来 SHJ 是一个很容易被遗忘的 Join 实现,这是因为默认配置 spark.sql.preferSortMerge 的存在,而且社区版本里触发 SHJ 的条件真的很苛刻。但自从 Spark 3.0 全面地支持了所有类型的 Join Hint SPARK-27225,SHJ 又逐渐进入了我们的视野。回到正题,社区版本的 AQE 目前只对 SMJ 做了倾斜优化,这对于显式声明了 Join Hint 为 SHJ 的任务来说很不友好。在这个背景下,我们增加了 AQE 对 SHJ 倾斜优化的支持 SPARK-35214,使得 Join 倾斜优化在覆盖维度上得到了提升。 一些琐碎的订正 由于 Spark 在网易内部的使用场景是非常多的,包括但不限于数仓,ETL,Add hoc,因此我们需要最大程度减少负面的和误导用户的 case。 SPARK-35239,这个 issue 可以描述为当输入的 RDD 分区是空的时候无法对其 shuffle 的分区合并。看起来影响并不大,如果是空表的话那么就算空跑一些任务也是非常快的。但是在 Add hoc 场景下,默认的 spark.sql.shuffle.partitions 配置调整很大,这就会造成严重的 task 资源浪费,并且加重 Driver 的负担 SPARK-34899,当我们发现某些 shuffle 分区在被 AQE 的分区合并规则成功优化后,分区数居然没有下降,一度怀疑是没有找到正确使用 AQE 的姿势 SPARK-35168,一些 Hive 转过来的同学可能会遇到的 issue,理论上 MapReduce 中 reduce 的数量等价于 Spark 的 shuffle 分区数,所以 Spark 做了一些配置映射。但是在映射中出现了 bug 这肯定是不能容忍的。 内部优化(已开源) 除了和社区保持交流之外,网易数帆也做了许多基于 AQE 的优化,这些优化都在我们的开源项目 Kyuubi 里。 支持复杂场景下 Join 倾斜优化 社区版本对 AQE 的优化比较谨慎,只对标准的 Sort Merge Join 做了倾斜优化,也就是每个 Join 下的子算子必须包含 Sort 和 Shuffle,这个策略极大的限制了 Join 倾斜优化的覆盖率。举例来说,有一个执行计划先 Aggregate 再 Join,并且这两个算子之间没有出现 shuffle。我们可以猜到,在没有 AQE 的介入下,Aggregate 和 Join 之间的 shuffle 被剪枝了,这是一种常见的优化策略,一般是由于 Aggregate 的 key 和 Join 的 key 存在重复引起的。但是由于没有击中规则,AQE 无法优化这个场景的 Join。有一些可以绕过去的方法,比如手动在 Aggregate 和 Join 之间插入一个 shuffle,得到的执行计划长这样子: 我们在这种思路下,以增加规则的方式可以在不入侵 AQE 代码的前提下,自动增加 shuffle 来满足 Join 倾斜优化的触发条件。选择这样处理的理由有 3 个 增加 shuffle 可以带来另一个优秀的副作用,就是支持多表 Join 场景下的优化,可以说是一举两得 不用魔改 AQE 的代码,可以独立于我们内部的 Spark 分支快速迭代 当然这不是最终的解决方案,和社区的交流还在继续 小文件合并以及 stage 级别的配置隔离 Spark 的小文件问题已经存在很多年了,解决方案也有很多。而 AQE 的出现看起来可以天然的解决小文件问题,因此网易内部基于 AQE 的分区合并优化规则,对每个涉及写操作的 SQL,在其执行计划的顶端动态插入一个 shuffle 节点,从执行计划的角度看起来是这样的: 再结合可以控制每个分区大小的相关配置,看起来一切都是这么美好。但问题还是来了,其中有两个最明显的问题: 简单添加一个 shuffle 节点无法满足动态分区写的场景 假设我们最终产生 1k 个分区,动态插入的分区值的数量也是 1k,那么最终会产生的文件数是 1k x 1k = 1m。这肯定是不能被接受的,因此我们需要对动态分区字段做重分区,让包含相同分区值的数据落在同一个分区内,这样 1k 个分区生成的文件数最多也是 1k。但是这样处理后还有有一个潜在的风险点,不同分区值的分布是不均匀的,也就是说可能出现数据倾斜问题。对于这样情况,我们又额外增加了与业务无关的重分区字段,并通过配置的方式帮助用户快速应对不同的业务场景。 单分区处理的数据量过大导致性能瓶颈 成也萧何,败也萧何。把 spark.sql.adaptive.advisoryPartitionSizeInBytes 调大后小文件的问题是解决了,但是过程中每个分区处理的数据量也随之增加,这导致过程中的并发度无法达到预期的要求。因此 stage 级别的配置隔离出现了。我们直接把整个 SQL 配置划分为两部分,最后一个 stage 以及之前的 stage,然后把这两个部分之间的配置做了隔离。拿上面这个配置来说,在最后一个 stage 的样子是 spark.sql.finalStage.adaptive.advisoryPartitionSizeInBytes。在配置隔离的帮助下,我们可以完美解决小文件和计算性能不能兼得的问题,用户可以更加优雅地使用 AQE。 案例分享 多表 Join 倾斜 下面这两张图为 3 表 Join 的执行计划,由于长度的限制我们只截取到 Join 相关的片段,并且没有被优化的任务由于数据倾斜问题没有执行成功。可以明显看到社区版本无法对这类多表 Join 做倾斜优化,而我们在动态插入 shuffle 之后,两次 Join 都成功的被优化。在这个特性的帮助下,Join 倾斜优化的覆盖场景相对于社区有明显提升。 社区版本 内部版本 Stage 配置隔离 在支持了 stage 级别的配置隔离后,我们单独设置了最后一个 stage 的参数,下面两张图是某个线上任务前后两天的执行情况,可以明显看到在配置隔离后,在保证最终产出的文件数一致的情况下,过程中 stage 的并发度得到了提升,从而使任务性能得到提升。 配置隔离前 配置隔离后 任务性能对比 这张图展示了我们部分迁移任务的资源成本以及性能对比,其中蓝线是迁移前的数据,红线是迁移后的数据。可以非常明显看到,在资源成本大幅下降的同时任务性能有不同程度的提升。 总结与展望 首先得感谢一下 Apache Spark 社区,在引入了 AQE 之后,我们的线上任务得到了不同程度的性能提升,也使得我们在遇到问题的时候可以有更多解决问题的思路。在深度实践的过程中,我们也发现了一些可以优化的点: 在优化细节上的角度,可以增加命中 AQE 优化的 case,比如 Join 倾斜优化增强,让用户不用逐个检查不能被优化的执行计划 在业务使用上的角度,可以同时支持 ETL,Add hoc 等侧重点不一样的场景,比如 stage 配置隔离这个特性,让关注写和读的业务都有良好的体验 在完成这个阶段性的优化后,接下来我们会继续深耕在 AQE 的覆盖场景上,比如支持 Union 算子的细粒度优化,增强 AQE 的代价估计算法等。除此之外,还有一些潜在的性能回归问题也是值得我们注意的,比如在做分区合并优化后会放大某些高时间复杂度算子的性能瓶颈。 作为可能是最快在线上使用 Apache Spark 3.1.1 的用户,网易在享受社区技术福利的同时也在反哺社区。这也是网易对技术的思考和理念: 因为开放,我们拥抱开源,深入社区 因为热爱,我们快速接收新的理论,实践新的技术 作者简介:尤夕多,目前就职于网易数帆-有数事业部,专注于开源大数据领域。网易数帆开源项目 Kyuubi Committer / Apache Spark Contributor。 相关阅读: 大数据实战:Kyuubi 与 Spark ThriftServer 的全面对比分析 网易数帆开源Kyuubi:基于Spark的高性能JDBC和SQL执行引擎 拥抱开源,我们是认真的-网易易数2020年Apache Spark贡献总结

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

数据接入提效 90%,存储成本降 70%,京能集团用 TDengine 实现储能数据毫秒级响应

小T导读 :京能集团在储能安全管理平台中采用 TDengine TSDB 作为底层时序数据库。依托 TDengine 企业版的零代码数据写入平台,来自全国 28 家电化学储能电站的数据能够按照统一编码规则高效接入 TDengine 时序数据库中,实现了稳定、高性能的数据采集与管理。在此基础上,借助 TDengine TSDB Flink Connector,系统可快速、稳定地从数据库中读取海量数据,开展实时分析与智能处理,充分释放数据的潜在价值。本文将结合该项目的实践过程,为大家带来深入分享与参考。 项目背景 京能集团储能安全管理平台共接入全国 28 家电化学储能电站,累计测点达 270 万个,由四个平台公司分别负责数据传输与汇聚。系统需要支撑大规模的数据统计分析、事件报警与安全预警,对底层数据库的性能与稳定性提出了极高要求。 鉴于电化学储能项目采集点数量庞大(270 万点)、锂电池热失控的超前预警技术复杂等因素,传统关系型数据库已无法满足高并发写入与海量数据存储的需求。由于这些数据具备时间序列写入、格式固定、写入量巨大等典型特征,我们最终选择采用时序数据库作为系统核心数据底座。 应用实际落地 在充分调研国内多款时序数据库产品后,我们发现,从国内目前的实际情况分析,TDengine TSDB 已成为众多企业在海量数据高速存储、处理与调用场景中的首选方案。基于其成熟的技术体系与稳定的性能表现,我们最终选定 TDengine TSDB 作为平台的底层时序数据库,并结合 Kafka 与 Flink 构建了完整的数据流处理体系,实现了数据的高效传输与实时计算,顺利达成项目预期目标。以下是架构简图: TDengine TSDB 支持多种写入方式 SQL 语言写入 :https://docs.taosdata.com/basic/insert/ 无模式写入:https://docs.taosdata.com/develop/schemaless/ 参数绑定方式:https://docs.taosdata.com/develop/stmt/ 企业版的零代码数据写入--- taosExplorer 数据接入功能:https://docs.taosdata.com/advanced/data-in/ 项目中涉及多个 Kafka 集群、数十个需要接入的 topic。我们重点采用了 TDengine 企业版的零代码数据写入能力,实现了从 Kafka 到 TDengine TSDB 的高效对接。该功能支持灵活配置类似 ETL 的复杂自定义选项,极大简化了数据接入流程和时间,而且数据接入性能完全达到了项目要求。 为了保证数据的合理性,我们出台了《京能集团电化学储能电站安全管理平台和储能电站设备标识编码规则》,通过标准的 kks 编码在 taosX 对 Kafka 数据进行了有效过滤和清理,最终写入 TDengine TSDB。kks 部分编码实例如下: 下图为数据过滤、转换等规则设置: 此外,taosX 数据接入还支持多节点高可用配置。只需在多台 taosX 上部署相同的 Kafka 数据接入任务,并设置相同的 groupId,即可自动实现任务高可用,确保数据接入的连续性与稳定性。 同时,TDengine 还提供完善的 taosX 任务监控机制,可直接通过 Grafana 一键配置,快速生成可视化监控图表: 超级表 + 子表的使用 TDengine TSDB 结合"一个数据采集点一张表"的设计理念,引入了具有创新性的"超级表"机制,从根本上解决了大规模时序数据结构不统一、聚合困难、运维复杂等问题。每个采集点的数据独立存储,天然具备写入无锁、数据顺序追加、块状连续存储等优势。这种设计方式不仅提升了写入与查询性能,还带来了极高的数据压缩效率。 TDengine TSDB 支持对超级表标签进行动态的添加、修改与删除操作,满足设备属性变更、系统扩展等业务需求。 计算、分析处理 在 Flink 计算平台上,我们借助 TDengine TSDB 企业版提供的 Flink 连接器------TDengine TSDB Flink Connector(https://docs.taosdata.com/advanced/data-publisher/Flink/),实现了与 TDengine TSDB 的无缝集成。该连接器可高效、稳定地从 TDengine TSDB 中读取海量时序数据,并在此基础上进行全面、深入的分析处理,充分挖掘数据的潜在价值,极大地提升数据处理的效率和质量。 Flink CDC 主要用于提供数据订阅功能,能实时监控 TDengine TSDB 数据库的数据变化,并将这些变更以数据流形式传输到 Flink 中进行处理,同时确保数据的一致性和完整性。 落地效果 数据接入便利性 :目前我们已接入 20 多个 kafka 数据,后期还会继续增加。得益于 TDengine 企业版零代码数据接入能力,新增任务仅需复制并做少量参数调整即可完成,操作简便高效,整体接入过程较传统方式节省约 90% 的时间成本。 数据查询性能高 :开启数据库缓存功能后,能够实时获取每个设备点位最新值,毫秒级别即可返回结果。 数据存储成本低 :TDengine TSDB 具备出色的数据压缩能力,其二级压缩技术将数据视作无差别的二进制块进行再次压缩。与一级压缩相比,二级压缩的侧重点在于消除数据块之间的信息冗余。目前我们提供的服务器存储远远满足我们项目规划的 5 年数据存储,存储成本估算节省至少 60-70%。 实时订阅:通过 TDengine 提供的 Flink CDC 实时订阅功能,能方便、高效的进行分析、告警等处理,给我们后期分析带来了极大的便利性。 后期规划 目前,我们正在对京能集团储能安全管理平台已经接入的 28 场站数据进行分析和优化,提高数据采集的可靠性和鲁棒性。未来我们会针对 TDengine TSDB 新版本和新功能进行持续跟踪,进一步开发 TDengine TSDB 的内在潜力和各种有效的功能。 近期我们关注到 TDengine 发布了新产品 TDengine IDMP,通过经典的树状层次结构组织传感器、设备采集的数据,建立数据目录,对数据提供情境化、标准化的处理,并提供实时分析、可视化等功能,接下来我们会进一步了解此产品在我们业务中的使用可能。 关于京能集团 北京能源集团有限责任公司是北京市人民政府出资设立的国有独资公司,肩负着保障首都北京能源安全可靠供应的重任。京能集团成立于 2004 年,由原北京国际电力开发投资公司和原北京市综合投资公司合并而成,2011 年、2014 年先后又与北京市热力集团有限责任公司、北京京煤集团有限责任公司实施合并重组,实现了产业链条融合互补。经过多年的资源整合,集团由单一能源产业发展为热力、电力、煤炭、健康文旅等多业态产业格局。2024 年在中国企业 500 强排名第 247 位,中国服务企业 500 强排名第 87 位。 作者:张海增

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

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应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册