Kettle 全量抽取数据

本例子,来源表是一个oracle视图,目的表是一个oracle表,采用“表输入—表输出”进行ETL。

1.在Spoon中,打开核心对象——表输入

        数据库连接中选择  DB连接中的视图,SQL语句是相关的视图,需要哪些字段、过滤哪些条件,都是在SQL里面设置。如下图所示。

Kettle 全量抽取数据_第1张图片

2.在Spoon中,打开核心对象——表输出

        选择数据库连接,目标模式是oracle的用户(即导入哪个用户),目标是:新建表名。

       执行SQL语句就会在oracle数据库的用户下面新建表格。如下图所示。

Kettle 全量抽取数据_第2张图片

一定要通过kettle这个选项来建立这个表,要不,插入/更新速度非常慢。因为通过kettle建表,优化了某些表的性能。(具体是什么)

3.开始执行

Kettle 全量抽取数据_第3张图片

4.执行过程和结果,总共50分钟,导入1800万条记录。 

总结

 kettle的性能
        kettle本身的性能绝对是能够应对大型应用的,一般的基于平均行长150的一条记录,假设源数据库,目标数据库以及kettle都分别在几台机器上(最常见的桌面工作模式,双核,1G内存),速度大概都可以到5000 行每秒左右,如果把硬件提高一些,性能还可以提升 , 但是ETL 过程中难免遇到性能问题,下面一些通用的步骤也许能给你一些帮助.
        尽量使用数据库连接池
        尽量提高批处理的commit size
        尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流)
        Kettle 是Java 做的,尽量用大一点的内存参数启动Kettle.
        可以使用sql 来做的一些操作尽量用sql 
       Group , merge , stream lookup ,split field 这些操作都是比较慢的,想办法避免他们,能用sql 就用sql
       插入大量数据的时候尽量把索引删掉
       尽量避免使用update , delete 操作,尤其是update , 如果可以把update 变成先delete ,  后insert .
       能使用truncate table 的时候,就不要使用delete all row 这种类似sql
合理的分区
       如果删除操作是基于某一个分区的,就不要使用delete row 这种方式(不管是delete sql 还是delete 步骤),直接把分区drop 掉,再重新创建
       尽量缩小输入的数据集的大小(增量更新也是为了这个目的)
       尽量使用数据库原生的方式装载文本文件(Oracle 的sqlloader , mysql 的bulk loader 步骤)
       尽量不要用kettle 的calculate 计算步骤,能用数据库本身的sql 就用sql ,不能用sql 就尽量想办法用procedure , 实在不行才是calculate 步骤.
       要知道你的性能瓶颈在哪,可能有时候你使用了不恰当的方式,导致整个操作都变慢,观察kettle log 生成的方式来了解你的ETL操作最慢的地方。
      远程数据库用文件+FTP 的方式来传数据 ,文件要压缩。(只要不是局域网都可以认为是远程连接)

           

 

你可能感兴趣的:(Kettle)