官宣|Apache Flink 1.13.0 正式发布,流处理应用更加简单高效!

简介:Flink 1.13.0 版本让流处理应用的使用像普通应用一样简单和自然,并且让用户可以更好地理解流作业的性能。

​翻译 | 高赟
Review | 朱翥、马国维

GitHub 地址
https://github.com/apache/flink
欢迎大家给 Flink 点赞送 star~

Flink 1.13 发布了!Flink 1.13 包括了超过 200 名贡献者所提交的 1000 多项修复和优化。

这一版本中,Flink 的一个主要目标取得了重要进展,即让流处理应用的使用和普通应用一样简单和自然。Flink 1.13 新引入的被动扩缩容使得流作业的扩缩容和其它应用一样简单,用户仅需要修改并发度即可。

这个版本还包括一系列重要改动使用户可以更好的理解流作业的性能。当流作业的性能不及预期的时候,这些改动可以使用户可以更好的分析原因。这些改动包括用于识别瓶颈节点的负载和反压可视化、分析算子热点代码的 CPU 火焰图和分析 State Backend 状态的 State 访问性能指标。

除了这些特性外,Flink 社区还添加了大量的其它优化,我们会在本文后续讨论其中的一些。我们希望用户可以享受新的版本和特性带来的便利,在本文最后,我们还会介绍升级Flink版本需要注意的一些变化。

我们鼓励用户下载试用新版 Flink 并且通过邮件列表JIRA 来反馈遇到的问题。

重要特性

被动扩缩容

Flink 项目的一个初始目标,就是希望流处理应用可以像普通应用一样简单和自然,被动扩缩容是 Flink 针对这一目标上的最新进展。

当考虑资源管理和部分的时候,Flink 有两种可能的模式。用户可以将 Flink 应用部署到 k8s、yarn 等资源管理系统之上,并且由 Flink 主动的来管理资源并按需分配和释放资源。这一模式对于经常改变资源需求的作业和应用非常有用,比如批作业和实时 SQL 查询。在这种模式下,Flink 所启动的 Worker 数量是由应用设置的并发度决定的。在 Flink 中我们将这一模式叫做主动扩缩容。

对于长时间运行的流处理应用,一种更适合的模型是用户只需要将作业像其它的长期运行的服务一样启动起来,而不需要考虑是部署在 k8s、yarn 还是其它的资源管理平台上,并且不需要考虑需要申请的资源的数量。相反,它的规模是由所分配的 worker 数量来决定的。当 worker 数量发生变化时,Flink 自动的改动应用的并发度。在 Flink 中我们将这一模式叫做被动扩缩容。

Flink 的 Application 部署模式开启了使 Flink 作业更接近普通应用(即启动 Flink 作业不需要执行两个独立的步骤来启动集群和提交应用)的努力,而被动扩缩容完成了这一目标:用户不再需要使用额外的工具(如脚本、K8s 算子)来让 worker 的数量与应用并发度设置保持一致。

用户现在可以将自动扩缩容的工具应用到 Flink 应用之上,就像普通的应用程序一样,只要用户了解扩缩容的代价:有状态的流应用在扩缩容的时候需要将状态重新分发。

如果想要尝试被动扩缩容,用户可以增加 scheduler-mode: reactive 这一配置项,然后启动一个应用集群(Standalone 或者 K8s)。更多细节见被动扩缩容的文档

分析应用的性能

对所有应用程序来说,能够简单的分析和理解应用的性能是非常关键的功能。这一功能对 Flink 更加重要,因为 Flink 应用一般是数据密集的(即需要处理大量的数据)并且需要在(近)实时的延迟内给出结果。

当 Flink 应用处理的速度跟不上数据输入的速度时,或者当一个应用占用的资源超过预期,下文介绍的这些工具可以帮你分析原因。

瓶颈检测与反压监控

Flink 性能分析首先要解决的问题经常是:哪个算子是瓶颈?

为了回答这一问题,Flink 引入了描述作业繁忙(即在处理数据)与反压(由于下游算子不能及时处理结果而无法继续输出)程度的指标。应用中可能的瓶颈是那些繁忙并且上游被反压的算子。

Flink 1.13 优化了反压检测的逻辑(使用基于任务 Mailbox 计时,而不在再于堆栈采样),并且重新实现了作业图的 UI 展示:Flink 现在在 UI 上通过颜色和数值来展示繁忙和反压的程度。

img

Web UI 中的 CPU 火焰图

Flink 关于性能另一个经常需要回答的问题:瓶颈算子中的哪部分计算逻辑消耗巨大?

针对这一问题,一个有效的可视化工具是火焰图。它可以帮助回答以下问题:

  • 哪个方法调现在在占用 CPU?
  • 不同方法占用 CPU 的比例如何?
  • 一个方法被调用的栈是什么样子的?

火焰图是通过重复采样线程的堆栈来构建的。在火焰图中,每个方法调用被表示为一个矩形,矩形的长度与这个方法出现在采样中的次数成正比。火焰图在 UI 上的一个例子如下图所示。

img

火焰图的文档包括启用这一功能的更多细节和指令。

State 访问延迟指标

另一个可能的性能瓶颈是 state backend,尤其是当作业的 state 超过内存容量而必须使用 RocksDB state backend 时。

