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循环,睡眠等等。