海量、低成本历史日志分析实践

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
对象存储 OSS,20GB 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 日志作为一种特殊的数据,对处理历史数据、诊断问题以及了解系统活动等有着非常重要的作用。对数据分析人员、开发人员或者运维人员而言,日志都是其工作过程中必不可缺的数据来源。 通常情况下,为节约成本,我们会将日志设定一定的保存时间,只分析该时间段内的日志,此类日志称之为“热”日志。

背景信息

日志作为一种特殊的数据,对处理历史数据、诊断问题以及了解系统活动等有着非常重要的作用。对数据分析人员、开发人员或者运维人员而言,日志都是其工作过程中必不可缺的数据来源。

通常情况下,为节约成本,我们会将日志设定一定的保存时间,只分析该时间段内的日志,此类日志称之为“热”日志。这种做法,短期内可以满足使用需求,但从长期来看,大量的历史日志被搁置,无法发挥其价值。

对于许多企业而言,对日志分析的需求特征通常为低时效和低频率。并且在一个企业中,为偶发性的日志分析去构建一套完整的日志分析系统,无论在经济成本还是运维成本上都是不划算的。如何在降低存储成本的同时满足大批量日志的分析需求,是摆在企业面前的一道难题。

实施方案

阿里云从用户角度出发,研发了一整套小而精的历史日志数据分析方案。利用阿里云日志服务 LOG(Log Service,简称LOG/原SLS)来投递日志,阿里云对象存储服务(Object Storage Service,简称OSS)来存储日志,Data Lake Analytics(DLA)来分析日志。该方案有以下三个优势:

  • LOG是针对实时数据一站式服务,在阿里集团经历大量大数据场景锤炼而成。提供日志类数据采集、智能查询分析、消费与投递等功能,全面提升海量日志处理/分析能力。LOG强大的日志投递能力,能够从源头对接各种类型的日志格式,并且稳定地将日志投递到指定的位置。

  • OSS低廉的存储成本,能够让您的日志文件存储任意长的时间。

  • DLA强大的分析能力,Serverless的架构,按扫描量收费。DLA可以对投递到OSS上的日志按年、按月、按日进行多维度的分区,提高日志的命中率,降低扫描量,从而以极低的成本、极高的性能来完成大数据量历史日志分析。

架构图

例如,服务部署在云服务器ECS(Elastic Compute Service,简称ECS)集群上,该集群的每台机器上都有一个记录访问情况的日志access.log。希望能够对access.log进行信息抽取,并将过滤后的信息存储至OSS上。本文档将以此为例,详细为您介绍实施步骤。

前提条件

在开始实施步骤之前,需要先完成以下准备工作。

实施步骤

步骤一:通过Logtail采集ECS日志。

详细操作请参见通过Logtail采集ECS日志

根据本示例中的日志文件特点,Logtail配置如下所示。

配置

模式选择完整正则模式,需要提供完整正则表达式。

配置

步骤二:投递日志到OSS

详细操作请参见投递日志到OSS,并且日志服务投递OSS使用Parquet存储的相关配置

OSS投递功能页面,配置各项参数:

配置配置

参数说明:

  • OSS BucketOSS Prefix设置日志投递到OSS的哪个目录。

  • 修改分区格式,将分区列的名字填入到目录中,格式为分区列名=分区列值

    如图所示,修改分区格式默认值,即一级分区列的列名为year,列值为%Y; 二级分区列的列名为month,列值为%m;三级分区列的列名为day,列值为%d。

  • 存储格式设置为parquet

  • 压缩方式设置为snappy,使用snappy算法对数据做压缩,可以减少OSS Bucket存储空间使用量。

日志数据投递到OSS中以后,就可以通过DLA读取并分析OSS中的日志。

步骤三:在DLA中创建OSS连接

登录DLA控制台登录DMS,在DLA中创建一个到OSS的连接。语法如下:

 
 
  1. CREATE SCHEMA oss_log_schema with DBPROPERTIES(
  2. catalog='oss',
  3. location = 'oss://myappbucket/sls_parquet/'
  4. );

location:日志文件所在的OSS Bucket的目录,需以/结尾表示目录。myappbucket是OSS Bucket名字。

