IoT数据倾斜之实时任务调优

简介: IoT数据的特点不单是量大,而且传感器或者设备上报频率差异性很大。有些设备比如智能电表5分钟至15分钟上报一次就可以满足业务需要了,而有些设备比如工业一台机床上万个测点,间隔一秒上报一次。在这样的差异性下,针对单设备的实时处理数据势必会产生数据倾斜,这将导致任务的延时,从而影响指标后续业务效果,比如实时警报或者大屏刷新等。今天这批文章介绍IoT同学如何解决该问题

在开发实时Flink任务的时候,可能会出现任务业务延时较高,超出预期的时间范围,导致数据无法及时正确产出的情景。比如摘要介绍的数据倾斜场景。这个时候就要从多个维度对任务进行调优。下面将介绍实时任务调优的一些方法。

 

定位性能瓶颈Vertex

首先要定位出现问题的Vertex。在运行信息 > Vertex拓扑中查看节点的信息。每个Vertex会有自己的健康分,当某个Vertex健康分过低时,该Vertex可能出现问题,从而影响整个链路。

图片 1.png

链路中的Vertex也会出现反压现象。反压是指当下游的Vertex处理数据的能力不足时,上游会停止发送数据,避免数据丢失。定位反压节点可以看IN_QOUT_Q指标。每个Vertex的信息中,有IN_QOUT_Q指标,分别表示进入队列和输出队列中元素个数/队列总长度。当一个VertexIN_Q满,OUT_Q空,则该节点有性能问题,会对上游的节点造成反压。另外一种方式是,节点信息中,查看BackPressure > Status,如果是绿色ok,则不存在反压,如果是红色high,则存在反压,该节点的下游存在性能瓶颈。

图片 2.png

找到性能出现瓶颈的节点后,开始对节点进行调优。

 

资源和参数调优