这里并不是想说 RocksDB 性能不够好(我们非常喜欢 RocksDB!),但是它需要满足一些条件才能达到最好的性能。例如,用户可能很容易遇到非故意的在云上由于使用了错误的磁盘资源类型而不能满足 RockDB 的 IO 性能需求的问题。

基于 CPU 火焰图,新的 State Backend 的延迟指标可以帮助用户更好的判断性能不符合预期是否是由 State Backend 导致的。例如,如果用户发现 RocksDB 的单次访问需要几毫秒的时间,那么就需要查看内存和 I/O 的配置。这些指标可以通过设置 state.backend.rocksdb.latency-track-enabled 这一选项来启用。这些指标是通过采样的方式来监控性能的,所以它们对 RocksDB State Backend 的性能影响是微不足道的。

通过 Savepoint 来切换 State Backend

用户现在可以在从一个 Savepoint 重启时切换一个 Flink 应用的 State Backend。这使得 Flink 应用不再被限制只能使用应用首次运行时选择的 State Backend。

基于这一功能,用户现在可以首先使用一个 HashMap State Backend(纯内存的 State Backend),如果后续状态变得过大的话,就切换到 RocksDB State Backend 中。

在实现层,Flink 现在统一了所有 State Backend 的 Savepoint 格式来实现这一功能。

K8s 部署时使用用户指定的 Pod 模式

原生 kubernetes 部署(Flink 主动要求 K8s 来启动 Pod)中,现在可以使用自定义的 Pod 模板。

使用这些模板,用户可以使用一种更符合 K8s 的方式来设置 JM 和 TM 的 Pod,这种方式比 Flink K8s 集成内置的配置项更加灵活。

生产可用的 Unaligned Checkpoint

Unaligned Checkpoint 目前已达到了生产可用的状态,我们鼓励用户在存在反压的情况下试用这一功能。

具体来说,Flink 1.13 中引入的这些功能使 Unaligned Checkpoint 更容易使用:

  • 用户现在使用 Unaligned Checkpoint 时也可以扩缩容应用。如果用户需要因为性能原因不能使用 Savepoint而必须使用 Retained checkpoint 时,这一功能会非常方便。
  • 对于没有反压的应用,启用 Unaligned Checkpoint 现在代价更小。Unaligned Checkpoint 现在可以通过超时来自动触发,即一个应用默认会使用 Aligned Checkpoint(不存储传输中的数据),而只在对齐超过一定时间范围时自动切换到 Unaligned Checkpoint(存储传输中的数据)。

关于如何启用 Unaligned Checkpoint 可以参考相关文档

机器学习迁移到单独的仓库

为了加速 Flink 机器学习的进展(流批统一的机器学习),现在 Flink 机器学习开启了新的 flink-ml 仓库。我们采用类似于 Stateful Function 项目的管理方式,通过使用一个单独的仓库从而简化代码合并的流程并且可以进行单独的版本发布,从而提高开发的效率。

用户可以关注 Flink 在机器学习方面的进展,比如与 Alink(Flink 常用机器学习算法套件)的互操作以及 Flink 与 Tensorflow 的集成

SQL / Table API 进展

与之前的版本类似,SQL 和 Table API 仍然在所有开发中占用很大的比例。

通过 Table-valued 函数来定义时间窗口

在流式 SQL 查询中,一个最经常使用的是定义时间窗口。Flink 1.13 中引入了一种新的定义窗口的方式:通过 Table-valued 函数。这一方式不仅有更强的表达能力(允许用户定义新的窗口类型),并且与 SQL 标准更加一致。

Flink 1.13 在新的语法中支持 TUMBLE 和 HOP 窗口,在后续版本中也会支持 SESSION 窗口。我们通过以下两个例子来展示这一方法的表达能力:

  • 例 1:一个新引入的 CUMULATE 窗口函数,它可以支持按特定步长扩展的窗口,直到达到最大窗口大小:
SELECT window_time, window_start, window_end, SUM(price) AS total_price 
  FROM TABLE(CUMULATE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '2' MINUTES, INTERVAL '10' MINUTES))
GROUP BY window_start, window_end, window_time;
  • 例 2:用户在 table-valued 窗口函数中可以访问窗口的起始和终止时间,从而使用户可以实现新的功能。例如,除了常规的基于窗口的聚合和 Join 之外,用户现在也可以实现基于窗口的 Top-K 聚合:
SELECT window_time, ...
  FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY total_price DESC) 
      as rank 
    FROM t
  ) WHERE rank <= 100; 

提高 DataStream API 与 Table API / SQL 的互操作能力

这一版本极大的简化了 DataStream API 与 Table API 混合的程序。

Table API 是一种非常方便的应用开发接口,因为这经支持表达式的程序编写并提供了大量的内置函数。但是有时候用户也需要切换回 DataStream,例如当用户存在表达能力、灵活性或者 State 访问的需求时。

Flink 新引入的 StreamTableEnvironment.toDataStream()/.fromDataStream() 可以将一个 DataStream API 声明的 Source 或者 Sink 当作 Table 的 Source 或者 Sink 来使用。主要的优化包括:

  • DataStream 与 Table API 类型系统的自动转换。
  • Event Time 配置的无缝集成,Watermark 行为的高度一致性。
  • Row 类型(即 Table API 中数据的表示)有了极大的增强,包括 toString() / hashCode() 和 equals() 方法的优化,按名称访问字段值的支持与稀疏表示的支持。
