DeltaLake在工业大脑的实践分享

2024-05-02 07:32

本文主要是介绍DeltaLake在工业大脑的实践分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者介绍

占怀旻,花名心渡,阿里云数字产业产研部-工业大脑团队的大数据工程师,目前的工作方向是利用大数据与AI技术,为工业企业客户构建数据中台,支撑工业企业的数字化转型和智能制造落地,用大数据技术来普惠更多的中国制造企业。

前言  

随着2020年云栖大工业大脑3.0的发布,工业大脑已经经历了多年的发展。本文将为大家分享,在工业数据中台建设中使用 DeltaLake 的优秀实践,主要包括:

1、异地异构流消息的处理 2、流批融合的数据分析

3、对事务的理和对算法的支持

异地异构流消息的处理   

对工业企业来说,数据源往往分散于世界各地,集团级别的用户,往往希望以数据中台为中心获取数据,如下图所示:

有很多大数据组件可以完成上面的任务,比如 Flink 和 Flume 等,但是以下理由让我们最终选择了 DeltaLake 

  • 支持使用正则消费多个 Kafka Topic

    使用 SubscribePattern ,可以使用正则实现同时消费多个 Topic 的数据,在一个园区有许多个 Topic 需要消费的场景下非常方便

  • 对 HDFS 的支持和小文件合并的封装

    使用 ubscribePattern,可以使用正则实现同时消费多个 Topic 的数据,在一个园区有许多个 Topic 需要消费的场景下非常方便

在遇到“将 Kafka 的数据实时写入 HDFS ”的场景时,用 DeltaLake 也很方便,主要有2点原因

  • 天然对写 HDFS 的支持,可以免去使用 Flink 的时候需要编写 HDFS Sinker,或者额外运维 Flume 集群带来的麻烦

  • 每一个流式入库的场景,对于数据架构师来说都是一个性能与时效性的权衡取舍过程,不管是 Flink、Flume 还是 SparkStreaming,都会有“滚动写入容量(或条数)阈值”和“滚动写入时间阈值”的设计,在实际的实施过程中,根据业务对于数据延迟和性能的需求不同,来权衡二者。例如对于延迟容忍度很低的场景,可以将容量或条数阈值设置的很小(甚至为1)来让新的数据快速滚动写入,但是这样带来的副作用是 Sinker 的频繁IO,比如在 HDFS 产生很多的小文件,影响数据读写或 DataNode 的性能;在延迟容忍度较高的场景下,交付工程师则往往选择将条数阈值和时间阈值加大,带来更好的IO性能,但牺牲数据延迟。这是一种通用的方法,但在实际生产过程中,你会发现,要为许多的流作业维护许多不同的配置,这项工作的成本依然不小。使用 DeltaLake 来处理,则可以轻松很多,你可以将所有的流作业的滚动写入阈值设置成一样的(比如都比较小),这样所有的流作业都可以得到比较好的数据延迟,同时结合使用 DeltaLake 的特性功能 Optimize 和 Vacuum ,配置定时调度任务来周期执行,对小文件进行合并或删除,来保障 HDFS 的性能,这样可以使整个数据开发工作简单很多,也更好运维。关于 Optimize 特性可以参考:https://help.aliyun.com/document_detail/148373.html

流批融合的数据分析   

在生产制造环节,机器设备的稳定运行对于产成品质量至关重要,而判定设备是否稳定运行的最直观方法,就是查看某些传感器的历史长时间历史趋势,在实际项目实施过程中,交付工程师往往使用流作业,将 Kafka 中大量的传感器时序数据加工后写入 OLAP 存储(例如阿里云 ADB、TSDB 或 HBase 等),来支撑上层数据分析应用的高并发、低响应时间的实时查询需求。

但是实际情况往往比这复杂得多,由于工业企业的信息化和数字化水平普遍不高,不同行业的生产过程自动化程度也参次不齐,有许多的设备实时数据其实并不准确,它们需要在若干时间以后(数分钟或者数小时),经过人工干预或者重新计算较正后才能使用。

所以在实际实施过程中,往往采用一种“滚动覆盖”的模式来不断改写 OLAP 存储中的数据,将 OLAP 分为“实时增量区”和“周期覆盖区”,例如下图所示:

上图使一个 OLAP 存储,所有的数据被分为橙色和蓝色两部分,上层数据应用可以无差别地查询这两个区域的数据,唯一的差别是:橙色的最新数据,由流计算作业实时从 Kafka 获取,做加工后写入;而蓝色区域,则由历史数据周期性计算(加入矫正逻辑)后写入,对昨天或更久之前的实时数据进行订正,这样周期往复,在保障数据时效性的同时,对历史数据做订正覆盖,来保障数据的正确性。

在以往的做法中,往往使用一个流+批的 Lambda 架构,用两种不同的计算引擎来处理流与批,如下图所示:

Lambda 架构的弊端也可由此可见,在两个不同的平台维护两台代码,还要保障它们两的计算逻辑完全一致,是比较费功夫的事情,在引入 DeltaLake 之后,事情变得相对简单,Spark 天生的流批一体设计,就很好地解决了代码复用和跨平台逻辑统一的问题,结合 DeltaLake 的特性(例如 ACID,OPTIMIZE 等),可以更优雅地完成这项工作,如下图:

