1.场景分析
生产环境均为腾讯云服务器,日志数据计划存储于HDFS中,由于日志数据较大(压缩后1T/天),不断扩充云盘成本消耗大。鉴于对象存储的存储成本较为低廉,但是日常频繁使用会产生流量费用。
鉴于此,规划将日常常用热数据采用HDFS存储(存储时间2~3个月),超过该时间段数据采用对象存储。改方案均采用同一套Hadoop架构,使用hive均可以读取到,在降低成本的同时提高数据的利用率。
2.准备条件
cos与hadoop集成特征
3.详细脚本
建表语句
CREATE EXTERNAL TABLE ods.test_dh (
`timestamp` bigint COMMENT '时间',
`offset` bigint COMMENT '偏移量',
`request_uri` string COMMENT '请求uri'
)
COMMENT '日志表'
PARTITIONED BY (
`part_day` string,
`part_hour` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://hadoopcluster/hadoop/dm_dw/on/ods/test_dh';
CREATE EXTERNAL TABLE ods.test_bu (
`timestamp` bigint COMMENT '时间',
`offset` bigint COMMENT '偏移量',
`request_uri` string COMMENT '请求uri'
)
COMMENT '日志备份表'
PARTITIONED BY (
`part_day` string,
`part_hour` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'cosn://xxxx/hadoop/dm_dw/on/ods/test_bu';
每个月1号12点数据冷备份
#!/bin/bash
# 定义变量方便修改
APP=ods
#HDFS表
HDFS_TABLE=test_dh
#对象存储表
COS_TABLE=test_bu
HDFS_PATH1=hdfs://hadoopcluster/hadoop/dm_dw/on/$APP/$HDFS_TABLE
HDFS_PATH2=/hadoop/dm_dw/on/$APP/$HDFS_TABLE
COS_PATH=cosn://xxxx/hadoop/dm_dw/on/$APP/$COS_TABLE
# HDFS数据冷备份,将HDFS3个月前的数据按照月份移动至cos中,移动完成后删除HDFS中的数据,数据保留时间最大不超过3个月
# 执行时间为每个月1号12点
do_date=$1
hr=${do_date: 8: 2}
date1=${do_date: 0: 8}
#date1=`date -d "$date1 +1 day" +%Y%m%d`
date1_month=`date -d "$date1" +%Y%m`
date3=`date -d "$[ $date1_month + 0 ]01" +%Y%m%d`
if [ "$date1" -eq "$date3" ] && [ "$hr" -eq 11 ] ; then
start_date=`date -d "$date3 -3 month" +%Y%m%d`
end_date=`date -d "$date3 -2 month" +%Y%m%d` # 日期自增
echo ================== $COS_TABLE 导入月份为 $start_date ==================
while [[ $start_date != $end_date ]]
do
hadoop fs -test -e $HDFS_PATH2/part_day=$start_date
if [[ $? -eq 0 ]]; then
#数据备份开始
echo "$start_date 数据开始移动..."
hadoop distcp -Dmapreduce.job.queuename=dw $HDFS_PATH1/part_day=$start_date $COS_PATH
hadoop fs -test -e $COS_PATH/part_day=$start_date/part_hour=23
if [[ $? -eq 0 ]]; then
#数据备份完成,删除hdfs中的数据
echo "路径 $COS_PATH/part_day=$start_date 数据已移动至cos,HDFS数据删除......"
hadoop fs -rm -rf $HDFS_PATH2/part_day=$start_date
else
echo " $COS_PATH/part_day=$start_date HDFS数据没有移动至cos"
fi
else
echo " $HDFS_PATH2/part_day=$start_date 文件夹中没有数据"
fi
start_date=$(date -d "$start_date +1 day" +%Y%m%d)
done
echo ================== $COS_TABLE 导入月份为 $do_date ==================
sql="MSCK REPAIR TABLE ${APP}.${COS_TABLE};"
hive -e "$sql"
else
echo "$do_date 不是月初第一天的12点"
fi