Table table = tableEnv.fromDataStream(
  dataStream,
  Schema.newBuilder()
    .columnByMetadata("rowtime", "TIMESTAMP(3)")
    .watermark("rowtime", "SOURCE_WATERMARK()")
    .build());

DataStream<Row> dataStream = tableEnv.toDataStream(table)
  .keyBy(r -> r.getField("user"))
  .window(...);

SQL Client: 初始化脚本和语句集合 (Statement Sets)

SQL Client 是一种直接运行和部署 SQL 流或批作业的简便方式,用户不需要编写代码就可以从命令行调用 SQL,或者作为 CI / CD 流程的一部分。

这个版本极大的提高了 SQL Client 的功能。现在基于所有通过 Java 编程(即通过编程的方式调用 TableEnvironment 来发起查询)可以支持的语法,现在 SQL Client 和 SQL 脚本都可以支持。这意味着 SQL 用户不再需要添加胶水代码来部署他们的SQL作业。

配置简化和代码共享

Flink 后续将不再支持通过 Yaml 的方式来配置 SQL Client(注:目前还在支持,但是已经被标记为废弃)。作为替代,SQL Client 现在支持使用一个初始化脚本在主 SQL 脚本执行前来配置环境。

这些初始化脚本通常可以在不同团队/部署之间共享。它可以用来加载常用的 catalog,应用通用的配置或者定义标准的视图。

./sql-client.sh -i init1.sql init2.sql -f sqljob.sql
更多的配置项

通过增加配置项,优化 SET / RESET 命令,用户可以更方便的在 SQL Client 和 SQL 脚本内部来控制执行的流程。

通过语句集合来支持多查询

多查询允许用户在一个 Flink 作业中执行多个 SQL 查询(或者语句)。这对于长期运行的流式 SQL 查询非常有用。

语句集可以用来将一组查询合并为一组同时执行。

以下是一个可以通过 SQL Client 来执行的 SQL 脚本的例子。它初始化和配置了执行多查询的环境。这一脚本包括了所有的查询和所有的环境初始化和配置的工作,从而使它可以作为一个自包含的部署组件。

-- set up a catalog
CREATE CATALOG hive_catalog WITH ('type' = 'hive');
USE CATALOG hive_catalog;

-- or use temporary objects
CREATE TEMPORARY TABLE clicks (
  user_id BIGINT,
  page_id BIGINT,
  viewtime TIMESTAMP
) WITH (
  'connector' = 'kafka',
  'topic' = 'clicks',
  'properties.bootstrap.servers' = '...',
  'format' = 'avro'
);

-- set the execution mode for jobs
SET execution.runtime-mode=streaming;

-- set the sync/async mode for INSERT INTOs
SET table.dml-sync=false;

-- set the job's parallelism
SET parallism.default=10;

-- set the job name
SET pipeline.name = my_flink_job;

-- restore state from the specific savepoint path
SET execution.savepoint.path=/tmp/flink-savepoints/savepoint-bb0dab;

BEGIN STATEMENT SET;

INSERT INTO pageview_pv_sink
SELECT page_id, count(1) FROM clicks GROUP BY page_id;

INSERT INTO pageview_uv_sink
SELECT page_id, count(distinct user_id) FROM clicks GROUP BY page_id;

END;

Hive 查询语法兼容性

用户现在在 Flink 上也可以使用 Hive SQL 语法。除了 Hive DDL 方言之外,Flink现在也支持常用的 Hive DML 和 DQL 方言。

为了使用 Hive SQL 方言,需要设置 table.sql-dialect 为 hive 并且加载 HiveModule。后者非常重要,因为必须要加载 Hive 的内置函数后才能正确实现对 Hive 语法和语义的兼容性。例子如下:

CREATE CATALOG myhive WITH ('type' = 'hive'); -- setup HiveCatalog
USE CATALOG myhive;
LOAD MODULE hive; -- setup HiveModule
USE MODULES hive,core;
SET table.sql-dialect = hive; -- enable Hive dialect
SELECT key, value FROM src CLUSTER BY key; -- run some Hive queries 

需要注意的是, Hive 方言中不再支持 Flink 语法的 DML 和 DQL 语句。如果要使用 Flink 语法,需要切换回 default 的方言配置。

优化的 SQL 时间函数

在数据处理中时间处理是一个重要的任务。但是与此同时,处理不同的时区、日期和时间是一个日益复杂的任务。

在 Flink 1.13 中,我们投入了大量的精力来简化时间函数的使用。我们调整了时间相关函数的返回类型使其更加精确,例如 PROCTIME(),CURRENT_TIMESTAMP() 和 NOW()。

其次,用户现在还可以基于一个 TIMESTAMP_LTZ 类型的列来定义 Event Time 属性,从而可以优雅的在窗口处理中支持夏令时。

用户可以参考 Release Note 来查看该部分的完整变更。

PyFlink 核心优化

这个版本对 PyFlink 的改进主要是使基于 Python 的 DataStream API 与 Table API 与 Java/scala 版本的对应功能更加一致。

Python DataStream API 中的有状态算子

