使用流式计算引擎 eKuiper 处理 Protocol Buffers 数据

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 本文将讲解如何在流式计算引擎eKuiper中处理Protocol Buffers格式数据,从而实现高效的云边协同数据传输,缓解云边传输带宽紧张问题。

Protocol Buffers (Protobuf) 是一种语言中立、平台中立的可扩展机制,用于序列化结构化数据的二进制传输格式。相比常规数据传输格式(如 JSON 或 XML),Protobuf 更加高效和快速并节省传输带宽,因此得到了广泛的应用。

在云边协同架构中,往往既需要发送数据到云端,同时也需要接收云端发送过来的数据,进行云边协同计算。大规模的云边协同计算传输的数据总量巨大,在公网带宽资源有限而且昂贵的情况下,采用更紧凑的数据传输格式显得尤为重要。

LF Edge eKuiper 是适合部署于资源受限的边缘端的超轻量物联网边缘数据流式分析引擎,可通过 source 和 sink 连接 MQTT、HTTP 等各种通信协议的外部系统。eKuiper 支持配置 source/sink 的传输数据的编解码格式,目前可支持 JSON、ProtoBuf 和 Binary 格式。

本文将以 Protobuf 格式为例,讲解如何在 eKuiper 中设置编解码格式,通过 source 读入并解析该格式的数据以及在 sink 中使用该格式编码写入,从而实现高效的云边协同数据传输,缓解云边传输带宽紧张问题。

本教程采用 eKuiper Manager 进行规则的创建和管理,请参考 UI 教程。您也可以采用 REST API 或者在 eKuiper 运行的边端运行 命令行工具来完成相同的规则管理操作。

环境准备

开始动手操作之前,需要准备以下环境:

  • MQTT 服务器用于数据传输。 本教程使用位于 tcp://broker.emqx.io:1883 的 MQTT 服务器, broker.emqx.io 是一个由 EMQX Cloud 提供的公共 MQTT 服务器。若本地运行 eKuiper,需要更改 etc/mqtt_source.yaml,配置项 server 改为"tcp://broker.emqx.io:1883";若使用 docker 启动,应设置环境变量 MQTT_SOURCEDEFAULTSERVER="tcp://broker.emqx.io:1883"。
  • 为了方便观察运行结果,我们需要安装一个 MQTT 客户端,例如 MQTT X

模式注册(Schema Registry)

相比于无模式的 JSON 格式,Protobuf 需要提前定义数据结构,即模式。在 proto 文件中,可以包含多个 message 以及其他实体的定义,但是在编解码格式的配置中,只有 message 的定义可以被使用。 本教程中,我们使用以下模式进行数据结构的定义。该文件定义了一个名为 Book 的 message 结构,其中包含字符串类型的 title 和整型的 price。传输的数据将依据此结构对书籍数据进行二进制数据的编解码。

message Book {
  required string title = 1; 
  required int32 price = 2;
}
  1. 注册模式。在管理控制台中,打开配置->模式,点击创建模式。

    eKuiper 注册模式.png

  2. 在模式创建窗口中,如下图所示填写。其中,模式类型选择protobuf;模式名称可输入自定义的不重复的名称作为后续规则创建中模式的标识 id;模式内容可采用文件或者文本内容填写。选择 file 的情况下,需要填写文件所在的 url;本教程使用的模式较为简单,因此可选择 content,然后在内容框中填入 proto 文件的文本。

    在模式创建窗口中.png

  3. 点击提交。在模式列表中应当能够看到新创建的模式。后续可使用操作栏中的按钮进行修改或删除的操作。

    点击提交.png

至此,我们已经注册了名为schema1的模式,其中定义了Book这种类型,在规则的 source 和 sink 中可以使用该注册的模式。用户也可以继续在此界面进行更多的模式注册和管理工作。

读取 Protobuf 数据

本节中,我们以 MQTT source 为例,介绍如何接入并解析基于 Protobuf 编码传输的数据,使之可以在 eKuiper 中进行规则的计算。需要注意的是,在 Source 中,编码格式与传输协议并不是绑定的。任何的 source 类型如 MQTT, httpPull 等都可以搭配不同的编码格式,例如 ProtoBuf 和 JSON 等。

