你有一个好的归档习惯吗?

备忘和扯一扯最近散仙在工作用到的几个不错的小技术点: (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! 有了这个思路,你就可以自己使用自己擅长的语言的写一个类似这样的程序,技术上,没啥难度,注意下不同的年份中月的天数可能不一样的问题即可。 如果你不会写程序,没关系,自己手动创建目录,也没多困难嘛,以后就可以把排列满满的桌面的文件,定时归档起来了。 脚本源码如下:

Shell代码

#获取当前的年份   
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 这样的日期,转换成毫秒

Java代码

  1. s2=`date -d "$end" '+%s'`

(3)将一个毫秒数转换成日期

Java代码

  1. time=`date -d @$timestamp '+%Y-%m-%d %H:%M:%S'`

(4)C风格版的shell的for循环

Java代码

for (( i=0; i<=10; i++ ))  
do 
 
echo $i  
 
done  

(5)计算日期差,可以传入小时,天,月等

Java代码

  1. before=`date '+%Y/%m/%d/%H' -d '-24 hour' `

(6)去掉01,02,类似数字的0,还原成可计算的数字

Java代码

  1. brb=`echo $brb | sed 's/^0/''/' `

(7)给单位数字补位,1,2,3,4,5,改成01,02,03,04,05类似

Java代码

  1. ss=`echo $ss | sed 's/^[0-9]$/0&/'`

(8)使用seq命令,生成带0序列数字:

Java代码

  1. [search@dnode1 checklist]$ seq -w 12
  2. 01
  3. 02
  4. 03
  5. 04
  6. 05
  7. 06
  8. 07
  9. 08
  10. 09
  11. 10
  12. 11
  13. 12
  14. [search@dnode1 checklist]$

(9)使用seq命令,生成范围区间

Java代码

  1. [search@dnode1 checklist]$ seq -w 12
  2. 01
  3. 02
  4. 03
  5. 04
  6. 05
  7. 06
  8. 07
  9. 08
  10. 09
  11. 10
  12. 11
  13. 12
  14. [search@dnode1 checklist]$

(10)linux下,查看日历

Java代码

[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]$   

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2015-02-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark学习技巧

从零开始 Spark 性能调优

1833
来自专栏高性能服务器开发

9 百万用户级游戏服务器架构设计

所谓服务器结构,也就是如何将服务器各部分合理地安排,以实现最初的功能需求。所以,结构本无所谓正确与错误;当然,优秀的结构更有助于系统的搭建,对系统的可扩展性及可...

6615
来自专栏嵌入式程序猿

恩智浦对KSDK2.0动大手术换血了

恩智浦针对kinetis系列MCU推出的KSDK2.0比以前的1.x版本有了很大变化,目录结构有很大不同,且不在支持MQX操作系统,所以在应用中要注意区别对待,...

35910
来自专栏数据之美

手把手教你 Spark 性能调优

0、背景 上周四接到反馈,集群部分 spark 任务执行很慢,且经常出错,参数改来改去怎么都无法优化其性能和解决频繁随机报错的问题。 看了下任务的历史运行情况,...

1.4K10
来自专栏IT笔记

分布式与集群有什么区别

一个是3个字,另一个2个字 集群一般被分为三种类型,高可用集群(High-availability (HA) clusters )如RHCS、LifeKeepe...

3724
来自专栏蘑菇先生的技术笔记

给公司部门设计的SOA架构

2146
来自专栏北京马哥教育

从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点。 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在...

6155
来自专栏ImportSource

NoSQL Sharding 分片

翻译内容: NoSQL Distilled 第四章 Distribution Models 作者简介: ? 本节摘要: 各位周末好,今天我们主...

41312
来自专栏网络

Uber开山基石:如何从无到有设计系统架构?

欢迎回看本文原始视频 http://t.cn/RjSC0KQ 本篇为Uber系列技术文章第一篇 今天我们解读的是Uber公司的Curis所分享的Uber架构从0...

30610
来自专栏lulianqi

网络并发 测试准备_1

谈到服务器的并行处理能力,人们总是会很容易想到TPS等数据指标,当然得利于前人的许多工具我们可以通过十分简单的步骤得出这些数据,然后输出一份十分养眼的报告。不得...

1871

扫码关注云+社区

领取腾讯云代金券