伴随Logging、Metrics、Tracing三者融合趋势的部分显现,日志类数据的范围正在泛化,包括:工业传感器数据、日志文件、Prometheus采集的云原生应用指标、Syslog、网络点击日志、stdout、业务埋点等等。html
能够看到:web
•数据规模快速增加,日志类数据是big data的主力。数据库
•采集的日志数据类别正在增长,其一是日志类型泛化,其二是过去被丢弃的数据正被重拾起来。后端
•数据运营的理念在各行各业渗透,更多的日志数据开始获得处理,更多的人开始参与日志分析。api
即便在传统日志领域,以Kubernetes为表明的云原生的流行,也带来了新的日志生命周期管理需求。如何从各类日志源采集数据、分析数据是一项复杂的挑战。数组
除了数据科学家、数据工程师,如今运营、DevOps工程师、用户支持等角色也在分析日志。假设有N
种日志用户,对于M
种类型日志,可能会产生N*M
种日志存储、分析需求。服务器
上图(interana.com, State of Data Insights 2017统计)反映了一个事实:73%的人须要花费几天甚至数星期时间从数据中获得分析结果。网络
另外一个被普遍传播的数字:在数据分析过程当中,数据集成和预处理所耗费的时间占整体80%以上。架构
完成各个数据源采集,接着以尽可能统一的方式(UI、模型、计算架构)对数据作加工、查询。其中,ETL是关键的技术。并发
近一两年来,看到一些关于”ETL已死“的文章。但关键问题尚未解决:
OLAP + OLTP
一体化的系统使人向往,但当前在数据规模、计算任务多样化上有其限定条件。所以,银弹尚未出现,对业务需求进行抽象,根据技术指标作合理的存储、计算选型是一个行之有效的办法。ETL没有消失,也在演进:
数据预处理是本文主题,在多年的ETL技术发展中诞生了不少相关系统。这里选取一部分作回顾:
采集端系统
日志领域,以Logstash(注:新版本支持hosted模式)、Fluentd、Flume、NXLog、Logtail(阿里巴巴)为表明,能够在采集阶段利用机器资源完成必定程度的预处理,不须要专用计算集群作预处理。不足之处是:
数据库系统
它们首先是存储系统,基于行、列存储模型优化,支持了必定的复杂计算能力。经典的如SQL Server、Oracle数据库,现在有OceanBase、Google Spanner这样的分布式数据库。
绝大部分数据库多用于存储清洗后的数据,用于在线服务场景。
批量计算系统
以Hive、MapReduce计算为表明的Hadoop生态系统,主要是面向 OLAP、批操做设计。以可扩展的计算和海量存储能力,解决了big data分析难题。
在延迟敏感型业务占比愈来愈大的背景下,离线系统的延迟高、交互性差,已经不能再唱独角戏。
流计算引擎
Flink、Spark是开源社区很是流行的流计算系统,流模式让ETL变得实时化,定位于通用场景。
云上数据平台
以Alooma、AWS Glue、Azure DataFactory、阿里云DataWorks、Google Cloud DataProc为表明,各个云服务厂商基于的存储、计算服务,在一个系统上为用户提供通用、综合的数据集成、开发能力。
流式存储与计算
在很长一段时间内,以Kafka为表明的数据队列系统被用于临时数据存储。通过近些年的发展,流式存储上拓展了数据分层,基于之上的计算也已成为一个事实。例如:AWS Kinesis Streams、Kafka(KSQL/Kafka Streams)、Apache Pulsar(Pulsar Functions)。
阿里云日志服务(原SLS)是针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数据场景锤炼而成。为用户提供快捷的日志数据采集、消费、投递以及查询分析等功能,提高运维、运营效率。
在日志服务,目前天天的数据处理规模在PB级,涵盖主要日志生态的数据源。数据集成手段包括:
在日志服务上,大量的、多样的数据在日志库(Logstore)存储,进行数据分析要解决三个挑战:
规模问题
多元化分析需求
数据预处理的易用性
在日志服务,数据加工功能用于完成对Logstore数据的预处理,为后续的分析阶段准备数据。
数据加工基于日志服务的流式存储,调度动态数目的worker作计算。计算上提供丰富的算子和场景化UDF,对于复杂需求则能够经过流程控制、条件判断实现行内逻辑组合,跨行的pipeline组合简化数据的嵌套处理需求。
日志服务使用一套通用的数据模型应对各类各样的数据类型。一条Log由保留字段(时间,来源等)和日志内容(多个Key-Value对)组成:
message Log { required uint32 Time = 1;// UNIX Time Format message Content { required string Key = 1; required string Value = 2; } repeated Content Contents = 2; }
结构化的数据能够在这个数据模型上定义出表结构:
__time__ : 1572784373 __source__ : 192.168.2.13 key_a : value a key_b : value b
一样的,对于非结构化或半结构化数据,能够在把所有内容放入一个字段中,并选择性地对字段值作一些处理(例如编码)。
日志服务存储引擎(LogHub)实现了对数据的统一存储,支持如下特性:
数据加工实现的是脱离存储系统以外的计算过程。基于Pull模型获取数据,能够根据worker自身的负载状况决定数据加载的速率。worker与存储系统的网络请求走阿里云内部网络,每次读取批量的数据块,结合传输过程的压缩特性,保证了同region下跨系统交换数据不会成为性能瓶颈。
日志服务的一个Logstore的数据分布在多个shard上,每个shard被append写入数据。调度器负责如下工做:
worker#1
失效后,其对shard 0/1
的处理进度能够被新加入的worker#3
继承。弹性是云服务的标志,在大部分日志的流量特征而言,伸缩能力显得尤其重要。
例如:直播应用的CDN access log,21:00 ~ 23:00
是业务访问高峰期并产生大量日志,到了凌晨1:00 ~ 7:00
日志流量跌至高峰时的10%。按业务峰值规划资源必将产生大量闲置成本。
处理延迟、数据规模、成本三者看起来是鱼和熊掌的关系,在日志服务上,尝试从两个层面来弹性应对:
日志处理场景下绕不过的是时间,时间的定义确又不那么简单。
名称 | 定义 | 日志服务上应用 |
---|---|---|
event-time | 事件时间,真实的业务时间 | 通常建议设置值到__time__ 字段,如写入时未作规划则须要从数据中自行提取 |
server-arrived-time | 该事件到达服务端时间 | 日志服务在接收数据时记录值并填入__tag__:__receive_time__ 字段 |
processing-time | 数据加工处理该事件的时间 | 不肯定,取决于做业模式以及加工速率 |
对于一个加工任务而言,加工的延迟定义为processing-time
- server-arrived-time(latest log)
。因为数据可能迟到或生产者发送了乱序数据,event-time
与server-arrived-time
、processing-time
可能会有较大差别。
数据加工根据server-arrived-time
定义数据源范围,并提供两种做业模式:
[FROM server-arrived-time, -)
。[FROM server-arrived-time, TO server-arrived-time)
,常见的有补数据场景,能够重复地对过去一个时间段作加工。相较于业内流行的SQL、DSL、Python等ETL语言,日志服务数据加工提供的是类Python DSL,封装了日志领域下通用加工过程。
做为业务逻辑开发的重要一环,数据加工DSL提供如下能力:
e_if_else(condition_1, e_compose(operation_1, operation_2, operation_3), operation_4)
。例如,在数据加工DSL中实现对一条日志的分裂、拷贝、条件判断,其内部编排逻辑以下图:
开发、运维效率是考量数据流程维护成本的重要指标。
日志服务数据加工是全托管的服务,使用它不感知机器资源,经过web控制台实现对做业的管理与监控。
在日志的整个生命周期内,数据采集到日志服务存储,数据加工在这以后起着承转启合做用。经过数据加工完成清洗、预处理、分发,让数据在生态流转起来,并更好地适配目标存储的schema要求。
数据规整包括字段抽取、过滤、清洗等工做,完成后数据被转储到下游。规整的意义在于能为下游带来哪些帮助:
以下,content字段是完整的Syslog日志原文,这样一条非结构化数据,经过两行加工代码分别完成Syslog字段抽取、priority字段映射。
对于JSON格式的结构化日志,以下两行代码经过JMES语法对数组作分拆,分拆后每一个子对象分别作嵌套字段提取。
更多实践:
日志分发、复制是一种典型的数据场景。
例如:Kubernetes上采集的众多pod日志集中化到一个Logstore上,能够经过数据加工快速实现按namespace转发到下游Logstore,在下游Logstore上分别设置存储周期、索引分析字段。
数据除了在Logstore之间作流转之外,还能够流向异构存储系统,例如投递到OSS、MaxCompute、ADB等。
更多实践:
对于一个典型的SLB+ECS+Nginx
架构,Nginx access log上包括请求来源(__source__
字段,记录vpc子网ip)、请求资源(request_uri
字段,参数记录了业务租户的project信息)。
RDS中维护了两张维表:
数据加工首先对request_uri
作参数拆分,获取project信息。接下来分别经过ip与project值与两个维表作join,获得结果是更完整的日志信息(包括后端服务器的tag、租户project的打标内容)。
数据加工目前支持四种数据源作查找富化:本地配置、RDS表、OSS文件、日志服务Logstore。
更多实践:
写在最后,ETL业务场景变幻无穷,数据加工在数据分析场景支撑的路上将持续迭代优化。
双11福利来了!先来康康#怎么买云服务器最便宜# [并不简单]参团购买指定配置云服务器仅86元/年,开团拉新享三重礼:1111红包+瓜分百万现金+31%返现,爆款必买清单,还有iPhone 11 Pro、卫衣、T恤等你来抽,立刻来试试手气 https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110
本文为云栖社区原创内容,未经容许不得转载。