在流程化中,我不太清楚其他朋友是怎么做的,这里参考我司的数据仓库的调度逻辑将sqoop脚本放到shell里执行,最终结果能基本解决后期日常维护、代码重用的需求;注意这里只讨论从数据源获取数据到hive而不包括在hive中对数据的处理脚本,但是是值得参考的
目标
根据需要每天从业务库导入前一天的数据,在hive中生成一个日表,格式与数据源保持一致即可,比如今天2015年5月11日,那么我们将在凌晨从数据源中获取的2015年5月10日的数据;这里hive当做一个数据仓库来使用,先将数据原封不动的抽取过来,相当于三层结构中的ods层。
测试环境
数据源:MS sqlserver 2012
hadoop-2.5.0 hive-0.13 sqoop-1.4.5
对应的数据库为fengmingdw
1、数据源的配置文件
关于配置文件的存在是为了将所用相关的属性整合到同一个文件,每一个需要对应属性的脚本,只要到里面去读就可以了;在设计过程中这里提供了两种方法,方法一可以参考一下,建议直接方法二
方法一,自定义配置文件
配置文件格式可以自选,包括诸如xml、ini等等,考虑到shell实现的困难,这里选取最简单的
形如xxx=aaaa ,这是linux中通用的配置文件方式
#文件命名为datawarehouse
ip=192.168.73.12 #注意等号两边不要有空格
username=testUser
passwd=123456
dbname=fdw
connectURL="jdbc:sqlserver://`echo $ip`;DatabaseName=`echo $dbname`"
读取该文件的方法参考如下
function load_config()
{
filePath="/home/9003547/datasource.d/`echo $1`" #这是我存放的配置文件路径
echo $filePath
if [ -f "$filePath" ]; then
. $filePath
fi
}
load_config datawarehouse #传入配置文件名称
echo $ip #读取的参数
echo $connectURL
在对应的脚本中加入此代码就可以获取到ip、connectURL等配置在datawarehouse中的值
方法二,options-file参数
sqoop中提供了一个选项 --options-file,允许sqoop去读取一段文件内的脚本
这里提供一个文件,路径为 /home/9003547/sqooppath/fdw.txt,该文件内容如下
import
--connect
jdbc:sqlserver://192.168.73.12:1433;DatabaseName=fdw
--username
testUser
--password
123456
在sqoop中可以使用类似语句就可以重复引用文件fdw.txt中的信息
sqoop --options-file /home/9003547/sqooppath/fdw.txt \
--table myTestTable \
--xxxxxx #后面补充相应的参数
这种情况,对于大量的数据来源库可能需要自己维护,十几二十可以用,但是更多的就可能有点乏力了,事实上不管有多少数据源都建议给予一个良好的命名规范,至少能要让使用者能够看命名就知道内容
shell中的sqoop与hive脚本
在这里做简单的设置,包括传入一个日期参数作为表名、将hive中存在的表名给删除、sqoop抽取表数据
日期参数的设置
因为是每天一个表存放数据,所以采取的方式是表名+日期,这里设置日期参数
#定义时间,允许传入一个时间,如果未传递则默认当前日期的前一天
if [ -z $1 ]
then
d_date=`date +%Y%m%d --date="-1 day"`
else
d_date=$1
fi