在 Flink 1.13 中,Python 程序员可以享受到 Flink 状态处理 API 的所有能力。在 Flink 1.12 版本重构过的 Python DataStream API 现在已经拥有完整的状态访问能力,从而使用户可以将数据的信息记录到 state 中并且在后续访问。

带状态的处理能力是许多依赖跨记录状态共享(例如 Window Operator)的复杂数据处理场景的基础。

以下例子展示了一个自定义的计算窗口的实现:

class CountWindowAverage(FlatMapFunction):
    def __init__(self, window_size):
        self.window_size = window_size

    def open(self, runtime_context: RuntimeContext):
        descriptor = ValueStateDescriptor("average", Types.TUPLE([Types.LONG(), Types.LONG()]))
        self.sum = runtime_context.get_state(descriptor)

    def flat_map(self, value):
        current_sum = self.sum.value()
        if current_sum is None:
            current_sum = (0, 0)
        # update the count
        current_sum = (current_sum[0] + 1, current_sum[1] + value[1])
        # if the count reaches window_size, emit the average and clear the state
        if current_sum[0] >= self.window_size:
            self.sum.clear()
            yield value[0], current_sum[1] // current_sum[0]
        else:
            self.sum.update(current_sum)

ds = ...  # type: DataStream
ds.key_by(lambda row: row[0]) \
  .flat_map(CountWindowAverage(5))

PyFlink DataStream API 中的用户自定义窗口

Flink 1.13 中 PyFlink DataStream 接口增加了对用户自定义窗口的支持,现在用户可以使用标准窗口之外的窗口定义。

由于窗口是处理无限数据流的核心机制 (通过将流切分为多个有限的『桶』),这一功能极大的提高的 API 的表达能力。

PyFlink Table API 中基于行的操作

Python Table API 现在支持基于行的操作,例如用户对行数据的自定义函数。这一功能使得用户可以使用非内置的数据处理函数。

一个使用 map() 操作的 Python Table API 示例如下:

@udf(result_type=DataTypes.ROW(
  [DataTypes.FIELD("c1", DataTypes.BIGINT()),
   DataTypes.FIELD("c2", DataTypes.STRING())]))
def increment_column(r: Row) -> Row:
  return Row(r[0] + 1, r[1])

table = ...  # type: Table
mapped_result = table.map(increment_column)

除了 map(),这一 API 还支持 flat_map(),aggregate(),flat_aggregate() 和其它基于行的操作。这使 Python Table API 的功能与 Java Table API 的功能更加接近。

PyFlink DataStream API 支持 Batch 执行模式

对于有限流,PyFlink DataStream API 现在已经支持 Flink 1.12 DataStream API 中引入的 Batch 执行模式。

通过复用数据有限性来跳过 State backend 和 Checkpoint 的处理,Batch 执行模式可以简化运维,并且提高有限流处理的性能。

其它优化

基于 Hugo 的 Flink 文档

Flink 文档从 JekyII 迁移到了 Hugo。如果您发现有问题,请务必通知我们,我们非常期待用户对新的界面的感受。

Web UI 支持历史异常

Flink Web UI 现在可以展示导致作业失败的 n 次历史异常,从而提升在一个异常导致多个后续异常的场景下的调试体验。用户可以在异常历史中找到根异常。

优化失败 Checkpoint 的异常和失败原因的汇报

Flink 现在提供了失败或被取消的 Checkpoint 的统计,从而使用户可以更简单的判断 Checkpoint 失败的原因,而不需要去查看日志。

Flink 之前的版本只有在 Checkpoint 成功的时候才会汇报指标(例如持久化数据的大小、触发时间等)。

提供『恰好一次』一致性的 JDBC Sink

从 1.13 开始,通过使用事务提交数据,JDBC Sink 可以对支持 XA 事务的数据库提供『恰好一次』的一致性支持。这一特性要求目标数据库必须有(或链接到)一个 XA 事务处理器。

这一 Sink 现在只能在 DataStream API 中使用。用户可以通过 JdbcSink.exactlyOnceSink(…) 来创建这一 Sink(或者通过显式初始化一个 JdbcXaSinkFunction)。

PyFlink Table API 在 Group 窗口上支持用户自定义的聚合函数

PyFlink Table API 现在对 Group 窗口同时支持基于 Python 的用户自定义聚合函数(User-defined Aggregate Functions, UDAFs)以及 Pandas UDAFs。这些函数对许多数据分析或机器学习训练的程序非常重要。

在 Flink 1.13 之前,这些函数仅能在无限的 Group-by 聚合场景下使用。Flink 1.13 优化了这一限制。

Batch 执行模式下 Sort-merge Shuffle 优化

Flink 1.13 优化了针对批处理程序的 Sort-merge Blocking Shuffle 的性能和内存占用情况。这一 Shuffle 模式是在Flink 1.12 的 FLIP-148 中引入的。

这一优化避免了大规模作业下不断出现 OutOfMemoryError: Direct Memory 的问题,并且通过 I/O 调度和 broadcast 优化提高了性能(尤其是在机械硬盘上)。

HBase 连接器支持异步维表查询和查询缓存

HBase Lookup Table Source 现在可以支持异步查询模式和查询缓存。这极大的提高了使用这一 Source 的 Table / SQL 维表 Join 的性能,并且在一些典型情况下可以减少对 HBase 的 I/O 请求数量。

