数据仓部署使用

数据仓

ETL工具

工具对比

【国外】
1、datastage (收费)
点评:最专业的ETL工具, 2005年被IBM收购,目前发展到11.7版本。在数据集成的基础上,增加了数据质量分析、数据血缘分析、业务元数据管理等内容。技术支持也比较少,使用难度较大,尤其不菲的价格,导致国内用户较少。
2、informatica (收费)
点评:informatica创立于1993年,专业程度与Datastage旗鼓相当,有4个不同版本,即:标准版,实时版,高级版,云计算版。按用户许可收费,价格比Datastage便宜点。不具有数据质量功能,需要以编程方式进行处理。,没有任何Web集成功能。Informatica与datastage一样需要更高的学习成本。
3、ODI (收费)
点评:oracle数据库厂商提供的工具,有局限性,与oracle数据库耦合太深。ODI属于ELT架构,将数据传输到目标数据后,再目标数据库进行数据清洗转换处理,如果流程过多会对目标数据库有一定压力。对Web集成功能比较弱,运行监控能力比较差,获取技术支持比较困难。
4、kettle(免费)
点评:业界最有名的开源ETL工具。开源当然就免费,免费的有些东西使用就不是很方便。社区版缺乏项目管理、流程管理、运行监控功能,商业版有提供,价格比较高。适合用于少量流程或作为ETL的研究学习。

【国内】

  1. Datax (免费)
    点评:产品化程度还有一定距离。由于没有可视化开发界面,需要编写Java代码。数据清洗转换的能力比较弱,但在大数据传输能力比较好。
  2. Restcloud(免费)
    点评:国产比较好的ETL工具之一,采用B/S架构,可视化化开发,在数据传输与处理的能力与kettle相当,学习成本较低。与kettle比较,增加项目管理、流程管理、质量监测等功能。由于推出时间较短,技术支持目前只能通过社区获取。

其实还有其他比较优秀的,因为公司的流量不大,就选用开源的kettle。

kettle使用

kettle纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。

Kettle工程存储方式:
1、以XML形式存储
2、以资源库方式存储(数据库资源库和文件资源库)

Kettle的两种设计:

Kettle的组成:

任务保存:
数据库资源需要连接数据库,这里已经用docker创建了kettle相关的数据库,然后使用kettle创建数据库资源库。需要注意的是,创建数据库资源库后,会在C:\USER\XXX.KETTLE目录下生成一个resources.xml的文件,该文件记录了数据库连接的信息,如果用linux版本的任务调度工具,需要把该文件拷贝到相应目录才行

任务调度工具

1、kettle-web
2、taskctl
官网:http://www.taskctl.com/

基础版就已经够用,2022官方新版本8.0,官方建议使用web平台,根据官方教程搭建服务器和客户端,搭建好后使用taskctl的kettle插件来执行kettle任务。

安装教程:
http://www.taskctl.com/forum/detail_124.html

查看配置文件说明:
su - kettle
iconv -f gbk -t utf-8 $TASKCTLDIR/src/plugin/ktrjob/shell/cprunktrjob.sh

其中有说明kettle的ktr和kjb是如何定义的,通过读取xml标签来获取参数,例如ktr作业:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(三) 作业定义举例:
# 1.
# <[kettle转换类作业自定义作业类型名]>
# <name>job1</name>
# <progname>[.ktr文件位置和文件名]</progname>
# <exppara>pan.sh文件所在文件夹</exppara>
# <[kettle转换类作业自定义作业类型名]>
#
# 2.
# <ktrjob>
# <name>job2</name>
# <progname>/home/username/trans.ktr</progname>
# <para>filepath=/home/username,filename=test.txt</para>
# <exppara>env=/home/pdi-ce/data-integration</exppara>
# </ktrjob>
#
# 3.
# <ktrjob>
# <name>job3</name>
# <progname>/home/username/trans.ktr</progname>
# <para>filepath=/home/username,filename=test.txt</para>
# <exppara>env=/home/pdi-ce/data-integration,rep=myrep1,user=admin,pass=admin</exppara>
# </ktrjob>
#

拷贝windows版本上的resources.xml文件到/home/kettle/.kettle目录(插件默认读取该文件的数据库连接信息)

登陆taskctl网页,进入admin模块,点击作业类型,可以见到ktrjob和kjbjob的插件

选择designer模块,添加作业资源,点击设计资源,选择作业资源:

点击加号添加作业资源,这里我设置了两种资源,一种是直接读取本地目录的文件,另一种是读取kettle的数据库资源(预先在kettle的windows环境里面创建好了)

直接读取文件设置

驱动类型选择 file_explorer
资源链接方式选择filter_by_extension
文件目录填作业文件的路径,扩展名是转换作业的填.ktr(ktrjob)是作业的填.kjb(kjbjob)
关联作业类型可以填写作业类型的环境参数,这里只需要填kettle软件的路径就行。

