查看原文
其他

SLS 数据加工最新技术总结

灵圣 云布道师 2023-06-18

凌云时刻

过去一年,SLS 团队对数据加工服务进行了迭代升级,本文总结了相关功能与技术上的进展。

SLS 数据处理链路

上图是从数据处理链路的角度对 SLS 的描述,其中包含了两个方面。
  • 一方面 ,SLS 本身是一个开放的日志数据平台。用户可以通过开放 API,把其存储在 SLS 的数据与已有的大数据平台连接起来,这一点与阿里云上很多大数据产品也有紧密合作。今年 iLogtail 开源(GitHub库)、阿里云 Terrform 集成、阿里云统一 CLI 等等都在推动 SLS 越来越开放化。

  • 另一方面, SLS 为客户提供一站式数据处理链路服务,支持客户快速完成非结构化数据实时加工处理。如上图所示,整个数据处理链路包含四个功能点:

    • 数据导入:打通阿里云上客户自建服务、外部开放服务与 SLS 的无缝对接

    • 数据加工:对数据进行实时行处理以及链路编排

    • Scheduled SQL:对数据进行定时分析、聚合加工

    • 数据导出:围绕“数据入湖”等场景给出相应的技术实现与解决方案

本文重点将放在数据加工上。

 数据加工

应用场景

这里总结下数据加工的常见场景(具体场景很多,这里仅列出典型常见的场景):
  • 规整:这是使用频率最高的场景,比如从文本日志数据中提取出关键信息,将其转为规范化的数据

  • 富化:比如用户的点击数据中只包含商品 ID,分析时需要从数据库关联详细信息

  • 脱敏:随着我国信息安全相关法律的完善,对于敏感数据(比如个人信息)的处理要求越来越高

  • 分裂:在数据写出时,出于性能、便捷性考虑会将多条数据合并输出,在分析前则需要拆分出独立数据条目

  • 分发:将不同类型的数据分别写到不同的特定目标中,以供下游定制化使用

用户接口

SLS 数据加工语法 DSL (Domain Specific Language)是一个基于 Python 语法的子集,提供了完善的内置函数,详情请参考(附1)

2021年改进详情

 架构升级,免除同地域下数据读写费用

SLS 数据加工正在逐步进行架构升级,发挥 SLS 一站式数据平台的优势,数据加工功能从同地域内 Logstore 读取及写入数据将不再需要在不同服务模块间数据流转。

本次架构升级正在内测中,即将发布。发布完成后,SLS 团队将通过官网等渠道向用户公告。

 加工引擎性能增强

随着客户日趋增长的数据量、复杂多变的数据加工计算,数据加工服务引擎在一些场景下需要更加灵活和弹性,例如:

  • 复杂的需求场景导致计算复杂度不可控,要求更强的单点计算能力

  • 原始数据流的模式不可预知,要求作业的算力伸缩过程极其灵敏

SLS 数据加工作业执行性能依赖多方面因素,详情请参考 SLS 数据加工性能指南。例如在游戏业务场景中,面对开新服活动时的流量高峰,数据加工作业运行需要更高敏感度的自动弹性扩容,保持高效实时性的处理高峰流量的游戏日志。

以下总结过去一年对数据加工性能相关的几个核心迭代。

1、数据协议层

数据协议层的优化分为两个部分:

  • 序列化、反序列化算法实现优化
    数据协议层,也就是从 SLS 消费的原始数据是 Protobuf 协议的 LogGroup,需要反序列化为单条原始事件;加工后的数据需要根据 Protobuf 协议进行序列化才能写入 SLS。数据协议层作为基础公共代码模块,对所有作业的执行效率有关键作用。通过对一些核心模块用 C++重写,在特定场景下性能提升了 5 倍。

  • 新增小包合并发送协议
    在数据发送阶段,序列化操作是基于数据的元信息(比如 time、source、topic、tags)组装数据包独立发送,当遇到原始数据的元信息无规则的场景时(比如 WebTracking 采集数据),就会出现大量小包发送数据,导致网络传输效率不足。数据加工合并处理因元信息不同而无法合并的大量小数据包,这种场景下单次上传提升网络传输效率 10+倍。

2、DSL 执行层