步骤四:在DLA中创建指向OSS日志文件的外表(分区表)

 
 
  1. CREATE EXTERNAL TABLE sls_parquet (
  2. content STRING,
  3. client STRING,
  4. process_id STRING,
  5. start_time STRING,
  6. total_time STRING,
  7. status STRING,
  8. original_sql STRING,
  9. rewritten_sql STRING
  10. ) PARTITIONED BY (year STRING, month STRING, day STRING)
  11. STORED AS PARQUET
  12. LOCATION 'oss://myappbucket/sls_parquet/';

注意:

步骤五:使用MSCK命令更新分区信息

外表创建成功后,执行MSCK REPAIR TABLE将分区信息同步到DLA中。MSCK命令只能识别符合DLA分区列命名规则的目录,即分区列的目录名为分区列名=分区列值

 
 
  1. MSCK REPAIR TABLE sls_parquet;

步骤六:查询分区表数据

分区信息同步完成后,使用SELECT语句对日志进行查询分析。例如,得到某一天查询最慢的5条语句。

 
 
  1. SELECT original_sql, total_time
  2. FROM sls_parquet
  3. WHERE client!=''
  4. ORDER BY total_time DESC
  5. LIMIT 5;

后续操作

上述示例中,日志数据投递OSS的存储格式为Parquet格式,除了Parquet格式,LOG还可以将投递文件的格式设置为JSON和CSV。详细的配置,请参见JSON格式CSV格式

JSON格式

  • 当投递文件的格式设置为JSON且无压缩时,建表语句为:

     
       
    1. CREATE EXTERNAL TABLE sls_json (
    2. content STRING,
    3. client STRING,
    4. process_id STRING,
    5. start_time STRING,
    6. total_time STRING,
    7. status STRING,
    8. original_sql STRING,
    9. rewritten_sql STRING
    10. ) PARTITIONED BY (year STRING, month STRING, day STRING)
    11. STORED AS JSON
    12. LOCATION 'oss://myappbucket/sls_json/';
  • 当投递文件的格式设置为JSON且使用标准Snappy压缩时,建表语句为:

     
       
    1. CREATE EXTERNAL TABLE sls_json_snappy (
    2. content STRING,
    3. client STRING,
    4. process_id STRING,
    5. start_time STRING,
    6. total_time STRING,
    7. status STRING,
    8. original_sql STRING,
    9. rewritten_sql STRING
    10. ) PARTITIONED BY (year STRING, month STRING, day STRING)
    11. STORED AS JSON
    12. LOCATION 'oss://myappbucket/sls_json_snappy/'
    13. TBLPROPERTIES(
    14. 'text.compression'='snappy',
    15. 'io.compression.snappy.native'='true'
    16. );

