小技术点:
(1)使用shell写了一个根据年份能生成此年份下归档文件目录,精确到年-月-日-小时
谈谈本意:
由于散仙最近是在搞我们平台的搜索日志分析的工作,日志记录的数据是存在我们的Hadoop集群的HDFS上,日志记录的形式,自然也是按照年月日小时这样一个目录存储的,至于为啥这么设计,通过时间维度来准确归档:
好处: 这样在分析数据时,便能任意指定时间范围来分析,最细精确到小时上,最大可按年统计,所以,例如最近1小时,3小时,最近7天,最近一个月,三个月,1年等等时间维度都可以统计,非常灵活。
坏处: 即使在使用了Snappy压缩后,存储使用Flume收集过来的小文件仍然比较多,每个小时下的数据有好多1M,3M,50M类似这样的snappy压缩包,在HDFS上存储过多的小文件会导致NameNode的元数据映射信息倍增,这会占掉更多的内存,所以这样存储,从长久来看,并不是一个好的规划。
是否可以解决?
以散仙来看,解决办法其实也不太难
(1)在Flume写入HDFS的过程中,可以把flume汇总收集的缓冲时间给延长一点,或者把写入大小的阈值给调大,理想情况下,一个小时的数据,最好只压缩成一个大的文件包。
(2)写一个定时合并小文件的程序来把每个小时下的数据合并成一个大的文件,当然这种做法,相当于补救措施了,尽量使用第一种方法,在写入时就解决this problem。
好了,扯的有点多了,下面说正经的,写这个shell的目的,是为了模拟线上的hadoop存储日志的目录结构,便于在测试的hadoop集群上进行各种仿真测试和折腾,因为直接从线上的hadoop导一份完整的数据比较费时,所以就在使用这个脚本在linux上,创建一份,写入一点测试数据,然后上传到HDFS上,就可以进行各种时间的维度的统计测试了。
最后还有一个不错的想法分享给眼前的各位帅哥,美女们,养成归档的好习惯,从现在做起,如果你还在为找以前的某个txt文件,某个excel文件,某个hadoop源码包,某个岛国的avi影片,或某个照片,某个简历等等等等找不到而发愁的时候,是否有种冲动的想法,
“老娘以后再也不乱放东西了,总是害得用的时候找不到了! ”。
那就来吧,这个脚本对你很适合,你只需要稍稍微创新一下,就能改造的非常个性化,比如你在年,月,日,小时目录下,新建了分类很细的目录,对各种常用的文件归档,根据文件后缀名,都建立一个文件夹,在各个文件夹下你还可以继续分类,总之,只有你想不到的,没有做不到的,再到用的时候,你只需要记得你要找的东西后缀名,然后根据大概时间,就能很快find it!
有了这个思路,你就可以自己使用自己擅长的语言的写一个类似这样的程序,技术上,没啥难度,注意下不同的年份中月的天数可能不一样的问题即可。
如果你不会写程序,没关系,自己手动创建目录,也没多困难嘛,以后就可以把排列满满的桌面的文件,定时归档起来了。
脚本源码如下:
- #获取当前的年份
- y=$1
- #year=`date +%Y`
- #获取当前的月份
- #month=`date +%m`
- for m in `seq -w 12`
- do
- #创建月的文件夹
- mkdir -p $y/$m
- #得到每月的最后一天
- lastday=`cal $m $y | egrep "28|29|30|31" | tail -1 | awk '{print $NF}'`
- for d in `seq -w 01 $lastday `
- do
- #创建日的文件夹
- mkdir -p $y/$m/$d/
- for h in `seq -w 00 23`
- do
- #创建小时的文件夹
- mkdir -p $y/$m/$d/$h
- echo "$y年$m月$d日$h小时里的造的数据" >> $y/$m/$d/$h/$y-$m-$d-$h.txt
- done
- done
- #echo $m
- done
- echo "创建完毕!"
#获取当前的年份 y=$1 #year=`date +%Y` #获取当前的月份 #month=`date +%m` for m in `seq -w 12` do #创建月的文件夹 mkdir -p $y/$m #得到每月的最后一天 lastday=`cal $m $y | egrep "28|29|30|31" | tail -1 | awk '{print $NF}'` for d in `seq -w 01 $lastday ` do #创建日的文件夹 mkdir -p $y/$m/$d/ for h in `seq -w 00 23` do #创建小时的文件夹 mkdir -p $y/$m/$d/$h echo "$y年$m月$d日$h小时里的造的数据" >> $y/$m/$d/$h/$y-$m-$d-$h.txt done done #echo $m done echo "创建完毕!"
最后,在备忘几个shell小知识
(2)将类似2015-01-02 12:33:33 这样的日期,转换成毫秒
- s2=`date -d "$end" '+%s'`
s2=`date -d "$end" '+%s'`
(3)将一个毫秒数转换成日期
- time=`date -d @$timestamp '+%Y-%m-%d %H:%M:%S'`
time=`date -d @$timestamp '+%Y-%m-%d %H:%M:%S'`
(4)C风格版的shell的for循环
- for (( i=0; i<=10; i++ ))
- do
- echo $i
- done
for (( i=0; i<=10; i++ ))
do
echo $i
done
(5)计算日期差,可以传入小时,天,月等
- before=`date '+%Y/%m/%d/%H' -d '-24 hour' `
before=`date '+%Y/%m/%d/%H' -d '-24 hour' `
(6)去掉01,02,类似数字的0,还原成可计算的数字
- brb=`echo $brb | sed 's/^0/''/' `
brb=`echo $brb | sed 's/^0/''/' `
(7)给单位数字补位,1,2,3,4,5,改成01,02,03,04,05类似
- ss=`echo $ss | sed 's/^[0-9]$/0&/'`
ss=`echo $ss | sed 's/^[0-9]$/0&/'`
(8)使用seq命令,生成带0序列数字:
- [search@dnode1 checklist]$ seq -w 12
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- [search@dnode1 checklist]$
[search@dnode1 checklist]$ seq -w 12
01
02
03
04
05
06
07
08
09
10
11
12
[search@dnode1 checklist]$
(9)使用seq命令,生成范围区间
- [search@dnode1 checklist]$ seq -w 12
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- [search@dnode1 checklist]$
[search@dnode1 checklist]$ seq -w 12
01
02
03
04
05
06
07
08
09
10
11
12
[search@dnode1 checklist]$
(10)linux下,查看日历
- [search@dnode1 checklist]$ cal 2015
- 2015
- January February March
- Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
- 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 6 7
- 4 5 6 7 8 9 10 8 9 10 11 12 13 14 8 9 10 11 12 13 14
- 11 12 13 14 15 16 17 15 16 17 18 19 20 21 15 16 17 18 19 20 21
- 18 19 20 21 22 23 24 22 23 24 25 26 27 28 22 23 24 25 26 27 28
- 25 26 27 28 29 30 31 29 30 31
- April May June
- Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
- 1 2 3 4 1 2 1 2 3 4 5 6
- 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
- 12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
- 19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
- 26 27 28 29 30 24 25 26 27 28 29 30 28 29 30
- 31
- July August September
- Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
- 1 2 3 4 1 1 2 3 4 5
- 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
- 12 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
- 19 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
- 26 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
- 30 31
- October November December
- Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
- 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
- 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
- 11 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
- 18 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
- 25 26 27 28 29 30 31 29 30 27 28 29 30 31
- [search@dnode1 checklist]$