假设我们有一个 MQTT 主题 demo,出于节省传输带宽的目的,里面传输的数据为 Protobuf 编码的二进制数据。接下来,我们将配置 eKuiper 数据源,接入这个主题的数据并进行处理。

  1. 创建数据流:在管理控制台中,选择源管理->流管理,点击创建流。
  2. 配置数据流及其格式:流名称可设置为自定义的不重复的名称;数据源为要监听的 MQTT 主题;流类型设置为 mqtt;流格式选择 protobuf;模式名称选择上一步注册的 schema1;模式消息设置为 proto 文件里定义的 message Book。该配置表示数据流 protoDemo 将监听 MQTT 主题 protoDemo,收到二进制数据后将采用 schema1 中的 Book 的格式进行 protobuf 解码。点击提交,在流列表中应当列出新创建的流。

    配置数据流及其格式.png

  3. 创建规则:选择规则,点击新建规则,进入规则创建界面。如下图所示,右上角点击进入文本模式,输入自定义的规则ID,规则名字,在文本内容中输入规则的 JSON 文本。该规则表示选择流 protoDemo 中的内容,发送到 MQTT 主题 result/protobuf 中。

    {
       "id": "ruleDecode",
       "sql": "SELECT * FROM protoDemo",
       "actions": [{
         "mqtt": {
           "server": "tcp://broker.emqx.io:1883",
           "topic": "result/protobuf",
           "sendSingle": true
         }
       }]
    }

    创建规则.png

  4. 发送数据并查看结果:我们将使用 MQTTX 发送 Protobuf 编码后的二进制数据到 protoDemo 主题中,观察收到的结果是否是解码后的正确数据。

    1. 打开 MQTT X,连接到云端 tcp://broker.emqx.io:1883
    2. 订阅主题上文规则发送结果的主题 result/protobuf,便于观察结果。
    3. 在消息发送窗格中,设置主题为 protoDemo,Payload 格式为 Hex, 发送根据 schema1 中 Book 格式编码的二进制数据,例如 0a1073747265616d696e672073797374656d107b

      在消息发送窗格中设置主题.png

    4. 确保接收窗口收到正确的 JSON 数据,如下图所示。

      接收 JSON 数据.png

至此,我们完成了 Protobuf 数据的读取和解码并用简单的规则进行处理输出。用户像处理普通 JSON 格式数据一样创建各种各样的规则。若未得到预期结果,可在管理控制台的规则列表页面,查看规则状态,确保规则数据入出的指标符合预期。

写入 Protobuf 数据

本节中,我们将展示读取 JSON 格式数据进行处理后采用 Protobuf 格式发送到云端 MQTT broker 的用法。在物联网边云协同的场景中,该用法可节省边云传输的带宽开销。部署在边缘端的 eKuiper 接入本地的 MQTT broker 无需消耗带宽,可通过处理较快的 JSON 格式接入。规则运算之后,计算结果需要发送到云端 MQTT broker 时,可使用 Protobuf 编码节省带宽。

  1. 创建数据流:在管理控制台中,选择源管理->流管理,点击创建流。如下图所示,创建一个连入 demo 主题,JSON 格式数据的流。

    创建数据流.png

  2. 创建规则,使用 Protobuf 格式发送到云端。

    1. 点击新建规则,输入自定义的 Rule ID 和名称,输入 SQL SELECT * FROM demo
    2. 点击动作右边的新建按钮,配置 MQTT 动作。其中,MQTT 服务器地址配置为云端 broker 地址,MQTT 主题为 result/protobufOut;数据按条发送配置为 true,确保收到的为单条数据以匹配格式配置;流格式配置为 protobuf,模式名称为第一节注册的 schema1,模式消息为 Book。该规则将读取 JSON 数据,然后按照 Book 的格式编码成二进制数据发往 result/protobufOut 主题。点击提交,完成动作配置。

      配置 MQTT 动作.png

      配置 MQTT 动作1.png

    3. 每个规则可以有多个动作,每个动作使用的编码格式是独立的。用户可以继续配置其余动作。全部配置完成后,点击提交,完成规则的创建。
  3. 发送数据并查看结果,该流程与上一节类似。本次我们将向 demo 主题发送 JSON 数据,并期望在订阅的 result/protobufOut 主题中查看到 protobuf 编码的二进制数据。如下图所示,注意数据格式的配置以免显示乱码。

    发送数据并查看结果.png

