计算效率提升 30 倍、存储资源节省 90%,雨润集团基于 Apache Doris 的统一实时数据仓库建设实践

宝塔 Apache 部署 Node.js 项目:挂到子路径,不影响同机其他站点 阅读详情

作者:石公星,雨润集团基础数据平台架构师

导读:数字化转型的浪潮中,高效准确的数据分析能够帮助雨润集团快速洞察市场动态、优化供应链管理、提高生产效率。雨润集团引入了 Apache Doris 构建了统一实时数据仓库,实现了计算效率提升 30 倍、存储资源节省 90%、成本降低超 100 万、人员效率提升 3 倍,为智能化、高效化转型指明了方向。

雨润控股集团是一家集食品、地产、商业、物流、旅游、金融和建筑等七大产业于一体的多元化企业集团,员工总数近 13 万人,下属子(分)公司 300 多家,遍布全国 30 个省直辖市和自治区。企业综合实力位列中国企业 500 强第 112 位,中国制造业 500 强第 39 位,中国民营企业 500 强第 8 位。目前,旗下拥有雨润食品、中央商场两家上市公司。雨润不仅是一个品牌,更是一种生活方式,涉及人民大众生活的方方面面:衣、食、住、行、娱乐等,雨润致力于民生产业,围绕人民大众的生活需求,生产好的产品,提供细致服务,用心创造各种可能。

作为国内知名的食品与农业综合性企业,在数字化转型的浪潮中,雨润集团深刻认识到,数据是企业成功的关键。企业不仅要建立数据驱动的文化,更需要以先进技术来增强数据处理和分析能力并建立完善的数据治理框架,以此帮助企业快速洞察市场动态、优化供应链管理、提高生产效率,以应对快速变化的市场环境并提升核心竞争力。

为此,雨润集团自 2022 年起启动了数据仓库升级项目,引入了 Apache Doris 分别对早期离线数据仓库及实时数仓全面升级改造,构建了统一实时数据仓库。相较于之前,带来了计算效率提升 30 倍、存储资源节省 90%、成本降低超 100 万、人员效率提升 3 倍的显著效益。 不仅强化了雨润集团自身的核心竞争力,更为智能化、高效化转型指明了方向。

业务需求

雨润集团业务数据主要源自生鲜数据、深加工数据和养殖数据这三部分,这些数据具体包括:

  • 生鲜数据: 全国 25 家工厂,需记录每个工厂的屠宰信息、冻品信息、供应商信息以及销售信息。
  • 深加工数据: 全国 17 家工厂,工厂将采购猪、牛、羊等生鲜产品,并将其加工成熟食进行销售,需记录工厂仓库信息、生产费用、采购费用及销售信息。
  • 养殖数据: 全国 8 家养殖场,约养殖 7 万头猪,需记录每头猪的单据数据,包括饲料、产仔、哺乳、配种等信息。

为充分挖掘这些数据的潜在价值,雨润集团希望基于上述几类关键数据,重点提供以下几项数据服务:

  • 离线报表: 每天定时产出 T+1 的 BI 报表,为管理者提供决策支持。管理者可依据报表数据检验销售目标是否达成,对市场占有率、库存周转率进行监控,预警冻品过期信息等。
  • 实时分析: 对当日零售门店的经营数据进行分析,便于门店及时调整销售策略。
  • 即席查询: 为数据分析师提供多维分析宽表,数据分析师可根据宽表生成自助式分析报表、构建数据门户。

早期数据架构

01 基于 Hive 的离线数仓

基于 Hive 的离线数仓.png