CSV格式

  • 当投递文件的格式设置为CSV,不包含header,使用标准Snappy压缩时,建表语句为:

     
       
    1. CREATE EXTERNAL TABLE sls_csv_snappy (
    2. content STRING,
    3. client STRING,
    4. process_id STRING,
    5. start_time STRING,
    6. total_time STRING,
    7. status STRING,
    8. original_sql STRING,
    9. rewritten_sql STRING
    10. ) PARTITIONED BY (year STRING, month STRING, day STRING)
    11. ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    12. WITH SERDEPROPERTIES(
    13. 'separatorChar'=',',
    14. 'quoteChar'='"',
    15. 'escapeChar'='\\'
    16. )
    17. STORED AS TEXTFILE
    18. LOCATION 'oss://myappbucket/sls_csv_snappy/'
    19. TBLPROPERTIES(
    20. 'text.compression'='snappy',
    21. 'io.compression.snappy.native'='true',
    22. 'skip.header.line.count'='0'
    23. );

    csv

  • 当投递文件的格式设置为CSV无压缩,且包含header时,建表语句为:

     
       
    1. CREATE EXTERNAL TABLE sls_csv (
    2. content STRING,
    3. client STRING,
    4. process_id STRING,
    5. start_time STRING,
    6. total_time STRING,
    7. status STRING,
    8. original_sql STRING,
    9. rewritten_sql STRING
    10. ) PARTITIONED BY (year STRING, month STRING, day STRING)
    11. ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    12. WITH SERDEPROPERTIES(
    13. 'separatorChar'=',',
    14. 'quoteChar'='"',
    15. 'escapeChar'='\\'
    16. )
    17. STORED AS TEXTFILE
    18. LOCATION 'oss://myappbucket/sls_csv/'
    19. TBLPROPERTIES(
    20. 'skip.header.line.count'='1'
    21. );
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
8月前
|
存储 弹性计算 监控
日志服务SLS实现云产品可观测实践
认证考试:日志服务SLS实现云产品可观测实践
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
11月前
|
消息中间件 弹性计算 数据可视化
SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践
SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践
|
1月前
|
存储 缓存 Java
浅析JAVA日志中的几则性能实践与原理解释
本篇文章通过几个技术点说明日志记录过程中的性能实践,计算机领域的性能往往都遵循着冰山法则,即你能看得见的、程序员能感知的只是其中的一小部分,还有大量的细节隐藏在冰山之下。
706 1
|
21天前
|
存储 运维 监控
Kubernetes 集群监控与日志管理实践
【5月更文挑战第28天】在微服务架构日益普及的当下,容器编排工具如 Kubernetes 已成为运维工作的核心。有效的集群监控和日志管理是确保系统稳定性和服务可靠性的关键。本文将深入探讨 Kubernetes 集群的监控策略,以及如何利用现有的工具进行日志收集、存储和分析,以实现对集群健康状况的实时掌握和问题快速定位。
|
22天前
|
存储 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【5月更文挑战第27天】 在微服务架构日益普及的当下,容器化技术与编排工具如Kubernetes已成为现代云原生应用的基石。然而,随着集群规模的不断扩大和复杂性的增加,如何有效监控和管理这些动态变化的服务成为了维护系统稳定性的关键。本文将深入探讨Kubernetes环境下的监控策略和日志管理的最佳实践,旨在为运维人员提供一套系统的解决思路,确保应用性能的最优化和问题的快速定位。
|
19天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践深入理解PHP的命名空间与自动加载机制
【5月更文挑战第30天】 在容器化和微服务架构日益普及的背景下,Kubernetes 已成为众多企业的首选容器编排工具。然而,随之而来的挑战是集群的监控与日志管理。本文将深入探讨 Kubernetes 集群监控的最佳实践,包括节点资源使用情况、Pods 健康状态以及网络流量分析等关键指标的监控方法。同时,我们也将讨论日志聚合、存储和查询策略,以确保快速定位问题并优化系统性能。文中将介绍常用的开源工具如 Prometheus 和 Fluentd,并分享如何结合这些工具构建高效、可靠的监控和日志管理系统。
|
20天前
|
运维 Prometheus 监控
Kubernetes 集群监控与日志管理实践
【5月更文挑战第29天】 在微服务架构日益盛行的今天,容器化技术已成为现代应用部署的标准。其中,Kubernetes 作为容器编排的事实标准,其集群的稳定性和性能监控变得至关重要。本文将深入探讨 Kubernetes 集群的监控策略和日志管理的最佳实践,旨在为运维工程师提供一套高效、可靠的集群监控解决方案。通过引入 Prometheus 和 Grafana 工具进行数据收集与可视化,以及 Fluentd 和 Elasticsearch 配合 Kibana 实现日志聚合与分析,本文将带领读者构建起一个全面的 Kubernetes 监控系统,确保系统的高可用性和故障快速响应。
|
24天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【5月更文挑战第25天】在现代微服务架构中,容器编排工具如Kubernetes已成为部署、管理和扩展应用程序的关键。随着其广泛应用,对集群的监控和日志管理的需求也日益增长。本文将探讨如何利用Prometheus和Fluentd等开源工具实现对Kubernetes集群的有效监控和日志收集,旨在为运维工程师提供一套可行的解决方案,以保障集群的稳定性和提高故障排查效率。
|
1月前
|
存储 运维 大数据
聊聊日志硬扫描,阿里 Log Scan 的设计与实践
泛日志(Log/Trace/Metric)是大数据的重要组成,伴随着每一年业务峰值的新脉冲,日志数据量在快速增长。同时,业务数字化运营、软件可观测性等浪潮又在对日志的存储、计算提出更高的要求。
289 6

热门文章

最新文章