zoukankan      html  css  js  c++  java
  • shell定时采集数据到HDFS

    上线的网站每天都会产生日志数据。假如有这样的需求:要求在凌晨 24 点开始操作前一天产生的日志文件,准实时上传至 HDFS 集群上。

    该如何实现?实现后能否实现周期性上传需求?如何定时?

      Linux crontab: :
        crontab -e
        0 0 * * * /shell/ uploadFile2Hdfs.sh //每天凌晨 12:00 执行一次

    实现流程

    一般日志文件生成的逻辑由业务系统决定,比如每小时滚动一次,或者一定大小滚动一次,避免单个日志文件过大不方便操作。

    比如滚动后的文件命名为 access.log.x,其中 x 为数字。正在进行写的日志文件叫做 access.log。这样的话,如果日志文件后缀是 123 等数字,则该文件满足需求可以上传,就把该文件移动到准备上传的工作区间目录。工作区间有文件之后,可以使用 hadoop put 命令将文件上传。

      在服务器上创建目录

    #日志文件存放的目录
    mkdir -r /root/logs/log/
    
    #待上传文件存放的目录
    mkdir -r /root/logs/toupload/

     

      编写shell脚本

    vi uploadFile2Hdfs.sh
    #!/bin/bash
    
    #set java env
    export JAVA_HOME=/export/servers/jdk1.8.0_65
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
    #set hadoop env
    export HADOOP_HOME=/export/servers/hadoop-2.7.4
    export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
    
    
    #日志文件存放的目录
    log_src_dir=/root/logs/log/
    
    #待上传文件存放的目录
    log_toupload_dir=/root/logs/toupload/
    
    
    #日志文件上传到hdfs的根路径
    date1=`date -d last-day +%Y_%m_%d`
    hdfs_root_dir=/data/clickLog/$date1/ 
    
    #打印环境变量信息
    echo "envs: hadoop_home: $HADOOP_HOME"
    
    
    #读取日志文件的目录,判断是否有需要上传的文件
    echo "log_src_dir:"$log_src_dir
    ls $log_src_dir | while read fileName
    do
        if [[ "$fileName" == access.log.* ]]; then
        # if [ "access.log" = "$fileName" ];then
            date=`date +%Y_%m_%d_%H_%M_%S`
            #将文件移动到待上传目录并重命名
            #打印信息
            echo "moving $log_src_dir$fileName to $log_toupload_dir"xxxxx_click_log_$fileName"$date"
            mv $log_src_dir$fileName $log_toupload_dir"xxxxx_click_log_$fileName"$date
            #将待上传的文件path写入一个列表文件willDoing
            echo $log_toupload_dir"xxxxx_click_log_$fileName"$date >> $log_toupload_dir"willDoing."$date
        fi
        
    done
    #找到列表文件willDoing
    ls $log_toupload_dir | grep will |grep -v "_COPY_" | grep -v "_DONE_" | while read line
    do
        #打印信息
        echo "toupload is in file:"$line
        #将待上传文件列表willDoing改名为willDoing_COPY_
        mv $log_toupload_dir$line $log_toupload_dir$line"_COPY_"
        #读列表文件willDoing_COPY_的内容(一个一个的待上传文件名)  ,此处的line 就是列表中的一个待上传文件的path
        cat $log_toupload_dir$line"_COPY_" |while read line
        do
            #打印信息
            echo "puting...$line to hdfs path.....$hdfs_root_dir"
            hadoop fs -mkdir -p $hdfs_root_dir
            hadoop fs -put $line $hdfs_root_dir
        done    
        mv $log_toupload_dir$line"_COPY_"  $log_toupload_dir$line"_DONE_"
    done

      设置执行权限

    chmod 777 uploadFile2Hdfs.sh

      在 /root/logs/log/ 添加测试文件

      执行脚本

    ./uploadFile2Hdfs.sh

      在/root/logs/toupload/ 及HDFS的webUI中查看现象

  • 相关阅读:
    HDU 1058 Humble Numbers
    HDU 1160 FatMouse's Speed
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1003 Max Sum
    HDU 1297 Children’s Queue
    UVA1584环状序列 Circular Sequence
    UVA442 矩阵链乘 Matrix Chain Multiplication
    DjangoModels修改后出现You are trying to add a non-nullable field 'download' to book without a default; we can't do that (the database needs something to populate existing rows). Please select a fix:
    opencv做的简单播放器
    c++文件流输入输出
  • 原文地址:https://www.cnblogs.com/jifengblog/p/9277027.html
Copyright © 2011-2022 走看看