雨润集团的业务数据可细分为新零售(包括传统采购、销售、库存)、养殖数据、OA 数据(审批流程数据)、生鲜(采购的猪牛羊以及加工数据)、第三方数据(价格比对)等数据维度,均被存储在业务数据库 MySQL 和 Oracle 中,通过 Sqoop 将以上数据导入到 Hive 离线数仓中进行处理,为用户提供数据服务。具体来说:

  • 在数据接入上: 首先,由 Sqoop 先将 T+1 全量数据导入 TMP 数据库进行临时存储;接着对数据进行 Merge 操作,将数据转移到 ODS 层(这样操作的原因是 Hive 没有主键,分区与不分区性能表现差异较大),进入 ODS 中的全量数据会按照 ODS、DWD、DWS、ADS 标准数仓分层依次进行处理。
  • 在数据计算上:为应对多样化计算需求,该架构部署了 Spark 和 TEZ 这两个计算引擎。Spark 性能较好、主要应对大规模数据的计算任务;TEZ 则是为了缓解某些场景下内存占用资源特别多时造成的内存压力。
  • 在数据应用服务上:经由 Spark 和 TEZ 处理完成的数据会再通过 Sqoop 从 Hive 中迁移到 MySQL 里,由 MySQL 向 BI 报表、数据大屏、数据推送等数据应用提供服务。

02 基于 HBase 的实时数仓

基于 HBase 的实时数仓.png

除了每天定时产出 T+1 的 BI 报表以外,为了应对数据时效性较高的场景,例如业务用户需要对零售门店当日经营数据进行实时查询分析,因此我们在离线数据仓库的基础上加入了实时数据处理链路,通过 Kafka 和 Flink 进行实时数据采集并存储在 HBase 中。考虑到某些场景不仅需要调取/查询当天的数据,甚至需要对当月/年的数据进行查询,因此 T+1 的存量历史数据会与 T+0 的实时增量数据汇总存储至 HBase 中进行合并。整体架构如上图所示:

  • T+0 实时数据:从业务数据库 MySQL 中实时同步 Binlog、利用 Flume 实时采集 IoT 工厂设备端日志,采集到实时数据会存储在 Kafka 消息队列中,通过 Flink 和 Spark 进行指标计算并将结果存储至 HBase 中。
  • T+1 历史数据:T+1 的存量历史数据则会全量存储于 Hive 中,经过 Hive 进行 ETL 处理后通过定时调度写入 HBase 中并对历史数据进行覆盖。

此外,为进一步优化查询性能并降低存储成本,引入了 Redis 作为维度数据的缓存层,将高频访问的热数据缓存于 Redis 中,实现了数据的快速读取与响应,将非频繁访问的冷数据存储在 HBase 中,保证数据可长期被访问。

03 存在的问题

  • 历史数据更新复杂:在离线数仓中,历史数据需要手动 Merge 到 ODS 层,对于上百张业务表来说,此过程耗时耗力,增加了人力成本。
  • 查询效率较低:如果生产环境出现问题,需要对问题进行追溯,而采用 Hive 跑一个批处理任务,短则至少需要 20 分钟。
  • 小文件存储压力大:各业务线数据规模差异较大,比如某些业务线数据压缩后仅有几十 MB,而 HDFS 并不擅长存储这种小文件,会对 NameNode 造成很大压力。
  • 人力成本高:HDFS 的运维复杂,对运维人员能力要求比较高;实时数据架构的需求开发要求工程师要全方位掌握 Hive、Flink 等组件的专业知识,开发一个报表需要 5-6 人天才能完成,使用及开发成本均比较高。

基于 Apache Doris 的全新架构

01 选型思考

针对早期架构暴露的诸多问题,我们希望在满足需求的情前提下,尽可能实现架构精简和高效,以降低开发、运维、管理的复杂性。为此我们进行了深度调研并决定引入 Apache Doris,引入 Doris 主要基于以下考虑:

  • 运维简单:Doris 不依赖外部系统,不存在小文件问题,节点可线性扩展,大大降低了运维复杂度。
  • 便捷迁移:Doris 兼容 MySQL 协议,报表系统只需要简单调整就可以直接对接 Doris,无需投入太多的开发工作量。
  • 性能卓越:Doris 支持向量化执行引擎和物化视图等,可有效提升查询效率;同时 Doris 采用高效的 ZSTD 压缩算法,压缩比可以达到 10 倍,大幅降低了存储成本。
  • 社区活跃:Doris 的社区非常活跃,同时飞轮科技为社区投入一支专业的技术团队,如在使用过程中遇到的任何性问题,只需在社区交流群反馈,即可快速获取解决方案。