在之前的版本中,HBase Lookup Source 仅支持同步通信,从而导致作业吞吐以及资源利用率降低。

升级 Flink 1.13 需要注意的改动

  • FLINK-21709 – 老的 Table & SQL API 计划器已经被标记为废弃,并且将在 Flink 1.14 中被删除。Blink 计划器在若干版本之前已经被设置为默认计划器,并且将成为未来版本中的唯一计划器。这意味着 BatchTableEnvironment 和 DataSet API 互操作后续也将不再支持。用户需要切换到统一的 TableEnvironment 来编写流或者批的作业。
  • FLINK-22352 – Flink 社区决定废弃对 Apache mesos 的支持,未来有可能会进一步删除这部分功能。用户最好能够切换到其它的资源管理系统上。
  • FLINK-21935 – state.backend.async 这一配置已经被禁用了,因为现在 Flink 总是会异步的来保存快照(即之前的配置默认值),并且现在没有实现可以支持同步的快照保存操作。
  • FLINK-17012 – Task 的 RUNNING 状态被细分为两步:INITIALIZING 和 RUNNING。Task 的 INITIALIZING 阶段包括加载 state 和在启用 unaligned checkpoint 时恢复 In-flight 数据的过程。通过显式区分这两种状态,监控系统可以更好的区分任务是否已经在实际工作。
  • FLINK-21698 – NUMERIC 和 TIMESTAMP 类型之间的直接转换存在问题,现在已经被禁用,例如 CAST(numeric AS TIMESTAMP(3))。用户应该使用 TO_TIMESTAMP(FROM_UNIXTIME(numeric)) 来代替。
  • FLINK-22133 – 新的 Source 接口有一个小的不兼容的修改,即 SplitEnumerator.snapshotState() 方法现在多接受一个 checkpoint id 参数来表示正在进行的 snapshot 操作所属的 checkpoint 的 id。
  • FLINK-19463 – 由于老的 Statebackend 接口承载了过多的语义并且容易引起困惑,这一接口被标记为废弃。这是一个纯 API 层的改动,而并不会影响应用运行时。对于如何升级现有作业,请参考作业迁移指引

其它资源

二进制和代码可以从 Flink 官网的下载页面获得,最新的 PyFlink 发布可以从 PyPI 获得。

如果想要升级到 Flink 1.13,请参考发布说明。这一版本与之前 1.x 的版本在标记为@Public 的接口上是兼容的。

用户也可以查看新版本修改列表更新后的文档来获得修改和新功能的详细列表。

原文链接:
https://flink.apache.org/news/2021/05/03/release-1.13.0.html

原文链接:https://developer.aliyun.com/article/784199?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关推荐

10分钟速成!在微信公众号增加AI助手的超简单攻略

在阿里云上,只需 10 分钟即可在您的微信公众号(订阅号)上部署集成一个 AI 智能客服,以便全天候(7x24)回应客户咨询,提升用户体验、增强业务竞争力!按照本方案即可实现0元体验部署(免费试用额度内)、无技术门槛,人人皆可快速上手玩转AI。

阿里云开发者 5403

福利来了!计算巢支持在已经购买的 ECS 上搭建幻兽帕鲁服务器,支持图形化管理配置

现在你可以参考这篇教程,将原来搭建的幻兽帕鲁服务器迁移到计算巢上,享受计算巢上所支持的界面化调整游戏配置(死亡掉落、服务器密码等)。或者也可以用于重新安装,升级到最新版本的计算巢幻兽帕鲁服务。

阿里云开发者 2169

MQTT Broker 规则引擎入门:快速指南

本文将向您介绍 EMQX MQTT Broker 的规则引擎功能,并阐述其在 MQTT 消息转换和数据集成方面的重要作用。同时,我们还将提供一份快速入门指南,通过实例帮助您快速上手 MQTT 规则引擎。MQTT 是一种高效可靠的消息传输协议,特别适用于低带宽、高延迟网络(在物联网领域十分常见)。在 MQTT 的发布/订阅模型中,MQTT Broker 扮演着关键角色,负责接收发布者发送的消息并将其可靠高效地分发给订阅者,确保消息的顺利传递。

阿里云开发者 3138

2023 年最适用于工业物联网领域的三款开源 MQTT Broker

MQTT 最初作为一种轻量级的发布/订阅消息传递协议而设计,如今已经成为工业物联网(IIoT)和工业 4.0 发展的重要基础。它的意义在于实现了各类工业设备与云端的无缝连接,促进了运营技术(OT)和信息技术(IT)的融合。本文对比分析了 2023 年工业物联网领域最优秀的三款 MQTT Broker,介绍了它们的优点、缺点和应用场景。同时,还展示了如何利用这三款 MQTT Broker,为您的工业物联网解决方案打造统一命名空间(UNS)架构。

阿里云开发者 3190

使用 Terraform 在 GCP 上一键部署 EMQX MQTT Broker

MQTT 是一种轻量级的消息传递协议,适用于物联网应用实现设备间通信。作为一款主流的开源 MQTT Broker,EMQX 能够提供高扩展性、可靠性和安全性的 MQTT 消息传递服务。借助广泛应用的基础设施即代码(IaC)工具 Terraform,您可以轻松在 GCP 上自动部署 EMQX MQTT Broker,从而简化和规范 MQTT 基础设施的设置和管理。本文将指导您如何设置 GCP 项目、创建服务账户、编写 Terraform 配置文件,实现轻松部署 EMQX MQTT Broker。

