今天刚接触 etl工具, 公司要求要实现一个 数据库同步任务,要求从两个表中同步数据。所以写下这篇博客记录一下。
思路:
常用的同步机制 就是 在A表中添加 时间戳字段 命名为 LastModifiedTime , B 表也添加相同的字段。
在同步的时候,查询A 表的 所有条目中 最大的更新时间, MAX(LastModifiedTime) ,在B表中只要
Select * From B where LastModifiedTime > ? 既可以查出所有的最新条目,添加 / 更新 即可, 这些在 kettle 中都有实现, 具体操作下文会讲到。
1 首先下载 pentaho http://tenet.dl.sourceforge.net/project/pentaho/Data%20Integration/6.0/pdi-ce-6.0.1.0-386.zip
解压到磁盘
2 因为任务后面需要mysql 数据库之间的同步,所以先将mysql 驱动jar包加入lib目录下, 由于这里有三个 lib 目录 ,分别是Data Service JDBC Driver lib libswt\win64 ,我不知道应该加入哪个目录,于是干脆点直接把mysql的jar包每个目录都加了一遍。 之后在安装目录打开命令行启动Sqoop.bat 显示如下界面
3 首先双击 "作业" ----》 "通用" ----》双击 START 出现如下界面
,接着可以双击右边的Start图标进行编辑
这个界面可以设置启动选项,要设置定时执行,勾选重复,然后设置类型为时间间隔, 以分钟的间隔 和 以秒计算的间隔分别是你想设置的定时。 我的同步任务是 以5 秒为单位同步一次所以设置上这样 。编辑好后记得ctrl+S保存文件到桌面。
4 保存完后关闭界面,又回到最上层 。 双击转换建立一个转换工程, 双击 “输入”--》“表输入” , 会在右边建立一个可以连接数据库连接,进入编辑界面 点击新建 设置数据库参数,命名为 MysqlA ,代表一个输入源。
点击确定后,编辑sql输入框输入 ,当然这是为了获取A表中的最大时间戳 ,点击确定。
5 再从左边导航栏添加一个 表输入 选项,重复上一步操作, 此 表输入 部件 是用来获取B表中所有大于 "上一步最大的时间戳" 的所有条目 , 当然这时候也需要新建一个数据库连接,指向的数据库当然就是 B 表所在的数据库 ,可以命名为 MysqlB。
此时,需要点击 ” 获取查询语句“ ,在数据库浏览器中选择你需要的表 如图所示
该操作会为你自动生成 查询sql语句, 这时候我们需要在最后一行手动添加自己的 WHERE 条件
问好就代表 从上一个输入源 获取 A表的最大的时间戳
其中再最下方 勾选如下,点击确定保存。
6 接着在最左边导航栏中 选择 "输出" ---》 ”插入/更新“ ,
此时设置的数据库连接 应该选择 A 数据表的 数据库,目标表应该选择 A 表 我这里是 test1 ,
在下方 "用来查询的关键字"
设置上查询的关键字 ,这里通常选择 主键
然后在下方更新字段中 设置 获取更新字段, 会自动获取表中的所有 需要更新的字段 ,当然很重要的一部就是需要把主键的更新选项设置为N
这一步如果不选会报 主键重复错误。
点击确定保存。
之后界面上已经有三个 部件, 按住 SHift + 鼠标左键 可以用箭头连接两个 部件 以此从左网友连接。
点击运行即可测试。此时也记得保存 到桌面。
7 上一步如果成功了, 需要讲转换和 定时任务结合。 此时关闭界面 在主对象界面中选择第2步创建的作业 , 双击 “通用” --- 》 “转换” , 在编辑转换
将转换文件名指向前面索保存的 “转换文件” , 并讲两个连在一起 ,运行即可实现5秒同步数据库。
成功后可以在B 数据表 添加 更新 表, 会自动同步到 A
大功告成,第一次写博客真的很累,如果有不详细的地方可以留言问我。