02 基于 Apache Doris 建立统一实时数据仓库

 基于 Apache Doris 建立统一实时数据仓库.png

Apache Doris 引入后,我们对离线数仓及实时数仓进行全面升级及改造,构建了统一实时的数据仓库。

在离线数据处理上, 通过自研的 Jar 及 Doris Multi Catalog 将业务数据库数据同步到 Doris 中,数据逐步通过 Doris 的 ODS 层、DWD 层、DWS 层、ADS 层完成清洗、汇总等操作,最后由 ADS 层直接为应用层提供离线数据服务。ODS 层使用了 Doris Unique Key 模型,无需手动 Merge 历史数据,有效降低了数据处理的复杂性。

在实时数据处理上, 通过 Flink CDC 将业务数据库数据实时同步至 Doris ,数据进入 Doris 后同样经过分层处理,由 ADS 层为应用层提供实时数据服务。为避免任务处理时出现异常数据等问题,在实时数据处理流程中,会借助 DataX 进行离线补数。

Apache Doris 的引入,为雨润集团带来非常显著的收益:

  • 人员效率提升 3 倍: 首先,只需掌握 SQL,即可快速完成整个实时报表的开发,人员效率提升 3 倍。其次,之前计算逻辑维护在代码中,如需改动代码,修改、打包、上线等,流程繁琐耗费时间,而当前只需要修改 SQL 就可以修改计算逻辑,流程优雅且简洁。
  • 成本节省 100 万: 依靠 Doris 极致的数据压缩能力和计算性能,减少了资源存储成本及人力投入,实现高达 100 万的成本节省。
  • 计算效率提升 30 倍:相较于 Hive 来说,Doris 计算效率更加高效,效率至少提升 30 倍。
  • 导入便捷高效: 实时数据导入流程简化,仅需在页面配置即可完成,避免了以往基于 Flink Jar 包修改上传的繁琐操作与时间消耗。

自研数据治理平台

为提升数据处理效率、确保数据的质量与安全,我们自研了数据治理平台,并集成了数据服务 API 平台、DDL 转换工具、数据集成、元数据管理、数据大屏等核心功能,便于业务部门高效使用及管理数据。接下来,我们对几个重要的功能进行介绍。

01 数据服务 API 平台

数据服务 API 平台.png

考虑到某些场景数据敏感、某些业务希望把数据中台计算好的数据嵌入到自己的业务系统中,因此,不便于在数据中台展示报表,因此我们基于 Apache Doris 构建了数据服务 API 平台。用户可以在页面上自主配置数据源、请求名称、SQL 配置等操作,当 SQL 配置完成后,就可以从 Doris 中读取数据,数据返回后通过 API 网关的认证授权、黑白名单、精准限流等操作,实现报表内容隐私性的保护。该平台由 Spring Cloud Gateway 提供统一的路由方式,调用数据主要服务 BI 大屏、APP 应用和其他业务系统。

数据服务 API 平台-2.png

该平台使用简便,即使不精通 Java 和 Spring Cloud 也可以实现接口的开发。在满足报表隐私性要求的前提下,不仅降低了数据服务接口开发的难度和成本,也提升了数据服务的灵活性和可定制性。

02 DDL 转换工具

DDL 转换工具.png

在实际应用过程中,我们发现从 MySQL 或者 Oracle 中同步数据表到 Doris 时,可能存在格式不统一的问题。我们可以通过自研的数据治理平台来实现数据类型的转换,以减少数据导入 Doris 时的建表时间,具体功能包括:

  • DDL 转换:识别需要导入到 Doris 的 MySQL / Oracle 字段类型,将这些字段类型转化为 Doris 字段类型,主要通过正则表达式匹配到相应的字符串进行替换。需要说明的是,MySQL 中 varchar 字段导入 Doris 中时,varchar 字段长度需乘以 3。
  • DDL 更新:当原表 DDL 发生变化,并需同步结构到 Doris 时,目前的解决方法是定时扫描 MySQL Scheme 信息,并将其转化为 Doris 对应的语句,执行相应的操作以实现 DDL 更新。
  • 批量创建: 在数据治理平台中,可通过页面勾选多表,批量创建对应的 Doris 表。

