SLS数据加工2021年技术总结

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 过去一年,SLS团队持续对数据加工服务进行了各方面迭代升级,本文总结了相关功能与技术上的进展。

概述


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


SLS数据处理链路



上图是从数据处理链路的角度对SLS的描述,其中包含两个方面。


一方面SLS本身是一个开放的日志数据平台。用户可以通过开放API,把其存储在 SLS 的数据与已有的大数据平台连接起来,这一点与阿里云上很多大数据产品也有紧密合作。另外今年 iLogtail 开源(GitHub库)、阿里云Terrform集成、阿里云统一CLI等等都在推动SLS越来越开放化。


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


  1. 数据导入:打通阿里云上客户自建服务、外部开放服务与SLS的无缝对接
  2. 数据加工:对数据进行实时行处理、以及链路编排
  3. Scheduled SQL:对数据进行定时分析、聚合加工
  4. 数据导出:围绕“数据入湖”等场景给出相应的技术实现与解决方案


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


数据加工


应用场景



这里我们总结下数据加工的常见场景(具体场景很多,这里仅列出典型、常见的场景):


规整:这是使用频率最高的场景,比如从文本日志数据中提取出关键信息,将其转为规范化的数据
富化:比如用户的点击数据中只包含商品ID,在分析时需要从数据库关联起详细信息
脱敏:随着我国信息安全相关法律的完善,对于敏感数据(比如个人信息)的处理要求越来越高
分裂:在数据写出时,出于性能、便捷性考虑会将多条数据合并输出,在分析前则需要拆分出独立数据条目
分发:将不同类型的数据分别写到不同的特定目标中,以供下游定制化使用


用户接口


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


2021年改进详情


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


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


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


加工引擎性能增强


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


  1. 复杂的需求场景导致计算复杂度不可控,要求更强的单点计算能力
  2. 原始数据流的模式不可预知,要求作业的算力伸缩过程极其灵敏


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


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


1. 数据协议层


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


  1. 序列化、反序列化算法实现优化
    数据协议层,也就是从SLS消费的原始数据是Protobuf协议的LogGroup,需要反序列化为单条原始事件;加工后的数据需要根据Protobuf协议进行序列化才能写入SLS。数据协议层作为基础公共代码模块,对所有作业的执行效率有关键作用。通过对一些核心模块用C++重写,在特定场景下性能提升了5倍。
  2. 新增小包合并发送协议
    在数据发送阶段,序列化操作是基于数据的元信息(比如 time、source、topic、tags)组装数据包独立发送,当遇到原始数据的元信息无规则的场景时(比如WebTracking采集数据),就会出现大量小包发送数据,导致网络传输效率不足。数据加工合并处理因元信息不同而无法合并的大量小数据包,这种场景下单次上传提升网络传输效率10+倍。


2. DSL 执行层



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


  • DSL解析器,”预编译”加工脚本
  • 编译优化
  • 逻辑短路
  • 数据模式Lazy-Parse
  • 多级缓存
  • 公共子表达式提取等


3. 内置函数层


针对客户场景中高频使用的内置函数进行深入优化,这里不做赘述,部分优化请参考技术博文。
数据加工DSL编译优化:搜索算子语义等价转换
数据加工DSL编译优化:公共子表达式删除


系统稳定性保障


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


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


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


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


  • 升级时集群中所有作业都可能受到影响,所以总体来说达不到“可灰度”的稳定性要求;
  • 升级过程中一旦出现问题就需要回滚,作业在整个回滚过程中可能都无法正常运行,客户的数据链路将会被阻塞;
  • 每次升级只能升级到相邻版本,所以需要多次升级操作,这不仅增加了工作量,而且几何级的提高了升级风险。


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


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


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


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



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


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


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


数据加工与SLS监控告警能力整合,用户可一键开启加工作业异常告警,接收到告警后可通过手册排错处理。


  • 在控制台上配置加工作业后,默认引导用户开启告警通知,模板化、一键开启。
  • 支持加工流量同环比、错误日志信息、数据处理延迟等多个维度通知,覆盖全部异常场景
    具体使用请参考 为数据加工任务开启监控告警



用户体验提升


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


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


method: 101.37.0.0

request: GET /product/8396812?from=source-2 HTTP/1.1

http_status: 200


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


method: 101.37.0.0

request: GET /product/8396812?from=source-2 HTTP/1.1

http_status: 200

http_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.0

request: GET /product/8396812?from=source-2 HTTP/1.1

http_status: 200


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


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


加工后的结果:


client_ip: 101.37.0.0

request: GET /product/8396812?from=source-2 HTTP/1.1

http_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库,参考文档 IP解析函数


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


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


详情请参考:



场景深化、最佳实践总结


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

应用场景

实践总结

简要说明

信息脱敏

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

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

数据流编排

游戏场景全球日志规划

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

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

数据编码、解码

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

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

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

阿里云威胁情报服务集成

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

使用SLS一键分析VPC流日志

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

Log转Metric

使用数据加工将Log转成Metric

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


其他参考


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


  1. 2021 QCon(北京站)
  1. 2021 K+峰会(上海站)
  1. 2021 Python Meetup(杭州站)


总结


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

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
4月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
22天前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
|
23天前
|
数据采集 运维 监控
|
5月前
|
SQL 监控 数据挖掘
SLS 重磅升级:超大规模数据实现完全精确分析
SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。
468 117
|
3月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
308 4
|
10月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
328 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
11月前
|
存储 运维 监控
Elasticsearch Serverless 高性价比智能日志分析关键技术解读
本文解析了Elasticsearch Serverless在智能日志分析领域的关键技术、优势及应用价值。
508 8
Elasticsearch Serverless 高性价比智能日志分析关键技术解读
|
11月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
184 2
|
10月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
148 0

热门文章

最新文章