• shell脚本监控Flume输出到HDFS上文件合法性


    在使用flume中发现由于网络、HDFS等其它原因,使得经过Flume收集到HDFS上得日志有一些异常,表现为:

    1、有未关闭的文件:以tmp(默认)结尾的文件。加入存到HDFS上得文件应该是gz压缩文件,以tmp为结尾的文件就无法使用;

    2、有大小为0的文件,比如gz压缩文件大小为0,我们单独拿下这个文件解压发现是无限循环压缩的。。。这个也不能直接用来跑mapreduce

    目前发现上述两种情况,其它还暂未发现。至于出现上述情况还没明确原因,且这两种情况都会影响hive、MapReduce的正常执行,2的话直接failed,1的话有可能丢失对应的数据。

    针对2直接删掉就行;1中的情况我们发现直接去掉tmp后缀是可以的。为此编写了一个shell脚本,定时检查HDFS上得文件发现1就去掉tmp后缀,发现2就删除文件,脚本如下:

     1 #!/bin/sh
     2 
     3 cd `dirname $0`
     4 
     5 date=`date -d "1 day ago" +%Y/%m/%d`
     6 echo " date is ${date}"
     7 HADOOP_HOME=/usr/lib/hadoop-0.20-mapreduce/
     8 dataDir=/data/*/
     9 echo "dir is ${dataDir}"
    10 echo "check hdfs file is crrect?"
    11 
    12 IFS=$'
    ';for name in `${HADOOP_HOME}/bin/hadoop fs -ls ${dataDir}${date}`
    13 do
    14     size=`echo "${name}" | awk '{print $5}'`
    15     fileAllName=`echo "${name}" | awk '{print $8}'`
    16     fileNameNoTmp=`echo ${fileAllName%.tmp*}`
    17     tmp=`echo ${fileAllName#*.gz}`
    18     if [ "${size}" == "0" ];then
    19         echo "${fileAllName} 's size is ${size} ..... delete it!"
    20         ${HADOOP_HOME}/bin/hadoop fs -rmr ${fileAllName}
    21     fi
    22     if [ "${tmp}" == ".tmp" ];then
    23         ${HADOOP_HOME}/bin/hadoop fs -mv ${fileAllName} ${fileNameNoTmp}
    24         echo "${fileAllName} has changed to ${fileNameNoTmp}......."
    25     fi
    26 done

    注:上述的地8行,hdfs支持正则的。上述的HDFS目录是:/data/*/2014/12/08这样的,大伙可以根据自己的需要修改

    可以使用crontab 定时检查一下。

  • 相关阅读:
    Java中使用Base64编码URL
    JSON Web Token (JWT)入门学习
    1047. 删除字符串中的所有相邻重复项
    1021. 删除最外层的括号
    使用shell获取随机端口<帮你解决端口的占用烦恼>
    初始化一个vue项目并生成完整的目录结构
    mysql-常用字符函数
    设计模式-单例模式-饿汉和懒汉
    Java-指令的重排序
    Java-反射类加载到内存分析
  • 原文地址:https://www.cnblogs.com/lxf20061900/p/4157305.html
Copyright © 2020-2023  润新知