在与社区的交流中,我们了解到 Apache Doris Flink Connector 集成了 FlinkCDC,并支持了 MySQL 等关系型数据库的整库同步,无需提前在 Doris 中建表,用户可以直接使用 Connector 快速将上游业务库的表结构及数据接入到 Doris 中,提升了数据同步的效率及一致性。

具体实现为,当 Flink 任务启动后,Doris Flink Connector 将自动识别对应的 Doris 表是否存在。如果表不存在,Doris Flink Connector 会自动创建表,并根据 Table 名称使用侧输出流进行分流,从而实现下游多个表的 Sink 接入;如果表存在,则直接启动同步任务。

参考文档:https://doris.apache.org/zh-CN/docs/ecosystem/flink-doris-connector/

03 数据集成

当前整体架构主要是 DolphinScheduler 进行任务调度,因此我们选择将导入程序打包成 Jar 通过 Shell 方式运行,目前支持 MySQL、Oracle、Doris 数据库类型导入。在运行时候,指定数据库 ID 、查询 SQL 、目标 Doris 表,即可进行数据导入。

数据集成.png

经验分享

我们在探索及使用 Apache Doris 的过程中,积累一些实操的经验,在此分享给读者借鉴参考:

数据集成上:

  • 实时数据导入:建议先攒批后导入,以降低 Complication 次数。建议设置每 30 秒导入/更新一次,避免过于频繁的实时改动。
  • 离线大数据(初始化)导入:建议分批进行导入,如每天有接近 3-4 千万条的财务数据,建议先查询一列的最大值和最小值,将其划分为不同批次,拼接成多个 SQL 分步进行,避免单个任务占用过多资源而导致调度平台瘫痪。

表模型设计上:

  • 索引:对于枚举类型较多的列,建议使用 Bloom Filter 索引;对于枚举类型较少的列,建议使用位图索引。
  • 分桶:为避免数据倾斜,建议选择分散性较广的列作为分桶列。一般来说,我们会将 Where 条件列和 Join 列作为分桶列。

分析计算优化上:

  • 大表间 Join:大表间的 Join 尽量使用 Colocation Join,原因是大表之间的网络开销很大,如果需要进行 Shuffle 操作,代价较高。
  • Join 顺序:建议左表为大表,右表为小表,这样能在开销小的同时更好利用 Runtime Filter,从而提升 Join 性能。

未来展望

未来,雨润集团还计划基于 Doris 进行数据血缘管理和数据地图构建,帮助工程师和分析师更好地管理和理解数据,从而提升数据开发的效率。在血缘管理方面,将构建基于 Doris 的血缘管理平台,当用户在开发 SQL 时,可以将图与图之间的依赖关系存入到图数据库中,并通过可视化表展示表与字段间的血缘关系,便于追溯定位问题、提升开发效率。在数据地图方面,计划基于 Doris 来构建数据地图,对表、对库进行主题域划分和数据域划分,并实现主题索引、表索引和字段索引功能,让数据资产的管理与利用更加高效、便捷。

Vue3+codemirror6实现公式(规则)编辑器 vue3+codemirror6+ts实现公式编辑器,可以插入标签、公式,也有补全提示 阅读详情

相关推荐

百度飞桨+文心大模型实战:生成式AI工程师认证备考全攻略(含真题解析)

本文详细解析百度飞桨与文心大模型结合的生成式AI工程师认证备考策略,涵盖认证体系、学习路径、核心技能突破及真题分析。帮助开发者掌握大模型原理、飞桨平台操作和文心大模型应用,高效通过工信部与百度联合认证考试。

