大家下午好,感谢大家抽空这周六来这里,我们一起来探讨这个智能制造这块的一些话题。那我今天给大家带来一个是叫 Apache loTDB,在这个物联网系统里面的应用的一个案例,一个这方面经验分享。那么首先做一下自我介绍,我叫张善友,我一直活跃在其实在开源社区主要活跃的领域在像那个以 .NET 这个微软的技术,然后以它的整个开源的时间也蛮长的,这一套系统全部是用 .NET 打造的,然后也是跨平台的。然后现在 IoTDB 是用 Java 写,就包括用支持最新的 Java 17,所以包括我们方案里面用了 Java 的方案,也是用 Java 17,那么我也有幸在最近几年都有一直在评选的这个中国开源先锋33人中被评为2022年入选人员。 今天我介绍内容主要有从三个方面给大家做个分享。第一,我们的这套物联网的系统,在这个智能制造里面,它有非常重要的一个平台。那么这代平台里面我们今天重点会介绍 IoTDB 这个时序数据库在这个物联网这平台里面的一些应用。那第三部分会给大家介绍一个对应方面的案例。
那我们开始第一部分,其实我们说现在通常会说物联网和工业物联网,我们今天的重点是在讲工业物联网,工业物联网就会它的侧重在于制造业,包括这些工厂里面。所以在我们的中国有门类作为齐全的工业体系,除了很多大型企业,还有很多中小企业,在这里面,我们用工业物联网要去解决的一个问题是说,首先非常热的一个话题,就是我们要做数字化转型,其实数字化转型原来非常热门,在我们的很多互联网企业,他们很多非常容易能完成这种转型。但是在很多我们的传统产业里面,其实这个挑战是非常大的,而且很大型的企业它可能有很雄厚的研发力量可以引用,这可以去和很大的这些大厂去合作,把它们的互联网经验移植。那么还有很多的这种中小企业,它的营业额可能就是一两亿一年,它的利润其实也不是特别高。那这样的商家怎么去落实这些事情?这一整套的互联网的一个主要目的是在这样一方面,其实这里面整个这个工业物联网的发展过程,这里面也是在最近几年,最早的时候,就在我们的 2017 年的时候,国务院提了一个“深化互联网+”这个新兴制造业的一个指导意见,这是我们国内开始发展这个工业物联网的一个非常重要的标志。
那这里面还有一个原来叫工业互联网。这里面就是说我觉得有一点就是美国他们在 2021 年的时候把这个名字给改了,改成了工业物联网联盟,他们把那个原来的这个工业互联网联盟改成物联网。那么这个地方其实对于我们的,在我们互联网技术应用到我们的传统企业里面的这一点来说,给我们非常好的一个认知,它不是把我们互联网放到工厂里面,把工厂连起来,这种叫工业的互联网。而现在我们是要把工业的这种互联网的技术,本来和我们现代的工业,包括现在都是全自动化的,有很多机器人,但介入了这全自动化的工厂和我们的互联网技术,把它结合起来,在传统的制造向这个智能化的制造去转型的过程中,做到整个我们原来工业里面非常重要的一些全要素的工业知识。Know-How,这是我们原来在工业里面和互联网里面非常不同的地方,我们原来的互联网技术,大量都是这种消费的互联网,会发现在有很多这些大厂从消费互联网进入工业互联网的话,他们有也有很多不带实验的地方。其实我以前也在腾讯工作,那时候未来做这些都是消费类的物联网,然后我自己创业开始进入传统的工业领域,一开始我个人的感受也是很深的,对很多这些传统机器工艺,很多我真的是从头开始学,大概学了几年之后,重新基于传统的物联网和我们原来的这些工厂一个结合,去开发我们的这一套物联网系统。 不像我们的互联网,我们原来销售的网络其实数据非常的单一,无论是这种各种制造的数据,它都比较的单一的。那么在互联在工业里面它的数据是非常的繁杂,而且它各种设备的数据源是非常的复杂,量级也非常大,它的每一个设备,每个在一条产线里面,可能这个数据量是比我们这个传统的这种消费互联网里面的那些数据要大得多,比如类似这些电商的这种场景。而且还有一点就是这些中国的制造业是种类非常齐全,也就意味着它的整个各个垂直的行业特别多。而他们每一个无论是流程制造还是离散制造,他们各个不同的行业对于他们业务流程各个方面的诉求都差别很大。在工业和我们的互联网里面,原来局域网里面的这种差异,类似网络的要求,工业里面要求稳定性非常重要,而且它的性能,可靠性这方面是极为严格,所以要做这些工作,很多原来的产线要做改造,它的整个成本是非常大的一个问题。这非常敏感,特别是中小企业来说。从欧洲的中小企业,像他们那实施的工业 4. 0其实他们很多中小企业也并没有实施成功,在这些大厂,他们有做了这类的工业适龄,主要的一点是因为成本,很多企业它可能并没有能力去承担这个事情,而且每个行业他们对这些需求的不一样,所以一个方案是很难去满足所有的这些需求。
针对这些场景,我们定义了这样一套方法。我们整个通用的部分要按二八原则来设计这个问题。通过整个系统从数据的采集端会涉及到各种各类的传感器,各类的协议,那这部分可能你也可以做到百分之七八十的通用,那还有很多私有各类协议的采集,这些肯定是要电子开发的。还有像采集网采集的数据再上传到后端,这种平台接收端,数据的接收端完全可以做到通用。还有后端的数据处理,把数据接收到后端的数据处理也是完全可以通用的。再往后的业务这一端,每个业务这一部分它的重用性就比较低了,而且这部分的开发性是比较多,每个行业也有对应行业应用的一些开发,所以我们 80% 可以做到通用化, 20% 做定制化开发,这样的一个平台。那么它的整个涵盖从我们最前端的采集端。我们分两部分,一个是直接对设备级的,比如说一些消费像家居各类场景下面的这类网关,一些比较小的类,是说有的直接用服务器来做采集的,比如我们用这种服务器网关,便于网关和服务器网关这两类来面对去采集完整个数据上传到我们的后端,可以通过HTTPS、MQTT、 Websocket 的各种途径,就是给大家解释一下我们各个平台里面它所承担的一个角色。 我们这里面的很多组件都是基于开源项目的一个整合,就包括像这里提到服务器网关,我们有 RapidScada,包括前端,我们后面也有一个开源组织,我们自己这种开源社区里一个组织来开发很多各类这种设备。比如 Modbus,像各种协议各类的驱动,我们其实都是开源在 GitHub 上。然后包括像 RapidScada,那也是一个开源的以传统公共领域的 Scada,类似这样的 Scada,然后我们把它整合进来。后端的 IoTServer 这块,我们的平台是一个最基础的版本,也是开源的。这个服务版本的话相当于在各个行业里面去实施之后集成了有很多的业务,抽象着来会更复杂的一个平台,那这个是我们作为企业的产品,没有开源。然后在所有平台,驱动、模型这类管理,我们会有一个 IoTWeb 这样的一个管理平台来管理整个物联网平台,将整个数据收进来,最后是要对数据进行持久化分析。所以我们物联网的数据平台这一块,我们最早的时候是基于关系数据库做的,那时候用关系要有很多程序去做这个数据的过滤、补数、工况的各种标记,那么后面基于这个 IoTDB 的很多事情就会帮我们做,我们这个平台的很多功能就会被简化。 接下来我会给大家介绍一个重点,关于 IoTData 这一部分和 IoTDB 这一块的需求。最后一个就是我们的 IoT 的应用,各类的应用开发。那这一部分会有一些通用,但更多的是一些定制开发的部分,整个来说我们平台可以快速的部署,接进去就可以进行数据上传,就可以进行数据分析了。在针对各个企业的定制化需求可以对它再进行开发的话,无论从时间成本还是实施成本方面会大大的降低。 这个就是上述的平台在我们里面的架构,我们的设备端去从最底层采集。我们这类可以直连设在最上层的 IoTServer,可以直连设备,也可以通过网关去接这两种。它这里面场景还有接小部分的,也有接大量的大规模的,比如说工厂里面通常是这种一个产线里面一个数据,接网关我们直接用服务器做,比如 X86 服务器这种服务器场景。类似定制化的这种嵌入式设备,平台对于我们的使用方来说,它各方面目的都是会给他们降成本,无论对于项目的实施还是为使用的用户。对于这个系统的使用用户来说有这么几类,一个是对于这个平台上我不满足这些需求,要做一些二次的电子开发。二次的开发会涉及到有一部分有可能要对于前端的设备的采集的驱动要做一些开发,比如说后端的应用我要做二次开发,那么这部分的整个来说,我们整个系统采用 BS 架构,都制定了统一的一些标准,去根据情况进行调整。而且整个部署环境没有要求,就是说可以无论你是 Windows,Linux 还是国产还是各种的设备都是全部满足,这样我们就可以很好去降低这个成本。 介绍完这个系统后,我们开始进入今天的重点部分, Apache IoTDB 在这个系统里面的应用。首先我们来看一下时序数据,在我们的物联网里面我们的设备产生的各种数据,都是一个时序的数据。所以我们从这个数据的采集端来说,要面对非常多的工业协议,而且这个采集的频率我们有可能要很高。比如说经常在一秒左右,一秒一条这种是比较多的,而且可能更高的甚至是几毫秒。我们时序的数据量比较大,而这个时序的数据我们要面对这么大的的数据量,我们通常后端会采集采用这种消息队列来面对前端来的数据。我可以进行后端的处理。还有包括跟着后端要数据出数据,对它的一个消费,可以直接在消息队列上去做时序数据处理。第三, 数据存储,因为我们这些实时数据的存储数据量非常大,所以就会面临两个问题。我写入数据库的要求非常高,要求高吞吐量,我们数据的存储数据量非常大,我要低成本进行存储,而且这些数据量都是几十个亿。通常一些小厂比如说这 100 台机器的话,一天可能都是几十个亿的这样的一个数据量,那么它在一个数据的高压缩比、高吞吐量这两个方面对我们的数据存储要求是很高的。数据存储之后,最后我们要对它进行分析,这块数据对于我们真正业务端的用户会使用的数据存储这一块是非常多的。如果是单一的数据源的处理来说,无论从开发的角度,还是从使用的角度,它都会要相对的简单很多。
从我们整个实时数据的整个生命周期来看,我们的 IoTDB 可以非常好的满足我们这些需求。然后看一下我这里列四个点,其实 IoTDB 它是专门为这种物联网数据所设计的一类时序数据库。它的整个结构树状的 Schema 和我们的制造行业要存储的数据结构是非常符合的。这种系统子系统按模块这种制造的单元到再到工厂,再到设备,再到传感器,存储的是传感器的后面的那个数据点位。通常像这些数据点位的数据,它是一个有非常好的数据结构,来展示这个结构。那么如果我原来不是用 IoTDB,而是用关系型数据库的时候,该怎么做?在物联网像这种数据有一个特点,每个设备的点位都不一样。如果用这种关系型数据库有个表建立字段去存储的话,你是会面临一个问题,你的表是要怎么改都不行,都满足不了,那你可能需要不断的增加表。所以在这个系统里为了面对这种情况是用这种行列,类似于用属性字段值的一个结构去来存储,但是它很难表达这个树形结构,树状的这种结构,我的哪个系统,哪个子系统的哪个模块。
还有一点就是这个数据可能会乱序,因为数据量很大,我们通常会前端采集后把它放到数据消息队列里面去,无论你用 Kafka 还是 Radis 这类消息队列,你都没法保证它完全的有序性。那么 IoTDB 针对这种数据的有序性做了很多的优化,比如说写前保序,写后重排在数据库里,它的时序数据对齐等等,它都解决了这类问题,那原来我们为了解决这种问题,其实要在我们自己的数据平台层做很多很多的工作才能满足这个要求。 第三就是这类海量数据的存储问题,同样的数据我们之前用关系型数据库去存储,现在是用这个 IoTDB 去存储,我们统计过大概是十几倍的这样的一个差距。这种行列混合的存储特性,同时也支持这种高速的数据写入,包括像用这种结构如果存小量的数据也是挺好的。我们也是用这种结构,那么 IoTDB 它对这些数据根据你这些特征,无论是字符串还是整形、double 型,它都有可以指定不同的压缩算法,它的压缩比非常高,超过 10: 1 以上。那么这样可以非常好的去帮我们解决存储的各种成本问题,而且查询也非常方便。查询根据这样整个树形的 schema 结构,我们非常容易去对它进行类 SQL 这样的一种查询模式。 那么数据的分析这一块 IoTDB 本身就内置了非常多的自定义函数,自定义函数在 LDV 里面已经有非常多的这类函数,而且这类函数我们还可以自定义,可以自己去扩展它。那么它现在目前有很多数据质量的函数,包括像你要分析这个数据的质量怎么样,都有现成的函数。然后数据画像,包括数据的评估这些在 IoTDB 的官方文档里面都有,有非常详细的一个内容,大家可以到 IoTDB 的文档里面去看对应的一些函数,都是对一些的场景下面去使用。
这一块是我们原来这个数据处理部分的一个架构图,我们左边是用关系型数据库去存储时的一个架构,右边这个是我们用 IoTDB 时序数据库的一个架构,同样是为了把数据存储下去,我们应用程序的接口对这些数据的查询和应用。我们在后端处理的数据,从各种传感器里面采集回来的数据,这些叫原始数据,而这些数据通常我们要经过处理之后才能够在后端应用里使用。像我们原来的传感器数据,它有一些可能数据采集不均匀,包括像我们可能要做一些降采样,比如说每分、每秒、类似的一些统计数据,我们用来围绕在这种关系型的数据库里面完成这些工作的话,会专门有一个平台来做数据的清洗工作,这个清洗工作可以放到 IoTDB 里,因为它本身有这些特性,很多工作就不需要做了,这个大大的降低我们本身的应用复杂性,增加了可靠性,然后可以提高 IoTDB 在我们平台上使用的数据质量。这个数据的资料可以包括像我们的物联网平台里面的这些数据,有这些原始数据,还有包括我们内部还有产生的各种事件,还有各种对它的控制,类似的整个消息。 我们这里用的是 Redis 的消息队列,Redis 的消息队列里面有好多种,很多人用错了,Redis Stream 各个功能其实都有,有像 Kafka 的分组消费这样的,Redis Stream 也一样满足。而且同时它本身的资源占用各方面要比 Scada 用 Kafka 节省的多,它的很多东西基本 Redis 5.0 以上的版本才有。 这里面还有非常重要的就是我们要和 IoTDB 打交道,我们的整个系统是用 DotNet 构建的,就是说里面有一个IoTDB,它本身是用 Java 构建,所以我们就有一个非常重要的 C# 客户端,也是原来在 Apache 的一个项目社区里面,最近政策已经把它正式加入了Apache 的开源社区里。Apache IoTDB Client C# 这个项目是最近才加入的。那这个项目呢?在我们的整个社区里面,也有非常多的伙伴在一起在用这个 IoTDB,这个过程中我们会在不断的改进 IoTDB 和 C# 客户端,C# 客户端它的里面有两个特性,因为海量的数据,它的插入要求有一个数据的序列化和反序列化,这一部分做了一个 ByteBuffer 这样的一个优化。这个 ByteBuffer 是在这个项目里写的,没有用这个平台本身的那些机制,在这里保证了它整个性能非常好。其实这一块我们的数据分析是和我们的用户,和我们真正的业务端是最为密切的。而这部分的话,现在大家都知道有非常热门 AIGC 大语言大模型,那么语言大模型这一块我们能够做什么?其实这一块我也想今天给大家分享一下。就是同样这一块的物联网的数据在这个 IoTDB 里,我们本身的语言大模型,它又可以帮我们完成很多原来很难完成的工作。比如说像我们普通用户可以用自然语言来表达我想查某个设备的什么数据,那么我可以非常容易的帮我把自然的语言转化为这个 LDV 的这样的 SQL 的查询,那后端就把数据查回来,类似这样是最简单的。 这里面和大家分享一个莫拉维克悖论了,大家最近都觉得 ChatGPT 非常厉害,它有思维能力,可以有思维链,可以有推导能力,参加考试它的分数都非常高,包括像高考作文这类对它来说都轻而易举,但是它很难完成具体人类的行动力,像婴儿学步这种感知和行动的这种能力它是完全不具备的。这个说法也基本上就叫做莫拉维克悖论,这个是在人工智能领域里的一个理论,但是 ChatGPT 可以给我们的应用决策预测各种感知等能力,可以给我们带来应用系统,特别是我们现在的数字化应用,所谓的这些应用在我们的系统里面可以让我们的数据更去发挥这样的能力。我觉得这是大语言模型可以为我们带来的。最近微软的 Build 大会也在 5 月中旬,这时候他们整个大会基本上都有微软的各种产品都被 GPT 化,它里面提供非常重要的一个概念叫 Co-Pilot,就叫副驾,Pilot就是飞机的驾驶员。作为一个助手,那我们最近也在想把这样的一个模型放在这个 IT 物联网平台里面,做一个 IoT 的助手。IoT 助手的平台来帮助我们解决很多后端的很多应用开发。我们整个平台里面有这种 20% 的定制化开发,很多的工作可以通过语言大模型结合我们的这些数据,比如说像 IoTDB 里面的各类数据的话,用这种方式可以非常好的加速。而在这里面,其实有一个非常好的结合点,就是大语言的模型开发和我们传统的应用开发有很大不同的地方。这一点是包括整个在大语言模型开发里面,现在有两个框架,一个叫 Launcher,另外叫 Semantic-Kernel,这两个不知道大家有没有听说过。其中一个叫 Semantic-Kernel,我们简称它 SK,是微软开源的。微软结合在用 GPT4 去改造它传统的这些生产类工具,无论是它的 New Bing,还是它的 Office,还是这种 Teams 各种应用总结。他在所有工作总结了一个项目,也开源了一个项目,这个项目大概两个月时间,目前已经超过 1 万多个star。那个项目最近我也在,我也有一个公众号叫做新一代智能应用,里面有大量的 Semantic-Kernel 的资料,我最近也在探索基于这个 Semantic-Kernel 去构建这样的一个平台。这个就是我们传统之类的应用,我们可以通过语言大模型,不一定要用 OpenAI 的GPT,其实在国内的 GPT 应用的厂商特别多,而且现在大家应该都见过国内的语言大模型是叫百魔大战,现在有好几十款,包括昨天的科大讯飞,他们发布了 1.5 版本的星火语言大模型,我测试其实它的效果也非常不错,我相信它往后面这类语言大模型可以真正的像在我们的这种物联网平台上的一样。包括我在科大讯飞其中具有星火语言大模型里面有一个项目,就在工业物联网里面怎么去用语言大模型,现在也有很多厂商在测,在做这方面的探索。其实我们最近也在做的这个事情,如果通过自然语言的交互方式,无论是从它的开发还是对后端的数据分析这方面还有包括我们工业里面,有非常重要的很多工业知识原来很多都在文档里面,比如说有很多可能文档是 PDF、Word 都各类的在上面。如果我们有这样的一个语言大模型,我可以把它全部把它做向量化,做这种知识库构建起来。在这样的一个平台上面,我们可以去和它进行交互。现在是一种体现的形态,都是聊天的模式,比如说 ChatGPT,PDF 等等的之类。 类似的我给大家分享一个最近这 8 年我们做的一个案例,这个是原来的架构图,是我们的设备整个采集来数据分析的这个过程。这个图是甲方原来要做的事情,他给了其中一个要求,他们已经采购了 Keepwell 来去连接它后端的所有产线上的数据,带有 1000 台的 PLC,那么一天产生的数据是是接近五六十亿的数据量。整个 POC 之后,它通过 OPC UA 的数据给到我们上端,所以我们后端有一个 OPC UA 的加 Client 端,我们用的这里通过 OPC UA 去和它进行交互,那么就是一个 X86 的服务器。而且这里有一个要求是我们要做到所有的端都可以调到任何机器,就是说任何一台机器的挂掉,都不会影响到数据的采集丢失所有的数据,全部是高可用的状态,所以每一个集群最少是 3 台服务器一个层。那么采集上来,再到 IoT Server,到后端的数据分析,到后面会有用到时序数据库和关系型数据库,还有包括中间的 Redis 的消息队列、缓存。最后时序数据库这一块我们有两个集群,当然了一个叫动态集群,另外叫静态集群,这个动态、静态集群其实就是在我们用 IoTDB 的两个企业集群,它在动态集群,比如说我这个数据存两周的数据在我的动态集群里面,在我的所有后端采集上来的数据全部到了动态库,两周的数据之后在后端的数据把它移到静态库。静态库就是其实就是长期保留的数据库,通常我们的数据,在后端我们这类数据通常要求的保存的时间都非常长。在工业里面我通常都在三年、五年以上,那么它对所有数据进行统一的管理,动态库里面通过一个集群前端,储存所有在两周内的数据,这样能够保证我们在一个集群里面可以统一去接收前端进来数据的这种大量的数据写入,包括查询,所有都在这一套里面完成。超过两周的数据都在后端的静态库集群里面进行处理。后端这个静态库后面还会对接有大数据平台,它主要是针对大数据的分析。 上面就是我给大家介绍 IoTDB 在我们的平台里面是如何使用的。我们整个平台全部都采用 .NET 的构建,而且它也是跨平台的,现在它整个性能包括资源的使用量是比较低的,那么 IoTDB 它在我们的数据存储这一块非常好的满足了我们对这个时序数据的存储以及分析。