DSL 执行层是数据加工作业运行的计算核心,过去一年我们通过多个方面对 DSL 执行层进行了优化,以下列出一些重点的优化项:

  • DSL 解析器,”预编译”加工脚本

  • 编译优化

  • 逻辑短路

  • 数据模式 Lazy-Parse

  • 多级缓存

  • 公共子表达式提取等

    3、内置函数层

    针对客户场景中高频使用的内置函数进行深入优化,这里不做赘述,部分优化请参考技术博文(附2、附3)

     系统稳定性保障

    1、集群迭代升级,集群内作业无感知

    SLS 数据加工是构建在阿里云容器服务 ACK 之上,得益于其部署简单高效、安全可靠的优势,数据加工的技术架构非常直接。由于集群中运行大量线上作业,集群升级过程对于作业有潜在影响,所以集群升级需要一个确保线上作业稳定性的方案。这一点也导致了集群的升级无法频繁操作。

    为了能够应用到集群最新版本的新功能,集群的升级就势在必行。集群升级有以下两个方案。

    一个方案是使用 ACK 的集群热升级功能,提供升级、暂停、取消等能力。不过对于数据加工的业务场景,此方案存在几个缺点:

    • 升级时集群中所有作业都可能受到影响,所以总体来说达不到“可灰度”的稳定性要求;

    • 升级过程中一旦出现问题就需要回滚,作业在整个回滚过程中可能都无法正常运行,客户的数据链路将会被阻塞;

    • 每次升级只能升级到相邻版本,所以需要多次升级操作,这不仅增加了工作量,而且几何级地提高了升级风险。

      另一个方案是在调度层实现多集群负载均衡的能力,需要升级集群时,将新建作业创建至新集群,逐步将旧版本集群汰换掉。此方案规避了集群热升级潜在的风险,但是新旧版本集群会同时存在很长一段时间,使得运维工作也不小,这也驱动我们进一步完善运维自动化。综前所述,最终选择的是此方案进行升级。

      2、近百个集群统一化监控运维、告警

      如上所述,SLS 数据加工是区域化部署,同时单区域内存在多集群负载均衡,目前已经有近百个集群在线上运行。
      为了保障所有集群的稳定运行,我们通过 SLS 全栈监控应用的指标统一采集与存储方案,实现所有集群的统一监控。
      结合 SLS 告警功能,任何一个集群在任何时间点出现异常事件,都可以及时通知到运维人员进行排查。

      3、自定义伸缩计算指标,满足不同场景的计算需求

      原生的 K8S HPA 内置支持 CPU 和内存两个指标,这对于绝大多数数据密集型作业来说已经足够了。但是在数据加工中,某些客户会对数据编排,进行跨地域数据流转,面对这类网络/IO 敏感场景,内置的 HPA 指标就无法满足。所以我们需要引入更全面的 HPA 指标,以支撑多种多样业务场景下的作业需求。

      除此之外,我们还将使用智能算法对 HPA 指标进行续升级优化, 比如基于作业的历史运行特性,提前做资源分配,更进一步提升作业运行的稳定性。

      4、内置告警规则,客户一键开启作业监控

      数据加工与 SLS 监控告警能力整合,用户可一键开启加工作业异常告警,接收到告警后可通过手册排错处理。具体使用请参考(附4)

      • 在控制台上配置加工作业后,默认引导用户开启告警通知,模板化、一键开启

      • 支持加工流量同环比、错误日志信息、数据处理延迟等多个维度通知,覆盖全部异常场景

       用户体验提升

      1、DSL 语法简化,开放 Python 字典、列表和元组常量

      SLS 数据加工在保证安全性的同时,也在持续增强 DSL 的语法能力,使其更加 Pythonic、更加简洁易用。最新的语法可参考(附5),以下就以 Python 字典常量使用作为例子。

      模拟 HTTP 访问日志:

      method: 101.37.0.0request: GET /product/8396812?from=source-2 HTTP/1.1http_status: 200

      我们需要 HTTP 状态码的具体描述信息,详情如下:

      method: 101.37.0.0request: GET /product/8396812?from=source-2 HTTP/1.1http_status: 200http_description: OK

      可以直接在代码中嵌入完整的 HTTP 状态码表,用于字段映射:

      e_dict_map( { "100": "Continue", "200": "OK", "300": "Multiple Choices", "400": "Bad Request", "500": "Internal Server Error", }, "http_status", "http_description",)

      2、IP 地理解析库精准度进一步提升,更大程度挖掘数据价值

      IP 是日志数据中重要的信息,比如访问客户端的 IP 就可以用于完成用户画像的分析。SLS 数据加工支持开放式的对 IP 地址数据的地理位置(GeoIP)进行解析,并内置了 GeoIP 库方便客户使用。通过调用数据加工预定义函数 geo_parse 即可实现,参考以下例子——某系统的模拟访问日志样例:

      client_ip: 101.37.0.0request: GET /product/8396812?from=source-2 HTTP/1.1http_status: 200

      通过以下数据加工代码获取 client_ip 字段的 IP 地理位置信息:

      e_set("_geo_", geo_parse(v("client_ip")))

      加工后的结果:

      client_ip: 101.37.0.0request: GET /product/8396812?from=source-2 HTTP/1.1http_status: 200_geo_: { "country_en": "CN", "province_en": "330000", "city_en": "330100", "country": "中国", "province": "浙江省", "city": "杭州市", "isp": "阿里云", "lat": 30.294, "lon": 120.162}

      客户通过 geo_parse 函数也可以使用自定义的 GeoIP 库,参考文档(附6)

      3、Terraform集成,作业编排自动化

      使用 Terraform 可以对云上资源进行编码,利用代码来进行增删查改。阿里云已经集成 Terraform,便于客户安全高效地预览、配置和管理云基础架构和资源。通过 Terraform,客户可以方便地管理 SLS 数据加工任务配置。详情请参考(附7、附8)

       场景深化、最佳实践总结

      SLS 数据加工从客户场景角度出发,对一些典型场景的解决方案进行深度总结,这里进行完整汇总。

      应用场景

      实践总结

      简要说明

      信息脱敏

      使用 SLS 数据加工进行敏感信息处理

      随着数字化的推进,个人敏感信息保护显得越来越重要,通过数据加工可实现敏感信息的脱敏处理

      数据流编排

      游戏场景全球日志规划

      多模式日志数据流的实时加工与集散

      数据加工支持跨区域数据复制,客户可选择通过公网传输,也可以针对 SLS Project开启全球加速服务,确保更稳定的传输效率

      数据编码、解码

      SLS 数据加工“数据编码、解码”实践

      阿里云 SLS 数据加工中使用 Python 数据编码

      数据加工提供完善的内置函数,支持各类数据转化场景:编码与解码、压缩与解压缩、加密与解密、哈希摘要

      阿里云威胁情报服务集成

      【新发布】SLS 数据加工增值内容服务

      使用 SLS 一键分析 VPC 流日志

      数据加工提供内置函数扫描数据内容是否存在威胁情报,比如检查访问 IP 是否存在攻击行为

      Log 转 Metric

      使用数据加工将 Log 转成 Metric

      某种程度上来说,Metric 是一种特殊的 Log,数据加工提供内置函数将 Log 中的指标信息转化为 Metric

       其他参考

      过去一年里,SLS 也多次参与开放社区、大会的专题分享,阐述 SLS 加工服务的技术原理与实践。以下是最近几次与数据加工相关的专题分享。

      2021 QCon(北京站)

      • 阿里云数据加工设计及实践(附9)

      2021 K+峰会(上海站)

      • PB级日志数据实时加工原理与实践(附10)

      • K8S下海量数据治理的任务调度框设计及与实现:K+分享(附11)

      2021 Python Meetup(杭州站)

      • Pythonic语法的PB级数据实时加工服务原理与实践(附12)

      总结
      在过去一年里,SLS 数据加工在系统性能、稳定性保障和用户体验提升多个角度持续投入,获得了一定的结果。同时,在与客户深入沟通需求场景后,也总结出多个最佳实践,以供用户参考。
      接下来的工作中,我们依然会在以上几个方面持续深入,为云上客户提供更稳定、更便捷的数据加工服务,同时也将会致力于建设更开放的平台。

       参考文档

      附1:SLS 数据加工语法简介

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

      附2:数据加工 DSL 编译优化:搜索算子语义等价转换

      https://developer.aliyun.com/article/792165

      附3:数据加工 DSL 编译优化:公共子表达式删除

      https://developer.aliyun.com/article/790914

      附4:为数据加工任务开启监控告警

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

      附5:SLS 数据加工语法简介

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

      附6:IP 解析函数

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

      附7:阿里云 Provider 官方文档 - SLS 数据加工

      https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/log_etl

      附8:使用 Terraform 玩转 SLS 数据加工自动化部署

      https://developer.aliyun.com/article/894761

      附9:阿里云实时数据加工服务的设计及实践

      https://blog.csdn.net/bjchenxu/article/details/118383957

      附10:PB 级日志数据实时加工原理与实践

      https://developer.aliyun.com/article/814237

      附11:K8S 下海量数据治理的大规模任务调度框架设计与实践

      http://www.keylinkcon.com/h-col-171.html

      附12:Pythonic 语法的 PB 级数据实时加工服务原理与实践

      https://www.huodongxing.com/event/9638891718600

      您可能也对以下帖子感兴趣

      文章有问题?点此查看未经处理的缓存