loss4bartender的博客 682

OceanBase 轻量级数仓关键技术解读

为了更好地聚合和治理跨域数据,帮助企业用较低的成本快速聚合分析,快速决策,不断的让企业积累的数据产生价值,从全域海量数据抓取,高性能流批处理,元数据血缘治理等等方面都对数仓类产品提出了非常高的要求。OceanBase 以其天然的分布式架构,高效的存储引擎和强大的数据处理能力,可以很好的帮助企业快速构建低延迟,高性能,低成本的轻量级数据仓库。

码到三十五 2万+

CCC数字钥匙Release 3实战:如何用BLE/UWB实现无钥匙进入(附避坑指南)

本文深入解析CCC数字钥匙Release 3标准下BLE/UWB无钥匙进入系统的开发实践,涵盖硬件选型、安全测距协议、时序同步等关键环节,并提供实战调试技巧与安全攻防案例。特别针对BLE芯片配置、UWB模块选型等常见陷阱给出解决方案,帮助开发者高效实现厘米级精度的数字钥匙系统。

weixin_29326909的博客 254

计算效率提升 30 倍、存储资源节省 90%,雨润集团基于 Apache Doris 的统一实时数据仓库建设实践...

作者:石公星,雨润集团基础数据平台架构师导读:数字化转型的浪潮中,高效准确的数据分析能够帮助雨润集团快速洞察市场动态、优化供应链管理、提高生产效率。雨润集团引入了 Apache Doris 构建了统一实时数据仓库,实现了计算效率提升 30 倍、存储资源节省 90%、成本降低超 100 万、人员效率提升 3 倍,为智能化、高...

weixin_40347508的博客 327

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

VHDL实战:基于EDA的数字频率计(FREQ)设计与优化

本文详细介绍了使用VHDL语言和EDA工具设计并优化数字频率计(FREQ)的全过程。从核心原理与模块划分入手,深入讲解了时钟分频、测频控制、计数锁存及显示驱动等关键模块的VHDL实现,并提供了从代码编写、功能仿真到综合布局布线的完整EDA实战指南。文章还探讨了测量精度优化、资源权衡及跨时钟域处理等进阶话题,是掌握FPGA数字系统设计的经典案例。

milk8的博客 583

雨润集团 统一实时数据仓库:Apache Doris / SelectDB 的技术能力与实践

一句话摘要:雨润集团 使用 Apache Doris / SelectDB 在 统一实时数据仓库 中解决了 离线与实时两套数仓割裂、历史数据手动 Merge 繁琐、Hive 查询需 20 分钟以上、小文件压垮 NameNode、单报表开发需 5-6 人天 的核心问题,关键能力包括 多数据源统一接入(Multi Catalog + Flink CDC)、Unique Key 模型免手工 Merge、ZSTD 10 倍压缩降本、向量化执行与物化视图加速查询。

SelectDB 238

VisionPro - 基础 - 模板匹配技术-Search/PMAlign/PatMax(6)-纹理屏蔽和重叠匹配

Note:对已经有了,1已经训练好的模板,2一组使能的自由度,3一个待测的实时图片,PatMax 就能模板匹配的给出变化的最佳描述。对一些综合的模板,这三个输入值往往是一起影响最后的变换结果信息。例如,如果我们训练了一个圆形的模板,然后搜索一个角度自由度包括一个圆,那么将会有无限个可能的角度满足要求。这些组合的模板匹配,被官方名为:退化系统,a degenerate system的结果被叫做a degenerate result 退化结果4.2 退化系统例子。

山云的专栏 1532

Apache Flink 零基础

低代码、易开发、易维护、可读性强,适配实时数仓分层、指标统计、数据清洗、多源数据关联等绝大多数业务场景,支持Kafka、Doris、MySQL、Hive等主流组件读写,是企业实时开发主流方案。:接收客户端提交的实时/离线任务、解析任务逻辑、生成DAG执行流程图、分配集群资源、调度任务运行、管理Checkpoint/Savepoint、处理任务故障重启、协调集群节点状态。手动触发的状态快照,主要用于任务升级、代码迭代、版本更新、集群迁移、任务重启等运维操作,保证业务无感知、数据不错乱、任务无缝恢复。