总结

本教程介绍了如何在 eKuiper 中进行 Protobuf 数据的读取和写入。ProtoBuf 格式是 eKuiper 对外连接的格式的一种,各种格式之间可以任意组合,接入系统后使用的都是内部的格式表示。首先,用户需要先定义 Protobuf 的模式;之后在流的创建和动作的创建中可配置 Protobuf 格式,并选择已定义的模式进行数据的编解码。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
7月前
|
SQL Java 数据库连接
Apache Doris 支持 Arrow Flight SQL 协议,数据传输效率实现百倍飞跃
近年来,随着数据科学、数据湖分析等场景的兴起,对数据读取和传输速度提出更高的要求。而 JDBC/ODBC 作为与数据库交互的主流标准,在应对大规模数据读取和传输时显得力不从心,无法满足高性能、低延迟等数据处理需求。为提供更高效的数据传输方案,Apache Doris 在 2.1 版本中基于 Arrow Flight SQL 协议实现了高速数据传输链路,使得数据传输性能实现百倍飞跃。
EMQ
|
7月前
|
消息中间件 存储 Cloud Native
HStream Webinar: 兼容 Kafka 协议的下一代流数据平台
3 月 20 日,HStream 将举行线上分享会,介绍下一代流数据平台 HStream Platform 的技术架构与应用案例。
EMQ
59 0
|
28天前
|
存储 分布式计算 流计算
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
本文介绍了阿里云开源大数据团队在实时计算领域的最新成果——向量化流计算引擎Flash。文章主要内容包括:Apache Flink 成为业界流计算标准、Flash 核心技术解读、性能测试数据以及在阿里巴巴集团的落地效果。Flash 是一款完全兼容 Apache Flink 的新一代流计算引擎,通过向量化技术和 C++ 实现,大幅提升了性能和成本效益。
940 73
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
|
关系型数据库 物联网 数据库
|
4月前
|
存储 监控 Serverless
Serverless 应用的监控与调试问题之Pravega和Flink实现端到端的auto-scaling要如何操作
Serverless 应用的监控与调试问题之Pravega和Flink实现端到端的auto-scaling要如何操作
|
6月前
|
SQL 数据处理 API
实时计算 Flink版产品使用问题之holo的io以及cpu使用较为稳定,sink端busy一直在20%左右,有时候50%,该如何优化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
数据采集 Java 调度
大牛用6000字带你搞懂实时流计算系统的数据采集之BIO与NIO!
数据采集 从本章开始,我们将逐一讨论实时流计算系统各方面的内容。 为了更加方便和清楚地阐述问题,本文将以互联网金融风控为场景,构建一个实时流计算风控系统。 虽然是以互联网金融风控为场景,但大多数情形下实时流计算系统在架构上是大同小异的,或者具有异曲同工之妙。
|
7月前
|
消息中间件 存储 监控
Kafka Streams:深度探索实时流处理应用程序
Apache Kafka Streams 是一款强大的实时流处理库,为构建实时数据处理应用提供了灵活且高性能的解决方案。本文将深入探讨 Kafka Streams 的核心概念、详细原理,并提供更加丰富的示例代码,以帮助大家深入理解和应用这一流处理框架。
|
SQL 关系型数据库 MySQL
基于 Flink CDC 高效构建入湖通道
阿里云 Flink 数据通道负责人、Flink CDC 开源社区负责人, Apache Flink PMC Member & Committer 徐榜江(雪尽),在 Streaming Lakehouse Meetup 的分享。
609 0
基于 Flink CDC 高效构建入湖通道
|
数据采集 缓存 负载均衡
大数据数据采集的数据采集(收集/聚合)的Flume之数据采集流程的Sink Processor的Load Balancing Sink Processor
在大数据处理和管理中,数据采集是非常重要的一环。为了更加高效地进行数据采集,Flume作为一种流式数据采集工具得到了广泛的应用。其中,Flume的Sink Processor模块是实现数据输出和处理的核心模块之一。本文将介绍Flume中的Load Balancing Sink Processor,讲解其数据采集流程。
141 0