任务出现性能瓶颈一个很大的原因是资源分配不足,这个时候就需要对资源配置,例如并发数(Parallelism)、CPUCore)和堆内存(Heap Memory进行调优。其中core的默认值是0.1,一般建议配置为0.25,除了当处理数据源较小,且任务的计算逻辑不复杂的时候,可以为任务统一分配1CU,此时每个节点的core随机根据节点的复杂度分配。

core配置一定的情况下,调整节点的并发数,为节点分配资源。如果该节点是source节点,考虑数据源表的大小和数据源表分区的多少。根据数据源表的大小分配并发数,且并发数不超过源表分区的数量。例如数据源表是sls源表,只有两个分区时,只用一个并发就够了,最多两个。如果该节点是中间的计算节点,预算计算节点的复杂度,根据复杂度分配并发数。尽量把含有复杂运算的节点拆解出来,为其独立分配并发。

参数调优分为上下游参数的调优和作业参数的调优。针对上下游参数的调优主要是设置batchsize,因为flink处理流式数据,每条数据均会触发上下读写,  为了降低上下游读写的压力,设置batchsize可以批量读写数据。该参数在DDLwith参数中设置。

当任务涉及到聚合逻辑(group by, partition by)时,需要加入任务调优参数。任务调优参数在作业参数中设置。

MiniBatch

提升吞吐,降低对下游压力

LocalGlobal

优化数据倾斜问题

TTL

设置State状态时间

 

代码调优

调整资源和参数后,如果任务仍存在性能瓶颈,需要优化代码。

数据倾斜问题

判断数据倾斜:在运行信息 > Vertex拓扑中选中一个节点后,在右侧的详细页面中选择SubTasks,查看是否出现数据倾斜问题。观察每个taskIn Queue, Bytes ReceivedRecords Received。如果某一两个TaskIn Queue百分比或者Bytes Received特别高,和其他的taskIn Queue形成明显差别,尤其当某个task In Queue的百分比长期为100%,其他的为0%,则出现了数据倾斜。

图片 3.png 

解决方案

  1. 利用hashcodeMD5手动打散数据,尽量使数据均匀分布。IoT数据的一大特点就是数据倾斜比较严重,用户的数据量差异较大,在进行聚合运算时,经常会出现key聚集的情况,这种现象反应到flink的任务划分上,就是同一个Vertex拓扑中,部分subtasks资源过载,无法快速处理完数据,造成整个任务的反压现象。解决这个现象的办法就是进行数据的打散。

图片 4.png

  1. 使用LocalGroupAggregate

group by的时候开启local aggregate。其中注意统计函数用sum的时候要配合filter,才能开启local group aggregate

 

分组排名问题TOPN

  1. TOPN一共有三种算法,性能从高到低分别是:UpdateFastRank UnaryUpdateRankRetractRank。涉及TOP N函数时,内部算法尽量使用UpdateFastRank。会使性能更好。下图分别打散和不打散数据的性能对比和使用UpdateFastRankRetractRank算法时的性能对比。(上下两个任务流程的数据源完全相同)

 

图片 5.png

 

  1. 在多个维度对指标进行排名时,尽量使程序并行化,多使用union all。例如IoT的数据层级细分很细,有云账号,租户,实例,产品, 设备的层级概念,这些数据具有地域特性,地域的粒度也可以层级细分到国家,省份,城市等。所以当需要在不同维度对指标进行不同地域粒度的排名时,可以分别进行类目处理,并行计算,再用union all的方式整合,提高数据处理效率。
目录
相关文章
IOT03-任务计算
1、时间计算 字段 说明 t 输入时间值,支持yyyyMMddHHmmss ts 输入时间,开始时间yyyyMMddHHmmss te 输入时间,结束时间yyyyMMddHHmmss pt 前一天,yyyyMMddHHmmss ...
793 0
|
4月前
|
物联网 数据管理 Apache
拥抱IoT浪潮,Apache IoTDB如何成为你的智能数据守护者?解锁物联网新纪元的数据管理秘籍!
【8月更文挑战第22天】随着物联网技术的发展,数据量激增对数据库提出新挑战。Apache IoTDB凭借其面向时间序列数据的设计,在IoT领域脱颖而出。相较于传统数据库,IoTDB采用树形数据模型高效管理实时数据,具备轻量级结构与高并发能力,并集成Hadoop/Spark支持复杂分析。在智能城市等场景下,IoTDB能处理如交通流量等数据,为决策提供支持。IoTDB还提供InfluxDB协议适配器简化迁移过程,并支持细致的权限管理确保数据安全。综上所述,IoTDB在IoT数据管理中展现出巨大潜力与竞争力。
117 1
|
20天前
|
传感器 存储 物联网
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点,广泛应用于嵌入式系统开发、通信协议实现及后端服务构建等领域,成为推动物联网技术进步的重要力量。
30 1
|
29天前
|
存储 安全 物联网
C# 在物联网 (IoT) 应用中的应用
本文介绍了C#在物联网(IoT)应用中的应用,涵盖基础概念、优势、常见问题及其解决方法。重点讨论了网络通信、数据处理和安全问题,并提供了相应的代码示例,旨在帮助开发者更好地利用C#进行IoT开发。
45 3
|
1月前
|
安全 物联网 网络安全
智能设备的安全隐患:物联网(IoT)安全指南
智能设备的安全隐患:物联网(IoT)安全指南
85 12
|
1月前
|
传感器 监控 安全
物联网(IoT):定义、影响与未来
物联网(IoT):定义、影响与未来
86 3
|
1月前
|
存储 JSON 运维
智能物联网平台:Azure IoT Hub在设备管理中的实践
【10月更文挑战第26天】随着物联网技术的发展,Azure IoT Hub成为企业管理和连接数百万台设备的强大平台。本文介绍Azure IoT Hub的设备管理功能,包括设备注册、设备孪生、直接方法和监控诊断,并通过示例代码展示其应用。
61 4
|
24天前
|
安全 物联网 物联网安全
揭秘区块链技术在物联网(IoT)安全中的革新应用
揭秘区块链技术在物联网(IoT)安全中的革新应用
|
1月前
|
SQL 监控 物联网
ClickHouse在物联网(IoT)中的应用:实时监控与分析
【10月更文挑战第27天】随着物联网(IoT)技术的快速发展,越来越多的设备被连接到互联网上,产生了海量的数据。这些数据不仅包含了设备的状态信息,还包括用户的使用习惯、环境参数等。如何高效地处理和分析这些数据,成为了一个重要的挑战。作为一位数据工程师,我在一个物联网项目中深入使用了ClickHouse,以下是我的经验和思考。
88 0
|
2月前
|
人工智能 安全 物联网
下一篇
DataWorks