2402_85354210的博客 315

【Java基础知识 1】Java入门级概述

优快云最强Java专栏,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例,理论结合实战,实现Java的轻松学习。

学Java,找哪吒 16万+

笔试题-2023-加特兰-数字IC设计【纯净题目版】

笔试题-2023-加特兰-数字IC设计【纯净题目版】

w0shishabi的博客 2248

深入 Apache Hudi Write Operations:一次 Upsert 到底经历了什么?

Apache Hudi Write Operations

喻师傅的学习笔记 666

【RT-DETR有效改进】利用EMAttention加深网络深度提高模型特征提取能力(特征选择模块)

本文给大家带来的改进机制是EMAttention注意力机制,它的核心思想是,重塑部分通道到批次维度,并将通道维度分组为多个子特征,以保留每个通道的信息并减少计算开销。EMA模块通过编码全局信息来重新校准每个并行分支中的通道权重,并通过跨维度交互来捕获像素级别的关系。本文改进是基于ResNet18、ResNet34、ResNet50、ResNet101,文章中均以提供,本专栏的改进内容全网独一份深度改进RT-DETR非那种无效Neck部分改进,

Snu77的博客 3170

每天认识一个组件:Apache Flink

Flink 的核心价值不只是“实时”,而是把持续数据流、事件时间、业务状态和一致恢复放入同一个分布式运行时中。对于实时指标、持续 ETL、CDC、欺诈检测和事件驱动应用,它提供了一套比“消息队列加手工状态管理”更完整的计算模型。

weixin_47983718的博客 624

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

每天认识一个组件:Apache StreamPark

StreamPark 解决的核心问题,不是如何执行流计算,而是如何让流处理应用以统一、可管理的方式进入生产环境,它把 Flink 应用开发与运维中的重复工作收拢到统一控制面。

weixin_47983718的博客 478

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Apache Doris 与 SelectDB 是什么关系?从开源技术到面向 Agent 的极速分析数据库

Apache Doris 与 SelectDB 是什么关系?了解二者的开源技术渊源,以及 SelectDB Cloud、Enterprise、阿里云瑶池数据库 SelectDB、信创适配与面向 Agent 的极速分析数据库能力。

SelectDB 487

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

WPS/Office Word客户端设置文档打开密码,Apache POI 解密—— 原理、实现与踩坑实录

本文介绍基于Apache POI 5.4.1实现的DocxDecryptor工具类,解决金融文档解析中加密docx的打开密码问题。核心原理:通过文件头判断是否为OLE2加密容器,仅支持ECMA-376标准的standard/agile加密模式,拒绝非标加密。关键在于verifyPassword()与getDataStream()必须使用同一Decryptor实例,否则解密失败。实录三大踩坑点:流需支持mark(用BufferedInputStream)、Decryptor不可复用、解密流仅可读一次。提供清晰

学习/总结 415

Apache Flink 2.3.0(最新版本)

Flink是一个用于无界与有界数据流的有状态分布式处理引擎,具备内存级执行速度和弹性扩展能力。其核心特性包括“边来边算”的无界流处理、统一批流处理的有界流模型,以及高效的状态管理。Flink起源于柏林的Stratosphere研究项目,2014年成为Apache顶级项目,阿里巴巴的Blink分支在SQL性能与支持方面贡献显著,推动了Flink SQL的发展。Flink 2.0引入存算分离、物化表等重大更新。学习者可通过官方文档、安装包(如阿里云镜像站)获取资源,掌握从架构到部署的全链路知识。

super_mochi1 308

Apache Doris 基础

需根据业务数据特征精准选择,选错模型会导致数据错误、查询性能极差。

2402_85354210的博客 343

Apache Doris 企业版怎么选?SelectDB 提供同源商业支持、私有化部署与信创适配