阿里云开发者 2698

MaxCompute中如何处理异常字符

在处理数据时,当业务数据同步至MaxCompute后,会产生一些含异常字符的脏数据,比如字段中包含了一个不可见字符,在DataWorks中显示不出来,但在BI界面又会显示成其他字符,影响整体观感。这种情况,通常我们的解法是,将异常的字符洗掉,下面来介绍几种常见的处理异常字符的方法。如下图,可以看到“异常name”和“正常name”的 length值 不同,多了个不可见字符,但是我们并不能看出来啥。后期做数据处理或数据展示可能成为一个难以定位的问题。

阿里云开发者 2708

构建可靠的物联网系统:了解 MQTT 性能测试

近十年来,物联网迎来了爆炸式的增长。面对海量的设备及其产生的数据,物联网应用和服务变得越来越复杂。我们不仅要保证这些物联网系统的业务功能正确无误,还要保证系统能够支持大量设备之间持续稳定地通信。性能测试是一种检验系统健壮性的方法,它关注扩展性、可用性、可靠性等指标,可以帮助发现系统在正常使用场景下以及在极限使用场景下的表现。对物联网系统进行集成测试和端到端测试,以保证系统功能的正确性,已经是业界的通用做法。因此,我们需要通过性能测试以确保所构建的物联网系统是稳定可靠的。

阿里云开发者 2769

数据隐私为先:EMQX Cloud BYOC 架构解析

EMQ 近期推出了 EMQX Cloud BYOC,采用了以数据隐私为先的架构,为解决这些问题提供了一个理想的方案。用户可以在自己的云环境中部署 MQTT 集群,完全掌控自己的数据隐私和安全。随着物联网的飞速发展,保护数据隐私和安全变得愈发重要。构建一个安全、可靠、可扩展的物联网基础设施成为企业的首要任务。本文将深入剖析 EMQX Cloud BYOC 的架构,并探讨它如何保障您的物联网基础设施安全。

阿里云开发者 2577

谈一谈文件系统的多租户实践

多租户是云服务的重要属性。通过集群级别调度云服务实例,亦或是机器级别调度来自不同云服务实例的请求,云服务既要保证整个集群的物理资源都得到高效的利用,同时也要保证每个租户都能达到预期的性能指标。

阿里云开发者 2773

Sparkplug 规范中涉及 MQTT Broker 的 5 个关键概念

Sparkplug 是一种为 SCADA 系统量身定制的工业物联网通信协议。它为工业设备和应用提供了一种标准的通信格式,实现了不同厂商设备的互操作性。Sparkplug 规范由 Cirrus Link Solutions 和 Eclipse Foundation 共同制定。它是开放的,不属于某一家公司。

阿里云开发者 2649

对象存储异地多活容灾架构解析

作为一个分布式的存储,对象存储底层是采用多副本方式实现的,以便在一个可用区内,保证每个写入的对象都有极高的可靠性,其数据可靠性不低于“12个9”、服务设计可用性(或业务连续性)不低于99.995%。虽然硬盘故障、单机异常等情况不会影响到数据可用性和可靠性,但是在面对机房级别故障(如停电、网络异常)或自然灾难(如地震、海啸)等导致的一个数据中心无法提供服务时,使用该数据中心的客户服务还是会受到影响的,因此异地容灾能力不可或缺,当某集群发生异常时,需要快速切换服务,保障业务的可用性。

阿里云开发者 2723

浅谈对象存储分布式缓存

下图是用户读取数据的系统路径图,红线部分是键值存储系统直读飞天盘古优化。随着键值存储系统直读飞天盘古功能的上线开通,块数据的读取可以绕过键值存储系统,直接请求飞天盘古系统读取,这在一定程度缩短了数据读取的路径,减少了整体对象存储系统的响应时间,但是同时也使得键值存储系统路径上对数据读取的缓存优化失效,导致飞天盘古的请求压力上升。针对一次对象数据读取,用户请求会通过负载均衡到业务前端系统,业务前端系统通过计算得到对象的块列表并进行遍历,请求键值存储系统获取块数据,最后将读取的块数据有序地返回给用户。

阿里云开发者 2698

【达摩院OpenVI—通用检测系列之视频目标检测】(ICASSP 2023) 针对流感知的长短支路网络 LongShortNet

传统视频目标检测(Video Object Detection, VOD)任务以一段视频作为输入,利用视频的时序信息进行目标检测,并最终输出每一帧视频帧的检测结果。其相比图像目标检测(Image Object Detection, IOD)任务,优势在于能够利用视频的时序信息,对运动模糊、图像失焦、遮挡、物体姿态变化等困难的场景具有更强的鲁棒性。然而,传统的VOD和IOD都是离线(offline)的检测,即仅考虑算法的检测精度,未考虑算法的延时。

阿里云开发者 2643

如何保证分布式文件系统的数据一致性

