专栏首页我是攻城师你有一个好的归档习惯吗?

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

备忘和扯一扯最近散仙在工作用到的几个不错的小技术点: (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),作者:散仙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 男子接陌生短信回“你是谁” 银行卡遭盗刷12次

    我是攻城师
  • Java与Node.js的较量--一场史诗之战

    我是攻城师
  • 正确的使用python调用shell的姿势

    python是一门简洁灵活的语言,也是一门胶水语言,能与很多其他的编程语言进行交互,虽然性能差一点,但易用,入门和上手都比较简单,所以一直以来都被使用广泛。

    我是攻城师
  • iCDO一周数据:腾讯Q3财报:支付等业务成主要营收;华为与亚马逊和谷歌竞争海外语音市场;京东获全球首个省域无人机物流经营许可证

    中国专利保护协会12日发布的《人工智能技术专利深度分析报告》(下称《报告》),对人工智能技术在世界范围内和在我国的专利申请数据进行了分析。 ...

    iCDO互联网数据官
  • Apache-Flink深度解析-TableAPI

    在《SQL概览》中我们概要的向大家介绍了什么是好SQL,SQL和Table API是Apache Flink中的同一层次的API抽象,如下图所示

    王知无
  • Apache-Flink深度解析-TableAPI

    SQL和Table API是Apache Flink中的同一层次的API抽象,如下图所示:

    王知无
  • Citrix Xenapp XML 默认端口号修改

     在安装Xenapp时,如果勾选了XML安装,则默认XML与WI共同使用80,这样可能会导致一些登陆问题,下面我们就介绍如何修改XML的默认端口号。

    SuperDream
  • memcached在centos下自启动脚本

    将脚本保存在 /etc/init.d/目录下,如/etc/init.d/memcached 执行如下命令

    luxixing
  • 「火镜评级」《美链》5.6分,总分10分,白皮书和技术指数单项仅2分

    区块链大本营
  • RIFT.io与风河携手促进NFV解决方案部署

    首个唯一的开源网络服务虚拟化(NSV)平台提供商RIFT.io近日宣布已经测试并验证其RIFT.ware平台与风河Titanium服务器能够实现互操作,并且将作...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券