另外值得一提的是,流批一体并不是 Spark 的独有特性,但是阿里云 EMR 在 SparkSQL 和 Spark Streaming 之上又对 SQL 进行了一层封装,使得业务人员能够更低门槛地使用类似Flink SQL 的语法来进行作业开发,使得流批场景下的代码复用和运维工作变得更加简单,这一点对于项目交付提效意义很大,具体可参考:

https://help.aliyun.com/document_detail/124704.html

对事务的处理和对算法的支持   

传统的数据仓库,很少会在建模过程中引入事务,由于数据仓库要反映数据的变化情况,所以往往使用缓慢变化维度等方法来记录数据的状态变化,而并不会用 ACID 来让数据仓库与业务系统保持一致。

但是在工业数据中台的实施过程中,事务有他独特的使用场景,例如排产排程,是每一个工业企业都关心的重大问题,排产,往往从集团级别进行,根据客户订单、物料库存和工厂产能等角度来对当期的生产需求进行合理的分解和编排,来达到产能合理分配;排程则往往更加微观,在工厂级别,根据工单、物料和实际的生产情况来实时动态调整生产计划,达到资源利用率最大。它们都是需要众多数据融合求解的规划问题,如下图所示:

排产排程算法所需要的原始数据,往往来自多个业务系统,例如 ERP 提供订单和计划数据, WMS 提供物料数据,MES 提供工单和工序数据,这些数据必须融合到一起(物理上和逻辑上),才能作为排产排程算法的有效输入,所以在实施过程中往往需要一个统一的存储来存放来自各系统的数据。同时排产排程算法对数据的实效性也有一定的要求,它需要输入的数据能够尽量与各个业务系统保持一致,这样才能真实地反映出当时的生产情况,以便更好的进行排程。

在以往,我们这么处理这种场景

  • 利用各个业务系统的 CDC 能力,或者单独编写程序来轮询,准实时地获取数据变化

  • 写入关系型数据库,在此过程中处理数据 Merge 的逻辑,让关系型数据库中的数据与业务系统数据准实时地保持一致

  • 排产排程引擎在被触发的时候,从 RDB 拉取数据进行运算

这种架构有一些显而易见的问题,主要有

  • 用 RDB 替代大数据存储,计算的时候把数据 Query 到内存中,对于数据量比较大的情况会很困难

  • 如果用 Hive 引擎来替代中间的 RDB,虽然在 Hive3.X 支持 ACID,但是实时性和 MapReduce 编程框架对于算法(求解器)的支持都难以满足工程需求

目前我们正在尝试引入 DeltaLake,结合 Spark 的特性来优化这个架构,如下图:

优化后的架构,有如下优点:

  • 使用 HDFS+Spark 替代 RDB 作为中台存储,解决数据量大时候的存储问题

  • 使用 Spark Streaming+DeltaLake 来对接原始数据,利用 DeltaLake 的 ACID 特性来处理数据进入中台存储时的 Merge 逻辑,同时在流式入库的时候同时对数据进行Merge+Optimize,保障读写性能

  • 排产排程引擎不再从中台 Query 数据到内存计算,而是把算法任务封装成 Spark 作业,下发到计算平台完成计算,这样利用 Spark ML 编程框架对算法和 Python 的良好支持,以及 Spark 本身的分布式计算能力,对需要多轮迭代的规划算法进行分布式处理

  • 利用 DeltaLake 的 Time Travel 特性,对数据版本进行管理或回滚,这对于算法模型的调试和评估是非常有利的

总结

1)DeltaLake 的核心能力 ACID 对于数据实时性和准确性要求较高的应用很有帮助,尤其是算法应用,可以更有效地利用 Spark 对 ML 的天然支持

2)结合使用 DeltaLake 的 Optimize+Vacuum 和 Streaming 的流式入库能力,在大批量对接上游 Kafka 数据的时候会有更好的兼容性,同时可以有效的降低运维成本

3)利用阿里云 EMR 团队封装的 Streaming SQL 开发流作业,在大规模的数据中台项目实施过程中可以有效降低开发门槛和成本

目前,DeltaLake 在工业大脑的应用尚在实验阶段,例如流式入库、排产排程引擎、流批融合等多个场景正在工业大脑多个项目中应用,同时这些场景也在逐渐沉淀为工业大脑的标准产品,后续结合工业大脑3.0的数据+算法场景的可视化编辑和复制能力,可以快速复制到离散制造、汽车、钢铁等多个行业的场景中,用AI能力普惠中国工业。

感兴趣的同学可以参考:

https://www.aliyun.com/solution/industry/home

这篇关于DeltaLake在工业大脑的实践分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/953713

相关文章

jdk1.8的Jenkins安装配置实践

《jdk1.8的Jenkins安装配置实践》Jenkins是一款流行的开源持续集成工具,支持自动构建、测试和部署,通过Jenkins,开发团队可以实现代码提交后自动进行构建、测试,并将构建结果分发到测... 目录Jenkins介绍Jenkins环境搭建Jenkins安装配置Jenkins插件安装Git安装配

SpringBoot的全局异常拦截实践过程

《SpringBoot的全局异常拦截实践过程》SpringBoot中使用@ControllerAdvice和@ExceptionHandler实现全局异常拦截,@RestControllerAdvic... 目录@RestControllerAdvice@ResponseStatus(...)@Except

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL存储过程实践(in、out、inout)

《MySQL存储过程实践(in、out、inout)》文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT... 目录简述存储过程存储过程的优缺点优点缺点存储过程的创建和调用mysql 存储过程中的关键语法案例存储

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础