hbase离线定时入库shell脚本-小栗子

#!/bin/bash
#######数据类型(cdr,ims,pc,.ngn_sip)######
dir=***
#############
#原始文件地址
oripath=/bigdata/data8/zhxl/${dir}/dst/
#压缩文件地址
standardpath=/bigdata/data8/zhxl/${dir}/standard/
#temp临时文件存放地址
temppath=/bigdata/data8/zhxl/${dir}/temp/
#日志文件存放地址
logpath=/bigdata/data8/zhxl/${dir}/logs/`date "+%Y-%m-%d"`.log
#PID地址
pidpath=/home/hadoop/nocloadhbase/${dir}.pid
echo "###########日期:"`date "+%Y-%m-%d"`" NOC源数据加载到HBase脚本开始运行##########" >> ${logpath}

#判断是否有进程正在执行
check_running() {
        pid=`cat ${pidpath}`
        [ -d /proc/$pid ] && return 0
        return 1
}
if [ -f ${pidpath} ]; then
        check_running
        exist=$?
        while [[ $exist = 0 ]]
        do
                echo `date "+%Y-%m-%d %H:%M:%S"`": sleep 检测到有相同任务的进程在执行,该次任务睡眠等待30分钟!" >> ${logpath}
                sleep 30m
                check_running
                exist=$?
        done
fi
echo $$ > ${pidpath}

#遍历dst目录,获取所有的符合格式的件,开启入库处理
echo `date "+%Y-%m-%d %H:%M:%S"`": start 遍历dst目录。获取所有的符合格式的文件,开启入库处理!" >> ${logpath}
cd $oripath
for filename in `ls | grep -E "xw.*_[0-9]*\.txt"`
do
        echo "#====> "${filename} >> ${logpath}
        #判断文件内容是否为空,文件内容为空跳过入库过程
        if [ -s $filename ]
        then
                #对元数据文件进行cat重定向,以转化数据格式,以符合入库要求
                nocfile="cdr"${filename}
                echo `date "+%Y-%m-%d %H:%M:%S"`": transform 对"${filename}"进行cat重定向,转化到"${temppath}${nocfile} >> ${logpath}
                cat ${filename} | awk 'BEGIN{FS=",";OFS="|"}{print $3"-"$7, $1, $3, $4, $5, $7, $13, $14, $16, $22, $23, $25, $31, $32, $46, $0}' > ${temppath}${nocfile}.tmp
                mv ${temppath}${nocfile}.tmp ${temppath}${nocfile}

                #将转化过格式的文件上传到hdfs,以便进行入库处理
                echo `date "+%Y-%m-%d %H:%M:%S"`": upload 上传"${nocfile}"到hdfs上/data/noc/中!" >> ${logpath}
                hadoop fs -put ${temppath}${nocfile} hdfs:///data/noc/

                #使用上传的hdfs上的文件进行入库存储
                echo `date "+%Y-%m-%d %H:%M:%S"`": storage 对"${nocfile}"进行入库存储到HBase中noc表中!" >> ${logpath}
                hbase org.apache.hadoop.hbase.mapreduce.ImportTsv  -Dimporttsv.separator='|'  -Dimporttsv.skip.bad.lines=false -Dimporttsv.columns='HBASE_ROW_KEY,c:src_type,c:start_time,c:end_time,c:city_id,c:caller_call,c:caller_city,c:caller_sp,c:called_call,c:called_city,c:called_sp,c:callee_call,c:callee_city,c:callee_sp,c:succ_flag,c:info'  noc hdfs:///data/noc/${nocfile}
        else
                echo `date "+%Y-%m-%d %H:%M:%S"`": null "${filename}"文件内容为空,跳过转格式入库过程!" >> ${logpath}
        fi
        #将处理过的文件压缩,存储到standard文件目录下
        echo `date "+%Y-%m-%d %H:%M:%S"`": compress 对"${filename}"进行压缩到"${standardpath} >> ${logpath}
        tar -zcvf ${standardpath}${filename}.tar.gz ${filename}
#删除处理过的元数据文件,以及转格式文件
        echo `date "+%Y-%m-%d %H:%M:%S"`": remove 删除"${filename}"以及"${nocfile} >> ${logpath}
        rm -rf ${filename}
        rm -rf ${temppath}${nocfile}
done
#处理结束
echo "##########"`date "+%Y-%m-%d %H:%M:%S"`":本次任务结束##########" >> ${logpath}

1.文件处理最好指定处理的文件格式,确保处理的文件符合规范。

ls | grep -E "xw.*_[0-9]*\.txt"

2.保证操作的原子性cat 重定向就不是原子操作。

3.定时任务确保重复执行不受影响。

4.shell正则表达式。

5.hbase离线入库。

6.文件解压缩到指定文件。

7.shell循环,睡眠等等。

posted @ 2017-02-20 22:57  时光舟  阅读(1179)  评论(0编辑  收藏  举报