分布式文件系统在设计实现的时候面临的一个首要问题是数据一致性,即需要向用户提供一个合理的数据一致性模型(Consistency Model),这个数据一致性模型成为用户程序和系统之间的一个合约(Contract)。这个合约里的规则保证程序对数据的读写结果是可预期和可理解的。具体到分布式文件系统的客户端,如果没有缓存,数据一致性和多个进程访问本地文件系统的场景是类似的。如共享模式,当客户端打开一个文件时,可以指定被分配的文件句柄在被关闭以前该文件是否允许被再次打开,如果允许,就可以指定允许的请求读写权限。

阿里云开发者 4181

【OpenVI—论文解读系列】达摩院高清人像美肤模型ABPN CVPR论文深入解读

相较于互娱场景的磨皮美颜,广告级、影楼级的精细化美肤给算法带来了更高的要求与挑战。另一方面,在去除瑕疵的过程中,需要尽可能的保留皮肤的纹理、质感,实现高精度的皮肤修饰;最后也是十分重要的一点,随着摄影设备的不断迭代,专业摄影领域目前常用的图像分辨率已经达到了4K甚至8K,这对算法的处理效率提出了极其严苛的要求。为此,我们以实现专业级的智能美肤为出发点,研发了一套高清图像的超精细局部修图算法ABPN,在超清图像中的美肤与服饰去皱任务中都实现了很好的效果与应用。

阿里云开发者 2550

【达摩院OpenVI-视觉评价系列之MOS评价实战篇】手机存储不够用,清理照片太痛苦?MOS评价帮你挑选“垃圾”照片

传统的主观评价方法需要大量人力和时间成本,使得其在实际应用中受到一定限制。而深度学习模型可以在大规模数据集上进行训练,从而可以在更广泛的场景下进行应用。相比于传统的主观评价方法需要大量受试者进行评估,使用深度学习模型可以大大减少评估时间和人力成本,从而提高评估效率。使用深度学习模型进行评价可以使得评估结果具有可重复性,不会像传统的主观评价方法一样受到个体差异的影响。深度学习模型可以通过训练来学习人类主观评价的规律和模式,从而使得评估结果更加一致和准确。

阿里云开发者 2530

Seata Saga 模式快速入门和最佳实践

本文主要介绍 Seata Saga 模式的使用以及最佳实践,围绕三个部分展开,第一部分是 Seata Saga 的简介、第二部分是带大家快速入门,学习怎么使用 Seata Saga 模式,最后一部分将会给大家分享一些 Seata Saga 实践中的经验,帮助用户更快、更好得使用 Seata Saga 模式。Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

阿里云开发者 2543

达摩院|视觉智能AI场景解决方案——AI智慧运动

由阿里云|达摩院——视觉智能平台推出的新功能AI智慧运动健身/线上体育由摄像头拍摄人像动作视频,通过AI进行图像和实时检测出,识别出人体关键点,检测不规范肢体动作,同时可实现实时反馈和计数。已支持的健身动作有15种,还可支持定制健身动作。主要涉及:肢体动作计数离线SDK;肢体动作计数反馈离线SDK;动作打分离线SDK。【达摩院|视觉智能AI场景解决方案——AI智慧运动】-阿里云开发者社区本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。

阿里云开发者 2892

阿里云斩获 4 项年度云原生技术服务优秀案例

云原生是一种基于容器化、微服务等技术的应用开发和部署模式,它可以帮助企业快速构建和部署应用程序,提高应用的可靠性、弹性和可扩展性,让企业可以更加敏捷地响应市场需求,快速上线新产品和服务,提高数字化转型的效率和速度,利用云原生技术架构和理念构建数字化新底座正在成为各行各业数字创新的实践重点。日前,在 ICT 中国·2023 高层论坛-云原生产业发展论坛上,由阿里云容器服务提供技术支持的。两大产品技术方案,共同获得 2023 年度云原生应用实践先锋——云原生技术服务优秀案例。

阿里云开发者 2483

阿里云携手开放原子开源基金会倡议发起云原生工作委员会,两大开源项目达成捐赠意向

6月11日,2023开放原子全球开源峰会正式拉开帷幕。本届峰会以“开源赋能,普惠未来”为主题,设置了开幕式暨高峰论坛、20余场分论坛和开源成果及重点项目展览。在峰会主论坛,开放原子开源基金会理事长孙文龙协各家单位共同倡议发起云原生工作委员会。

阿里云开发者 2411

【OpenVI—论文解读系列】达摩院开源低成本大规模分类框架FFC CVPR论文深入解读

2.)长尾问题:实际场景中,当数据集达到上亿ID时,往往其绝大部分ID内的图片样本数量会很少,数据长尾分布非常明显,直接训练难以获得较好效果。1.)成本问题:分布式训练框架 + 海量数据情况下,内存开销、多机通信、数据存储与加载都会消耗更多的资源。

阿里云开发者 1431

当 Rokid 遇上函数计算

Rokid 通过语音识别、自然语言处理、计算机视觉、光学显示、芯片平台、硬件设计等多领域研究,将前沿的 Al 和 AR 技术与行业应用相结合,为不同垂直领域的客户提供全栈式解决方案,有效提升用户体验、助力企业增效、赋能公共安全,其 Al、AR 产品已在全球八十余个国家和地区投入使用。Rokid Air Pro 这款AR眼镜产品,为旅游景点,大型企业,国内科研机构都提供了服务支持。目前 Rokid 已和全国百余家博物馆和景区达成合作,给游客穿越时空,身临其境的非凡参观体验。

