前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于清单分析对象存储容量使用

基于清单分析对象存储容量使用

原创
作者头像
HuiG
发布2022-05-18 10:45:16
9500
发布2022-05-18 10:45:16
举报

不同于文件系统,对象存储是一个扁平的架构,在海量数据的场景下统计某个目录(对象前缀)下所有文件的大小是一个非常难的操作,只能列出该目录下所有文件,然后将所有文件大小相加的方式获取总大小。根据客户的实际反馈,在文件数目非常大的情况下,这种方式不是特别友好,耗时非常久,还需要长期占有主机端资源做list object以及统计容量操作。

如果对于容量统计的时效性要求不高,可以采用清单的方式。COS支持每天生成一次清单,清单中包含了存储桶中所有对象的列表以及每个对象对应的一些信息,包括每个对象的大小。清单生成之后,可以将清单导入到数据库,利用数据库的查询获取想要的统计信息。这里推荐使用ClickHouse数据库,使用列式存储的方式,提供卓越的查询性能。

一、生成清单

参考如下文档查看清单的描述以及如何配置清单:

对象存储 清单功能概述 - 开发者指南 - 文档中心 - 腾讯云 (tencent.com)

对象存储 开通清单功能 - 控制台指南 - 文档中心 - 腾讯云 (tencent.com)

用户配置一项清单任务后,COS 将根据配置定时扫描用户存储桶内指定的对象,并输出一份清单报告,清单报告支持 CSV 格式文件。目前 COS 清单报告中支持记录以下信息:

清单信息

描述

AppID

账号的 ID

Bucket

执行清单任务的存储桶的名称

fileFormat

文件格式

listObjectCount

列出的对象数量

listStorageSize

列出的对象大小

filterObjectCount

筛选的对象数量

filterStorageSize

筛选的对象大小

Key

存储桶中的对象文件名称。使用 CSV 文件格式时,对象文件名称采用 URL 编码形式,必须解码然后才能使用

VersionId

对象版本 ID。在存储桶上启用版本控制后,COS 会为添加到存储桶的对象指定版本号。如果列表仅针对对象的当前版本,则不包含此字段

IsLatest

如果对象的版本为最新,则设置为 True。如果列表仅针对对象的当前版本,则不包含此字段

IsDeleteMarker

如果对象是删除标记,则设置为 True。如果列表仅针对对象的当前版本,则不包含此字段

Size

对象大小(以字节为单位)

LastModifiedDate

对象的最近修改日期(以日期较晚者为准)

ETag

实体标签是对象的哈希。ETag 仅反映对对象的内容的更改,而不反映对对象的元数据的更改。ETag 可能是也可能不是对象数据的 MD5 摘要。是与不是取决于对象的创建方式和加密方式

StorageClass

用于存储对象的存储类,有关更多信息,请参见 存储类型

IsMultipartUploaded

如果对象以分块上传形式上传,则设置为 True,有关更多信息,请参见 分块上传

Replicationstatus

设置为 PENDING、COMPLETED、FAILED 或 REPLICA。有关更多信息,请参见 跨地域复制行为说明

清单报告及相关的 Manifest 相关文件会发布在目标存储桶中,其中清单报告会发布在以下路径:

代码语言:javascript
复制
destination-prefix/appid/source-bucket/config-ID/YYYYMMDD/manifest.json
destination-prefix/appid/source-bucket/config-ID/YYYYMMDD/manifest.checksum

有关 Mainfest 文件的介绍如下:

  • manifest.json 和 manifest.chenksum 都属于 Manifest 文件,manifest.json 描述清单报告的位置,manifest.checksum 是作为 manifest.json 文件内容的 MD5。每次交付新的清单报告时,均会带有一组新的 Manifest 文件。
  • manifest.json 包含的每个 Manifest 均提供了有关清单的元数据和其他基本信息,这些信息包括:源存储桶名称。
    • 目标存储桶名称。
    • 清单版本。
    • 时间戳,包含生成清单报告时开始扫描存储桶的日期与时间。
    • 清单文件的格式与架构。
    • 目标存储桶中清单报告的对象键,大小及 md5Checksum。

二、数据导入

根据清单生成的manifest.json文件,可以获取当次清单涉及到的所有文件的列表。清单文件是压缩之后的CSV。

在数据导入之前,先安装ClickHouse,可以参照如下文档安装ClickHouse:

安装部署 | ClickHouse文档

数据库安装完成之后,先在ClickHouse中创建表:

代码语言:sql
复制
CREATE TABLE default.cos_inventory
(
    `appid` UInt64,
    `bucket` String,
    `key` String,
    `versionid` String,
    `islatest` String,
    `isdeletemarker` String,
    `size` UInt64,
    `LastModifiedDate` DateTime,
    `etag` String,
    `storage_class` String,
    `IsMultipartUploaded` String,
    `Replicationstatus` String
)
ENGINE = MergeTree
ORDER BY LastModifiedDate;

由于发起清单时选择的清单信息可能不太相同,上述建表语句中表中各列仅供参考,实际建表分析的时候,可参考manifest.json文件中的fileSchema确定建表需要的列。

建表完成后,将对应的清单文件下载到本地一个目录,并解压。使用如下命令将所有CSV文件中的数据导入到cos_inventory表中:

代码语言:shell
复制
for i in *csv; do echo $i; cat $i |sed 's/\+08:00//g' |clickhouse-client --query="INSERT INTO cos_inventory FORMAT CSV"; done

三、数据查询

数据导入之后就可以进入到ClickHouse-Client进行先关的查询:

代码语言:shell
复制
root@VM-16-2-ubuntu:~# clickhouse-client 
ClickHouse client version 21.3.8.76 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.3.8 revision 54447.

localhost.localdomain :) select count() from cos_inventory;

SELECT count()
FROM cos_inventory

Query id: 6dc11b6a-4f5d-497a-8193-2b120bc8e3a5

┌───count()─┐
│ 187953674 │
└───────────┘

1 rows in set. Elapsed: 0.002 sec. 

统计cos_user目录下(以cos_user/为前缀)的所有文件的容量综合:

代码语言:javascript
复制
localhost.localdomain :) select formatReadableSize(sum(size)) from cos_inventory where (key like 'cos_user/%');

SELECT formatReadableSize(sum(size))
FROM cos_inventory
WHERE key LIKE 'cos_user/%'

Query id: 0e24f1cd-0bee-4ccf-83d7-6fe661b1dc4b

┌─formatReadableSize(sum(size))─┐
│ 34.56 PiB                     │
└───────────────────────────────┘

1 rows in set. Elapsed: 18.776 sec. Processed 187.95 million rows, 22.18 GB (10.01 million rows/s., 1.18 GB/s.)

localhost.localdomain :) select count() from cos_inventory where (key like 'cos_user/%');

SELECT count()
FROM cos_inventory
WHERE key LIKE 'cos_user/%'

Query id: 442eba9a-a3cc-4bd2-8857-911e1c97cb28

┌───count()─┐
│ 187792634 │
└───────────┘

1 rows in set. Elapsed: 20.190 sec. Processed 187.95 million rows, 20.67 GB (9.31 million rows/s., 1.02 GB/s.)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、生成清单
  • 二、数据导入
  • 三、数据查询
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档