数据划分Partition
OSS数据存储具有高可靠、低成本的特点,是海量数据存储的最佳选择之一,尤其适用于半结构化的日志存储,并可以结合E-MapReduce(使用Hive、Impala等计算引擎)通过schema-on-read方式加载数据做查询分析。
日志作为一种时间序列(time-series)数据,指定年、月、日进行分析是一种常见做法。例如使用Hive来分析OSS上的日志:
- 如果没有Partition,计算需要扫描整表(对应于OSS bucket前缀目录下的所有文件)
- 如果用时间设置了Partition,只需要加载指定OSS日期目录下的Object即可
对于大部分的日志分析而言,OSS上的日志通过Partition方式来存储,通过减少计算引擎需要扫描的数据规模可以得到三个好处:
- 缩短了数据分析的延时
- 免去计算引擎处理额外数据产生的开销
- 节约非必要OSS读请求产生的费用
LOG投递OSS设置Partition
阿里云LOG服务贯穿日志的整个生命周期,提供日志收集、存储、实时消费、查询、报警、投递(OSS/MaxCompute/TableStore)等功能。
想了解如何通过LOG采集日志并投递到OSS的整个流程,可以在本文后移步用户案例:梨视频 LOG + OSS + E-MapReduce 实践。接下来要为大家介绍如何使用自定义Partition功能:
1. LOG内为Logstore配置OSS投递规则
将投递任务创建时间使用%Y,%m,%d,%H,%M等格式化生成分区字符串(格式化参考strptime API),以此来定义写到OSS的Object文件所在的目录层次结构,其中斜线/表示一级OSS目录。
日志服务的每个投递任务会写入OSS一个文件,路径格式是oss://OSS-BUCKET/OSS-PREFIX/PARTITION-FROMAT_RANDOM-ID。以创建时间2017/01/20 19:50:43的投递任务为例,说明OSS Prefix和分区格式与OSS目标文件路径关系如下:
OSS Bucket | OSS Prefix | 分区格式 | OSS文件路径 |
---|---|---|---|
test-bucket | test-table | %Y/%m/%d/%H/%M | oss://test-bucket/test-table/2017/01/20/19/50/43_1484913043351525351_2850008 |
test-bucket | log_ship_oss_example | %Y/%m/%d/log_%H%M%s | oss://test-bucket/log_ship_oss_example/2017/01/20/log_195043_1484913043351525351_2850008 |
test-bucket | log_ship_oss_example | %Y%m%d/%H | oss://test-bucket/log_ship_oss_example/20170120/19_1484913043351525351_2850008 |
test-bucket | log_ship_oss_example | %Y%m%d/ | oss://test-bucket/log_ship_oss_example/20170120/_1484913043351525351_2850008 |
test-bucket | log_ship_oss_example | %Y%m%d%H | oss://test-bucket/log_ship_oss_example/2017012019_1484913043351525351_2850008 |
在这里设置分区格式为:%Y/%m/%d/log_%H%M%s:
参数细节请阅读LOG投递OSS用户指南“分区格式”部分。
2. OSS数据Partition的组织形式
$./osscmd listallobject oss://test-bucket/log_ship_oss_example/
2017-01-20 19:50:53 34.83MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195043_1484913043351525351_2850008
2017-01-20 19:51:12 34.89MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195105_1484913065536560919_2850011
2017-01-20 19:51:21 34.83MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195109_1484913069790140729_2850012
2017-01-20 19:51:31 34.88MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195123_1484913083833159138_2850013
2017-01-20 19:51:44 34.99MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195136_1484913096459291992_2850016
2017-01-20 19:52:06 34.83MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195159_1484913119479868401_2850018
2017-01-20 19:52:11 34.95MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195204_1484913124490493518_2850019
2017-01-20 19:52:29 34.98MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195219_1484913139902136845_2850022
2017-01-20 19:52:42 34.90MB oss://test-bucket/log_ship_oss_example/2017/01/20/log_195235_1484913155018441825_2850025
2017-01-21 19:53:02 34.99MB oss://test-bucket/log_ship_oss_example/2017/01/21/log_195255_1484999575415811298_2850027
2017-01-21 19:53:12 34.94MB oss://test-bucket/log_ship_oss_example/2017/01/21/log_195303_1485003383961701486_2850028
2017-01-21 19:53:25 34.80MB oss://test-bucket/log_ship_oss_example/2017/01/21/log_195317_1485085997822904318_2850029
2017-01-21 19:53:48 34.97MB oss://test-bucket/log_ship_oss_example/2017/01/21/log_195340_1485077380309025973_2850032
2017-01-21 19:53:54 34.82MB oss://test-bucket/log_ship_oss_example/2017/01/21/log_195348_1485077388819212161_2850036
2017-01-21 19:54:08 34.96MB oss://test-bucket/log_ship_oss_example/2017/01/21/log_195359_1485077399681928884_2850038
2017-01-21 19:54:24 34.98MB oss://test-bucket/log_ship_oss_example/2017/01/21/log_195415_1485077415925150389_2850040
2017-01-22 19:54:53 34.82MB oss://test-bucket/log_ship_oss_example/2017/01/22/log_195441_1485086081854680230_2850044
2017-01-22 19:54:55 34.89MB oss://test-bucket/log_ship_oss_example/2017/01/22/log_195443_1485086083617274509_2850045
2017-01-22 19:55:06 34.91MB oss://test-bucket/log_ship_oss_example/2017/01/22/log_195459_1485086099107535552_2850046
2017-01-22 19:55:24 34.97MB oss://test-bucket/log_ship_oss_example/2017/01/22/log_195514_1485086114057357853_2850047
2017-01-22 19:55:44 34.97MB oss://test-bucket/log_ship_oss_example/2017/01/22/log_195537_1485086137670335428_2850051
2017-01-22 19:55:54 34.80MB oss://test-bucket/log_ship_oss_example/2017/01/22/log_195543_1485086143710253025_2850052
3. Hive使用OSS Partition
CREATE EXTERNAL TABLE log_ship_oss_example (
time STRING,
ip STRING,
url STRING,
method STRING,
status STRING,
user-agent STRING,
api-version STRING
)
PARTITIONED BY (
year STRING,
mon STRING,
day STRING
)
ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
LOCATION 'oss://${AccessKeyId}:${AccessKeySecret}@test-bucket.oss-cn-hangzhou.aliyuncs.com/log_ship_oss_example';
创建外部表并加载OSS上的Partition之后,就能开始数据分析工作了。相关细节您可以参考:E-MapReduce Hive使用手册。