Linux下Shell编程实现基于Hadoop的ETL(导入篇)

  • Post author:
  • Post category:linux


在这里我们直接给出代码,然后对代码解析分析来学习:

conf/import.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<task type="add"><!--增量导入的表-->
		<table>think_task</table>
		<table>think_task_child</table>
		<table>think_user_task</table>
	</task>
	
	<task type="all"><!--全量导入的表-->
		<table>think_user_task</table>
		<table>think_task</table>
	</task>
</root>

在这里主要配置一些需要增量导入的表和一些全量导入用于初始化的表

bin/import.sh

#!/bin/bash
########################
#以下主要使用sed命令对XML进行解析,sed命令的作用是去除符合规则的字符串
#tr -d '\r' 用于删除每行末尾的换行符
#注:以下的操作都是基于bash Shell环境的以及Hadoop已经安装的基础上
########################
#get the environment
if [ -f ~/.bashrc ];#进入shell环境,用于执行下面的命令
then
 . ~/.bashrc
fi
#file exit
if [ -z $1 ];then #判断conf/import.xml的配置文件是否存在
echo 'USAGE:COMMAND FILENAME'
exit 0
fi
#time
yesterdaystr=$(date -d "yesterday" +%Y-%m-%d) #获取昨天的日期
yesterdaytimestamp=$(date -d "$yesterdaystr" +%s) #截止到昨天的时间戳

declare -a tables_add #预定义增量导入表数组
declare -a tables_all #预定义全量导入表数组

#预定义XML的处理标签
XML_PNODE=task
XML_PNODE_TYPE1=add
XML_PNODE_TYPE2=all
XML_CNODE=table

#全量增量导入标示符
FLAG=0

declare -i i=0
declare -i j=0

#获取命令的所在目录
bin=`dirname "$0"`
bin=`cd "$bin"; pwd`

#去除配置文件中无用的空格、空行、注释以及等号两边的空格等
OUTFILE=`sed -e 's/>/>\n/g' -e 's/\s*\(.*\)\s*$/\1/g' -e 's/\s*\(=\)\s*/\1/g' -e '/^\(\s\)*$/d' -e '/^$/d' -e 's/<!--.*-->//' -e 's/\r//' $1`
#循环读取XML
while read line
do
#如当前行符合增量开始标签时,FLAG置为1
if echo ${line}|grep -qE "^<$XML_PNODE type=\"add\"" ; then
FLAG=1
continue
fi
#如当前行符合结束标签时,FLAG置为0
if echo ${line}|grep -qE "</$XML_PNODE>" ; then
FLAG=0
continue
fi
#如当前行符合全量开始标签时,FLAG置为2
if echo ${line}|grep -qE "^<$XML_PNODE type=\"all\"" ; then
FLAG=2
continue
fi
#若FLAG为1时,代表接下来解析出增量表
if [ ${FLAG} -eq 1 ] ; then
	add_tmp=`echo ${line}|sed -n -e 's/<table>//' -e 's/<\/table>//p'|tr -d '\r'`
	#如果解析后的表名为空,则跳过,否则添加到增量数组中
	if [ ${#add_tmp} -eq 0 ] ; then 
		continue
	fi
	tables_add[$i]=$add_tmp
	let i++
	continue
fi
#若FLAG为2时,代表接下来解析全量表
if [ ${FLAG} -eq 2 ] ; then
	all_tmp=`echo ${line}|sed -n -e 's/<table>//' -e 's/<\/table>//p'|tr -d '\r'`
	#如果解析后的表名为空,则跳过,否则添加到全量数组中
	if [ ${#all_tmp} -eq 0 ] ; then 
		continue
	fi
	tables_all[$j]=$all_tmp
	let j++
	continue
fi
done<<EOF
$OUTFILE
EOF

hdfs dfsadmin -safemode leave

#重置shellsql变量
unset shellsql

#根据判断.import_all是否存在来判断是进行增量还是全量导入,然后拼接命令字符串
if [ -f ".import_all" ] ; then
	shellsql="echo -e \"\033[41:33m excute import.sh start import add tables ${tables_add[*]} \033[0m\""
	for ((i=0;i<${#tables_add[*]};i++))
	do
		shellsql="${shellsql} && ${bin}/sqoop.sh import --table ${tables_add[$i]} --where 'create_time > $yesterdaytimestamp'"
	done
	shellsql="${shellsql} && echo -e \"\033[41:33m excute import.sh finished import add tables ${tables_add[*]} \033[0m\""
else
	shellsql="echo -e \"\033[41:33m excute import.sh start import all tables ${tables_all[*]} \033[0m\""
	for ((i=0;i<${#tables_all[*]};i++))
	do
		shellsql="${shellsql} && ${bin}/sqoop.sh import --table ${tables_all[$i]}"
	done
	shellsql="${shellsql} && echo -e \"\033[41:33m excute import.sh finished import all tables \033[0m\""
	touch .import_all #生成隐藏文件,在全量导入后成功
fi

eval $shellsql

具体Shell代码下载:


http://download.csdn.net/detail/luo849278597/9490920





加群:397706991,共同学习



版权声明:本文为luo849278597原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。