阿里云开发者 900

为数据弹性而生,阿里云云原生存储再提速

以 AI 训练、基因计算、工业仿真等高性能计算场景为例,需要在短时间内并发执行海量计算,多计算实例共享访问文件系统的同一数据源。企业在 Kubernetes 上运行 AI、大数据应用已成主流,资源弹性和开发运维效率得到显著提升的同时,计算存储分离架构也带来了挑战:网络延迟高、网络费用贵、存储服务带宽不足等。然而,随着算力规模和性能提升、以及模型规模和工作负载复杂度的增加,在云原生的机器学习和大数据场景下,高性能计算对并行文件系统的数据访问性能和灵活性要求也越来越高。

阿里云开发者 684

Koordinator 最佳实践系列:精细化 CPU 编排

在云原生环境中,集群提供者常常将不同类型的工作负载部署在同一个集群中,利用不同业务的不同峰值效果,实现资源分时复用,避免资源浪费。然而,不同类型负载之间混合部署常常会导致资源竞争和相互干扰。最为典型的场景便是在线和离线负载的混合部署。当离线较多的占用计算资源时,在线负载的响应时间就会受到影响;当在线长时间较多的占用计算资源时,离线负载的任务完成时间不能得到保证。这种现象属于 Noisy Neighbor 问题。根据混合部署的程度、资源类型的不同,解决该问题有许多不同的思路。

阿里云开发者 256

面向多告警源,如何构建统一告警管理体系?

本文介绍告警统一管理的最佳实践,以帮助企业更好地处理异构监控系统所带来的挑战和问题。

阿里云开发者 402

基于阿里云 Serverless 容器服务轻松部署企业级 AI 应用

同时,数禾科技 AI 模型服务支持自动调整容量,满足不同业务压力下的需求,从而保障业务的稳定运行。不仅如此,采用云原生架构方案,平均部署周期由之前的1天缩短至 0.5天,大幅提升了研发迭代效率,从而加速商业化应用的进程,为金融业务提供新的增长动力。同时,随着模型在线推理服务数量的增加,数禾的模型服务也变得越来越庞大、臃肿,难以管理。为了解决这些“顽疾”,数禾科技采用阿里云 ASK 部署线上模型,无需 K8s 节点管理,根据实时流量动态使用 POD,资源成本节省 60%;

阿里云开发者 346

为什么 Serverless 能提升资源利用率?

业务的负载往往不是一成不变的,而是随着时间呈现一定的上下波动。传统的应用构建方式一般是备足充分的资源以保障业务可用性,造成资源利用率不高的现象。随着容器技术的普及,应用可以通过弹性伸缩或者应用混部的方式来提升资源利用率,但由于资源管理的复杂度,难以在业务可用性和资源利用率上取得较好的平衡。业务使用 Serverless 平台能够大幅提升资源利用率,实现降本提效的效果。Serverless 平台的出现,将资源管理的责任从用户侧转移到平台侧。

阿里云开发者 242

【OpenVI—论文解读系列】ICLR 2023 | 达摩院开源轻量人脸检测DamoFD

人脸检测算法是在一幅图片或者视频序列中检测出来人脸的位置,给出人脸的具体坐标,一般是矩形坐标,它是人脸关键点、属性、编辑、风格化、识别等模块的基础。学术界用来衡量人脸检测器性能的benchmark是[WiderFace](WIDER FACE: A Face Detection Benchmark),该数据集主要明确了人脸检测器面对的一些挑战,包括scale,pose,occlusion等。本文的研究问题是如何自动搜索轻量级人脸检测器的backbone?

阿里云开发者 507

RocketMQ 学习社区重磅上线!AI 互动,一秒了解 RocketMQ 功能源码

立足于企业业务集成的核心场景,RocketMQ 在高可靠低延迟方面重点优化,构建了全新的低延迟存储引擎和多场景容灾解决方案;面向业务集成过程中链路逻辑的多样性,RocketMQ 提供了丰富的业务消息类型,历经十多年双十一严苛流量验证的 RocketMQ,承载了超过万亿级消息规模的洪峰压力。2021 年 Apache RocketMQ 更是进入全新 5.0 时代。Apache RocketMQ 诞生至今,一直服务于 100% 阿里集团内部业务、阿里云以及开源社区数以万计的企业客户。

阿里云开发者 295

阿里云 Serverless 容器服务全面升级:新增组件全托管、AI 镜像秒级拉取能力

Gartner 曾预测,2023 年 70% 的 AI 应用将基于容器和 Serverless 技术开发。作为云原生的重要技术组成,K8s 已经被开发者和企业广泛认可,然而其自身复杂性和陡峭的学习曲线依然让人望而生畏。6 月 1 日在阿里云峰会·粤港澳大湾区上,阿里云智能云原生应用平台总经理丁宇宣布,

阿里云开发者 255
上一篇: 阿里云开源PolarDB数据库,与社区共建云原生分布式数据库生态
下一篇: 阿里云携手 VMware 共建云原生 IoT 生态,聚开源社区合力打造领域标准
阿里开发者
阿里开发者 企业官方账号 企业官方账号
博客等级 码龄10年 2万+粉丝 2373原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值