回到控制容器,选择右上角的作业设计,左侧可以选择刚刚建立的作业资源,点击查询,获取到文件名,直接拖到加号创建作业

选取运行代理和执行时间计划后提交保存,然后编译发布,就可以到监控模块见到该作业,这里可以先点作业进行调试,调试成功后再点发布,就可以到monitor模块进行作业调度
可以通过代码标签切换查看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!--************************************************************* 
TASKCTL技术平台模块文件
工程名称:IOT
定时器名称: IOT任务调度
模块名称: MainModul
*****************************************************************-->
<serial>
<name>MainModul_rootnode</name>
<monititle>监控组1</monititle>
<begin>
<name>MainModul_beginjob</name>
<jobdesc>begin</jobdesc>
</begin>
<!-- 用户模块代码自定义区开始 -->
<!-- 用户模块代码自定义区结束 -->
<ktrjob>
<name>直接读取MATERIAL文件执行</name>
<progname>/data/kettle/data-integration/workspace/TRA_DW_DIM_MATERIAL.ktr</progname>
<exppara>env=/data/kettle/data-integration,/data/kettle/data-integration</exppara>
<jobdesc>直接读取MATERIAL文件执行</jobdesc>
<agentid>svrnode</agentid>
<timingplan>000000 m 1</timingplan>
<monititle>监控组1</monititle>
</ktrjob>

从插件配置文件说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
#------------------------------------------------------------------------------
# (一) 功能: 在CTL服务或代理用户执行kettle转换
#
# (二) 参数: 在TASKCTL所有插件中,具有以下统一的参数接口
# 1. tccid 【无用】容器(流程或定时器)ID
# 2. jobid 【无用】作业ID
# 3. progname 【有用】程序名称。程序名对应作业类型的progname属性
# 4. para 【有用】参数信息。参数信息对应作业类型的para属性
# 5. exppara 【有用】环境参数信息。环境参数信息对作业类型的exppara属性
# 6. hostuser 【无用】远程主机用户链接信息。远程主机用户链接信息对应作业类型的hostuser属性
#
# 参数说明:
# (1) progname: 一般为文件系统(.ktr)或资源库的完整路径及名称
#
# (2) para : 一般为kettle作业的命名参数或变量
#
# (3) exppara : 一般为kettle的pan.sh文件所在位置。例如:/home/pdi-ce/data-integration,若需要调用资源库,则需要增加rep(资源库名称),user(资源库用户),pass(资源库密码)

插件会读取:

— 确定是ktrjob的任务

— 读取文件路径(全路径需加后缀)

— 读取环境参数,如果直接读取文件,则不用rep参数

读取数据库资源库

作业资源库配置实例:

驱动类型选择kttle_explorer
资源链接方式选择db_repository
其他填写数据库连接的信息,同样需要添加管理作业类型,添加ktr,参数为:
env=/data/kettle/data-integration,rep=test,user=admin,pass=admin
按照上面添加读取文件一样添加作业即可。

代码:

1
2
3
4
5
6
7
8
9
<ktrjob>
<name>数据库资源读取MATERIAL文件</name>
<progname>/TO_EDW/TRA_DW_DIM_MATERIAL</progname>
<exppara>env=/data/kettle/data-integration,rep=test,user=admin,pass=admin</exppara>
<jobdesc>数据库资源读取MATERIAL文件</jobdesc>
<agentid>svrnode</agentid>
<timingplan>000000 m 1</timingplan>
<monititle>监控组1</monititle>
</ktrjob>

这里多了rep参数,插件通过这个参数来识别读取类型是否为资源库。然后读取数据库资源的时候,会调用/home/kettle/.kettle目录密码的resources.xml文件的数据库连接参数来连接数据库资源文件。我之前执行任务的时候怎么都报错,说该作业文件不是一个文件,后来才明白,在网页添加的数据库连接参数是插件来获取资源信息,而执行任务的时候是kettle软件pan.sh来读取数据库资源,所以如果没有该数据库连接资源文件,则会执行错误。

任务调度

在designer模块任务发布后,就可以在调度监控看到,如果修改了作业,重新发布后,需要在实时监控退出的状态下重载,以获取最新的任务信息。

实践

部署好taskctl和kettle基本参数后,基本上就是配置数据来源和编辑ktrjob

在windows下使用kettle软件编辑好ktr或kjob后,通过svn同步到服务器,然后使用jenkins持久化同步到taskctl服务器

编辑/home/kettle/.kettle/kettle.properties文件来配置数据源,其中可以配置scada的iot数据:如收集几台日志到日志服务器,然后设置共享,taskctl通过挂载共享来读写日志文件:
mount.cifs -o username=administrator,uid=1000,domain=fstbk.com \\192.168.7.22\iotdata\ /p2ldata

1、如果共享共享服务器加入了域,则需使用域和域用户
2、使用uid参数来映射用户属性,这样就不会有权限问题了。

分享到