• 使用ClickHouse分析COS的清单和访问日志


    需求描述

    在对接COS客户中,经常会遇到客户的一些COS分析需求,主要集中在两个方面:

    1、COS Bucket的对象分析,比如:

    • 前缀为xxx的对象的总大小

    • 后缀为xxx的对象的总大小

    • xxx日期前的对象总大小

    • 对象size在某个范围内的个数

    2、COS Bucket的访问分析,比如:

    • xxx时间段内请求Topx的文件

    • xxx时间段内请求Topx的客户端IPs/Agents

    • xxx时间段内所有的GET/PUT请求,或指定request PATH

    针对上述的客户需求,我们通常可以通过COS清单和COS的访问日志来分析,但COS清单或者日志的量通常都是比较大的,需要通过一个比较好的工具来完成分析任务,这里介绍下如何通过ClickHouse,来原生的分析存储在COS上的清单和日志文件。

    ClickHouse是适用于OLAP场景的列式数据库系统,但使用原生接口分析存储在COS上的清单或日志文件时,并不能发挥出其列式存储的性能。若需要较高性能的复杂分析时,请使用数据导入的方式把COS上的清单或日志文件记录,导入到ClickHouse集群中分析。

    COS数据导入请参考:云数据仓库 ClickHouse COS 数据导入-操作指南-文档中心-腾讯云

    部署ClickHouse

    ClickHouse的部署比较简单,参考官网:Fast Open-Source OLAP DBMS - ClickHouse 即可。

    这里以CentOS为例:

    1. sudo yum install -y yum-utils
    2. sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
    3. sudo yum install -y clickhouse-server clickhouse-client
    4. sudo /etc/init.d/clickhouse-server start
    5. clickhouse-client # or "clickhouse-client --password" if you set up a password.

    场景1:分析COS清单

    在需要分析COS Bucket的对象时,我们通常通过拉取Bucket的清单来分析的方式,COS已经支持即时清单功能,在Bucket对象数较少的情况下,可以满足小时级生成COS Bucket的清单文件。

    Bucket清单请参考:对象存储 设置清单-控制台指南-文档中心-腾讯云

    1. 创建ClickHouse表

    ClickHouse原生支持创建S3的外表,下面是基于COS清单文件,创建ClickHouse Table的示例:

    1. [root@VM-16-3-centos ~]# clickhouse-client
    2. ...
    3. VM-16-3-centos :) CREATE TABLE default.bruins_inventory
    4. (
    5. `appid` UInt64,
    6. `bucket` String,
    7. `key` String,
    8. `size` UInt64,
    9. `LastModifiedDate` String,
    10. `etag` String,
    11. `storage_class` String,
    12. `IsMultipartUploaded` String,
    13. `Replicationstatus` String,
    14. `Tag` String
    15. )
    16. ENGINE = S3('http://bruins-1253766168.cos.ap-shanghai.myqcloud.com/cos_bucket_inventory/1253766168/bruins/test-inventory_instant_20211230095714/data/*.csv.gz', 'xxxxxxxx', 'xxxxxxxxxxx', 'CSV', 'gzip')
    17. VM-16-3-centos :) desc table bruins_inventory
    18. DESCRIBE TABLE bruins_inventory
    19. Query id: 55e88a06-63aa-4310-be02-eb1cdaee7e5f
    20. ┌─name────────────────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
    21. │ appid │ UInt64 │ │ │ │ │ │
    22. │ bucket │ String │ │ │ │ │ │
    23. │ key │ String │ │ │ │ │ │
    24. │ size │ UInt64 │ │ │ │ │ │
    25. │ LastModifiedDate │ String │ │ │ │ │ │
    26. │ etag │ String │ │ │ │ │ │
    27. │ storage_class │ String │ │ │ │ │ │
    28. │ IsMultipartUploaded │ String │ │ │ │ │ │
    29. │ Replicationstatus │ String │ │ │ │ │ │
    30. │ Tag │ String │ │ │ │ │ │
    31. └─────────────────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
    创建表时确保各个字段和COS清单里能对应上

    创建表时指定目录下的所有csv.gz文件(多次清单文件都会放在data/目录下,可能会导致非预期的结果!)

    2. 分析数据

    创建ClickHouse的S3外表后,可以直接使用SQL语句来分析数据了,如下示例:后缀为'json'的对象的个数和总大小。

    1. VM-16-3-centos :) select count(),formatReadableSize(sum(size)) from bruins_inventory where key like '%json';
    2. SELECT
    3. count(),
    4. formatReadableSize(sum(size))
    5. FROM bruins_inventory
    6. WHERE key LIKE '%json'
    7. Query id: 7bd74827-c9ff-4a90-a931-5703c4c3ae41
    8. ┌─count()─┬─formatReadableSize(sum(size))─┐
    9. 45.59 KiB │
    10. └─────────┴───────────────────────────────┘
    11. 1 row in set. Elapsed: 0.989 sec.
    12. VM-16-3-centos :) select key,size from bruins_inventory where key like 'pdd%' limit 2;
    13. SELECT
    14. key,
    15. size
    16. FROM bruins_inventory
    17. WHERE key LIKE 'pdd%'
    18. LIMIT 2
    19. Query id: 17d1fea8-8153-461a-9b4f-9cb886241d56
    20. ┌─key───────────────────────┬─size─┐
    21. │ pdd/subdir2/manifest.json │ 1698
    22. │ pdd/zshrc │ 4948
    23. └───────────────────────────┴──────┘
    24. 2 rows in set. Elapsed: 0.629 sec.

    场景2:分析COS访问日志

    COS的访问日志的默认分隔符是空格,这个我还没找到直接导入ClickHouse的方法。另外COS日志的字段较多,并不是每个都是客户期望的,如果都导入ClickHouse的话,会有更大的负载。

    基于这个考虑,可以先使用COS的日志清洗功能,来选择出自己关注的字段,再导入ClickHouse分析。

    COS各字段含义参考: 对象存储 日志管理概述-开发者指南-文档中心-腾讯云

    1. 日志清洗

    针对存储在COS上的日志,日志清洗服务可通过指定的检索条件,自动对上传至存储桶的日志文件进行内容过滤。

    COS日志清洗文档:对象存储 日志清洗-控制台指南-文档中心-腾讯云

    比如结合COS日志的内容,我们选择自己感兴趣的字段,做一轮清洗。其中第2步的日志清洗配置如下:

     

    自定义的SQL表达式如下:

    # select s._4, s._5, s._6, s._7, s._8, s._12, s._13, s._14, s._15, s._19 from cosobjects

    第3步的投递配置,推荐配置清洗后的文件存储在其他Bucket下,或者当前Bucket的其他前缀下,和COS的原生日志区分开。

    2. 创建ClickHouse表

    基于COS清洗后的日志目录,就可以创建原生的ClickHouse表了,如下所示:

    1. VM-16-3-centos :) CREATE TABLE default.logqxanalyse
    2. (
    3. `eventTime` String,
    4. `eventSource` String,
    5. `eventName` String,
    6. `remoteIp` String,
    7. `userSecretKeyId` String,
    8. `reqPath` String,
    9. `reqMethod` String,
    10. `userAgent` String,
    11. `rresHttpCode` UInt32,
    12. `resTotalTime` UInt32
    13. )
    14. ENGINE = S3('http://bruins-1253766168.cos.ap-shanghai.myqcloud.com/cos_log_qingxi/cos-access-log/2022/06/22/*.csv', 'xxxxxx', 'xxxxxxx', 'CSV')
    15. VM-16-3-centos :) desc table logqxanalyse
    16. DESCRIBE TABLE logqxanalyse
    17. Query id: 8b9c0f3c-da50-4282-83ca-9db2c03c2b64
    18. ┌─name────────────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
    19. │ eventTime │ String │ │ │ │ │ │
    20. │ eventSource │ String │ │ │ │ │ │
    21. │ eventName │ String │ │ │ │ │ │
    22. │ remoteIp │ String │ │ │ │ │ │
    23. │ userSecretKeyId │ String │ │ │ │ │ │
    24. │ reqPath │ String │ │ │ │ │ │
    25. │ reqMethod │ String │ │ │ │ │ │
    26. │ userAgent │ String │ │ │ │ │ │
    27. │ rresHttpCode │ UInt32 │ │ │ │ │ │
    28. │ resTotalTime │ UInt32 │ │ │ │ │ │
    29. └─────────────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
    30. 10 rows in set. Elapsed: 0.002 sec.
    创建表格的字段与第1步中日志清洗选择的字段要一一对应!

    3. 分析数据

    现在就可以基于需求执行SQL语句分析了,比如:

    • 查找请求为PUT的请求

    1. VM-16-3-centos :) select remoteIp,reqMethod,userAgent from logqxanalyse where eventName like 'PUT%' limit 5
    2. SELECT
    3. remoteIp,
    4. reqMethod,
    5. userAgent
    6. FROM logqxanalyse
    7. WHERE eventName LIKE 'PUT%'
    8. LIMIT 5
    9. Query id: cf8d1bdb-755e-4058-94af-47c9652d6b16
    10. ┌─remoteIp──────┬─reqMethod─┬─userAgent───────────┐
    11. 11.185.33.189 │ PUT │ cos-go-sdk-v5/0.7.3
    12. └───────────────┴───────────┴─────────────────────┘
    13. ┌─remoteIp──────┬─reqMethod─┬─userAgent────────────────┐
    14. 9.3.76.197 │ PUT │ cos-nodejs-sdk-v5-2.9.12
    15. 11.160.40.246 │ PUT │ -
    16. └───────────────┴───────────┴──────────────────────────┘
    17. ┌─remoteIp──────┬─reqMethod─┬─userAgent────────────────┐
    18. 9.3.76.197 │ PUT │ cos-nodejs-sdk-v5-2.9.12
    19. 9.142.175.253 │ PUT │ -
    20. └───────────────┴───────────┴──────────────────────────┘
    21. 5 rows in set. Elapsed: 1.500 sec.
    • 查询请求次数Top 5的请求IPs

    1. VM-16-3-centos :) select top 5 count() as count,remoteIp from logqxanalyse group by remoteIp order by count desc
    2. SELECT
    3. count() AS count,
    4. remoteIp
    5. FROM logqxanalyse
    6. GROUP BY remoteIp
    7. ORDER BY count DESC
    8. LIMIT 5
    9. Query id: c21c676a-221b-4150-ab85-723fc8a7ef71
    10. ┌─count─┬─remoteIp───────┐
    11. 520180.153.219.32
    12. 214180.153.219.16
    13. 1529.3.88.110
    14. 110172.17.16.3
    15. 29100.67.79.78
    16. └───────┴────────────────┘
    17. 5 rows in set. Elapsed: 4.020 sec. Processed 1.47 thousand rows, 465.24 KB (364.96 rows/s., 115.74 KB/s.)

  • 相关阅读:
    Java项目:ssm大学生兼职论坛
    如今市面上有什么冷门生意可做
    P6775 [NOI2020] 制作菜品
    Ubuntu:解决github出现 Permission denied (publickey)的问题
    基于阿里云GPU云服务器的AIACC助力UC搜索业务性能提效380%,每年节省数千万成本
    ES6之Symbol和Symbol属性
    Java-GUI-AWT-组件-TextComponent类
    1.什么是jwt?jwt的作用是什么?2.jwt的三个部分是什么?三者之间的关系如何?3.JWT运行的流程是什么
    生命不息,运动不止,乐歌智能健身椅为健康加油助威
    Linux环境基础开发工具使用(下)
  • 原文地址:https://blog.csdn.net/Tencent_COS/article/details/126144048