Apache Doris 企业版怎么选?了解 SelectDB 与 Doris 的同源关系、企业级商业支持、私有化部署、信创国产化适配,以及阿里云、华为云、腾讯云、AWS 云平台部署方案。

SelectDB 375

Apache Spark4.1.3 一键部署与卸载脚本

本文介绍了一套基于三台主机(node11/node12/node13)的Spark 4.1.3集群一键部署与卸载方案。在已配置主机名、SSH免密、JDK17及Hadoop 3.5.0的前提下,通过spark_deploy.sh脚本自动完成Scala 2.13.16与Spark的安装、配置分发、集群启动及进程验证。脚本支持重复执行,避免配置重复。配套的spark_uninstall.sh可安全卸载Spark与Scala,保留JDK和Hadoop环境。整个过程自动化程度高,适用于教学与生产环境快速搭建与清理。

super_mochi1 104

Apache Doris 异步物化视图与 Snowflake MV / Dynamic Tables 工程化对照

在面向分析的数据分层建模里,物化视图是降低重复计算、缩短查询响应时间的通用手段。的异步物化视图从 2.1 版本引入、3.0 版本完善,以一套机制覆盖了多表 join、嵌套分层、分区增量刷新与构建资源管控;Snowflake 则把单表加速与多表管道拆成两套独立机制——Materialized Views 与 Dynamic Tables,前者有严格的单表与聚合限制,后者以 TARGET_LAG 声明数据新鲜度。

SelectDB 280

Apache Superset 重要特性详解(三):语义层 / 权限 / 缓存 / 嵌入的实战最佳实践(2026 版)

本文详解 Apache Superset 的四大核心生产实践:语义层建模(统一口径,指标唯一定义)、行级安全(RLS)(基于角色动态过滤数据)、缓存调优(配置 Redis 与 TTL 策略提升性能)、仪表盘嵌入(通过 guest token 实现系统集成)。结合决策图、命名规范与安全最佳实践,提供可直接复制的配置模板,助力企业构建可复用、安全、高性能的数据分析平台。

weixin_43128865的博客 630

每天认识一个组件:Apache Pulsar

Apache Pulsar 的核心价值在于:它不是把消息系统简单做大,而是以分层架构、多租户模型和跨集群能力,把消息、事件流、实时管道和数据平台治理放在同一个系统框架下。Pulsar 更适合有平台化诉求的团队:多业务共享、实时数据流、跨地域容灾、海量 Topic、长期留存、轻量流处理和连接器生态。

weixin_47983718的博客 608

Apache Superset 架构深度解析(二):一次查询从点击到渲染的完整旅程(附架构图 + 时序图)

当用户在Superset中点击图表,一次查询从请求到渲染历经多层协作:浏览器发起请求后,Gunicorn通过RBAC与RLS鉴权,并从PostgreSQL读取元数据;若缓存命中则直接返回结果,否则由QueryContext结合db_engine_spec生成SQL,经SQLAlchemy执行并写入缓存。大查询走Celery异步路径,结果通过Redis Streams推送至WebSocket通知前端。整个过程依赖五级缓存(含筛选、表单、结果集等),生产环境需配Redis实现高性能与高可用。

weixin_43128865的博客 504

存算分离冷查询提速 7.5 倍!Apache Doris 4.2 Peer Read 实现跨计算组缓存复用

Apache Doris 4.2 引入 Peer Read 机制,实现存算分离架构下跨计算组缓存复用,解决冷查询延迟高、扩缩容后缓存失效等问题。实测主键点查冷查询提速约 7.5 倍,P99 延迟降低约 80%,对象存储请求减少约 98%,全面解析工作原理、性能测试与配置方法。

SelectDB 436
上一篇: “SelectDB 实时数据仓库解决方案”入围工信部“信息技术应用创新典型解决方案”
下一篇: Apache Doris 2.1.5 版本正式发布
SelectDB技术团队
博客等级 码龄4年 2119粉丝 484原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SelectDB技术团队

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值