发布于: Nov 30, 2022

【概要】在开启 s3 清单功能后,可能需要多达 48 小时才能收到第一份 S3 清单文件,一般情况下生成清单时间少于 24 小时。清单文件 csv 生成之后,请按照下列方式在 Athena 服务中建立一个清单表,以供查询使用。

在开启 s3 清单功能后,可能需要多达 48 小时才能收到第一份 S3 清单文件,一般情况下生成清单时间少于 24 小时。清单文件 csv 生成之后,请按照下列方式在 Athena 服务中建立一个清单表,以供查询使用。第一次使用 Athena 点击“入门”之后可能会需要您设置在 S3 中的查询结果位置。

如何使用语句建立 S3 清单的 Athena table:(请修改 inventory_list 为新表名,并修改 s3://inventory/testinventory/data/hive 为新生成的 S3 清单地址下的 hive 前缀)

CREATE EXTERNAL TABLE `inventory_list`(
    `bucket` string, 
    `key` string, 
    `size` bigint, 
    `last_modified_date` string, 
`storage_class` string)
  PARTITIONED BY (dt string)
  ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
  STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
  OUTPUTFORMAT  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
  LOCATION
's3://inventory/testinventory/data/hive'

详细如何查询 Athena 清单表的语句:

-- 按照某天生成的清单,查询桶内有多少存储类型:
Select distinct storage_class from inventory_list where dt='YYYY-MM-DD-00-00'
-- 比如按照2020-05-20生成的清单查询:
Select distinct storage_class from inventory_list where dt='2020-05-20-00-00'


-- 查询每个存储类型有多少个文件,文件量多大:(根据上个语句查询出来总共有多少存储类型,按照每个存储类型进行单独查询)
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'STANDARD' and dt='YYYY-MM-DD-00-00'
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'GLACIER' and dt='YYYY-MM-DD-00-00'
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'XXXXX' and dt='YYYY-MM-DD-00-00'
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'XXXXX' and dt='YYYY-MM-DD-00-00'
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'XXXXX' and dt='YYYY-MM-DD-00-00'
-- 查询每个storage class,0KB的文件有多少
select count(*) as count  from inventory_list where storage_class = 'STANDARD'  and size=0 and dt='YYYY-MM-DD-00-00'
select count(*) as count  from inventory_list where storage_class = 'XXXXXX'  and size=0 and dt='YYYY-MM-DD-00-00'
-- 查询标准的storage class,  大于0KB小于128KB的文件有多少。
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'STANDARD'  and size > 0 and size < 128*1024 and dt='YYYY-MM-DD-00-00'
-- 查询标准的storage class,  小于8KB的文件有多少。
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'STANDARD'  and size <= 8*1024 and dt='YYYY-MM-DD-00-00'
-- 查询某一些文件夹下的文件大小和文件数量有多大,之后可能会排除某些文件夹不做转换。
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where key like  'logs%' and dt='YYYY-MM-DD-00-00'
-- 查询30天以内创建的standard存储类型文件具体数量和大小:
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'STANDARD' and from_iso8601_timestamp(last_modified_date) > CAST((current_timestamp - interval '30' day) AS DATE) and dt='YYYY-MM-DD-00-00'
-- 如果需要使用S3批处理进行存储类型转换,那么按照特定要求生成我们需要的S3 批处理使用的csv文件,之后使用Athena“save as”功能下载之后,上传到某个存储桶作为 S3批处理的输入文件
Select bucket,key from inventory_list where key not like 'logs%' and size >  128*1024 and storage_class = 'STANDARD' and dt='YYYY-MM-DD-00-00'

如何设置 CUR(Cost Usage Report)在本文中就不再复述,请参考文档开启 CUR 并且建立好 Athena 表。

常用 CUR select 语句如下,请替换 default.cur_table 和 bucket_name 为您自己环境中的资源名。

-- 查询某个桶的上个月整月详细用量
SELECT
bill_billing_period_start_date,
bill_billing_period_end_date,
line_item_resource_id,
product_product_name,
line_item_operation,
sum(CAST(line_item_unblended_cost AS DOUBLE)) cost,
sum(CAST(line_item_usage_amount AS DOUBLE)) "usageamount(GB/count)"
FROM
default.cur_table
WHERE
 product_product_name = 'Amazon Simple Storage Service'
 and line_item_resource_id='bucket_name'
 and bill_billing_period_start_date >= date_trunc('month',DATE_ADD('day', -1, date_trunc('month', now())))
 and bill_billing_period_end_date <= date_trunc('month', now())
GROUP BY
 1,2,3,4,5
ORDER BY
sum(CAST(line_item_unblended_cost AS DOUBLE))  desc;

查询结果中显示的具体的收费项目 line_item_operation 在以下链接中可以找到 https://docs.amazonaws.cn/zh_cn/AmazonS3/latest/userguide/aws-usage-report-understand.html

 

关于常见的数据转换方案和优劣对比,可以参考如下表格。

 

 

S3 删除数据无额外费用,所以如果经过清单分析,发现有一些数据可以删除,建议使用生命周期先对这些数据进行删除。生命周期是通过对特定标签(tag)或者前缀(prefix)进行操作,具体分为两种情况:

(1)如果可以确认某些前缀的文件可以完全删除,那么可以直接用生命周期直接对这个前缀下的文件直接删除处理(设置过期时间为 1 天)

(2)如果不是某个前缀下所有的文件都可以删除,那么可以选择对特定的标签(tag)操作,不过需要先使用 S3 批处理功能对需要的文件打标签。(注意,批处理可以替换所有对象标签,如果已有标签也会被替换掉)

-- 比如查找所有1年前生成的日志文件列表:
Select bucket,key from inventory_list where key like 'logs%' and storage_class = 'STANDARD' and from_iso8601_timestamp(last_modified_date) < CAST((current_timestamp - interval '365' day) AS DATE) and dt='YYYY-MM-DD-00-00'

然后对生成的 CSV 清单进行处理,S3 批处理使用方式通过:  s3 控制台界面–批处理操作–创建作业–清单格式 csv–替换所有对象标签

当批处理作业完成之后再对整桶的某个标签(tag)做生命周期删除(设置过期时间为 1 天)

 

对于生命周期的使用就不再赘述(参见步骤 5 中的方案比较)。使用 S3 批处理转换存储类型通过:s3 控制台界面 à 批处理操作–创建作业–清单格式 csv–复制–选择存储类,选择以下选项,其他设置请保持默认。

 

 

相关文章