Kettle使用初体验之批量数据入库体验插入更新和表输出组件使用区别
Kettle使用初体验之批量数据入库实验
##场景
场景
有多个千万级的数据文件需要导入到Oracle数据库中,如何快速入库。
文件是文本CSV格式,列分隔符为&^&,数据中含有很多中文信息,也包含了很多特殊字符。
问题
在导入过程中可能会引起超出数组,特殊字符引起异常。
在一定量的错误情况下是可以容忍的,但不能因为部分错误导致任务中断。
结论
实验步骤
实验一:使用文本文件作为输入,输出使用“插入/更新”组件
文本文件输入的配置如下:
(1)加载数据文件
(2)文件内容切分配置
(3)读取文件的错误处理策略
(4)设置文件切换后的列信息,便于与输出端做一一匹配
(5)输出端设置
注:此处勾选“不执行任何更新”,不需要更新
实验一总结
现象:
1.通过上面运行过程可以发现任务在运行48秒时候,入库速率为711条/秒,到44分钟时,入库速率为116条/每秒
2.监控数据库会话发现该任务一直在执行select语句,而且是单条记录查询
3.在经过44分钟还没有完成数据入库
分析:
通过运行过程中可以看出使用“插入/更新”组件时,该功能会对每天数据在数据库里先查询(select)一下确认是否有存在的然后插入,经过两个步骤才能插入一条数据,随着表的数据量增多,查询就会越来越慢,入库效率也就很慢,导致从过程中看到刚开始插入效率还可以,在过了几十分钟后就急剧下降。
结论:“插入/更新”组件不适用于大批量数据入库场景;
“插入/更新”组件会在数据库中执行两步操作,第一步Select,第二步insert或update
“插入/更新”组件会随着表的数据量增大而效率变得越来越慢
实验二:使用文本文件组件作为输入,输出使用“表输出”组件
输入组件同第一种方法配置
(1)表输出组件的配置
观察数据库运行情况
实验二总结
通过上图可以看出745万的数据在59秒就可以入库,速率在125337条/秒。
现象:1.表输出方式速度非常高,每秒入库速度在10多万条记录
2.通过数据库观察表输出方式是批量入库,没有经过select操作直接入库
结论:1、表输出方式入库效率高,适用于大批量数据入库
2.在数据库层面也是批量提交,不做数据重复校验。