Kettle使用培训部门:EOMS讲师:刘晓源目录•目的•Kettle介绍•Kettle实战•使用原则目的了解Kettle的作用与使用。Kettle介绍•目的•Kettle介绍–总体介绍–家族介绍–概念定义•Kettle实战•使用原则本节目标:1、知道Kettle是什么,能做什么。2、知道Kettle的一些概念。总体介绍Kettle是一个ETL(Extract-Transform-Load)工具集,它为用户管理来自不同数据库的数据,描述自己要做的数据操作提供图形化的操作界面。总体介绍使用Kettle能为我们项目带来以下好处:•对于业务人员转换和工作(Job)以步骤流的方式呈现,更加直观,业务人员与开发人员沟通时可以把注意力集中在业务上。•对于开发人员1、图形化界面更加直观,开发人员上手快,加快开发效率。即使是二次开发,图形化的步骤展现使二次开发人员更快进入开发状态,不用把精力浪费在代码阅读和业务逻辑分析上。2、Kettle的javascript步骤运行开发人员通过编写JavaScript代码实现业务逻辑,并且允许在JavaScript调用java文件来实现复杂数据采集过滤逻辑。这样,开发人员只须把注意力放在写业务采集逻辑上就可以了,降低了开发采集的难度。3、Kettle提供方便的调试工具和详细的日志文件,方便开发人员跟踪调试。4、Kettle提供计算I/O、数据库读/写次数工具,方便开发人员在开发完成后观察,以便性能调优。总体介绍要在项目上更好的发挥Kettle的优势,还有以下一些问题待解决:1、调用方式问题:Kettle只提供了简单的调用方式。自己本身不提供轮训等工具。目前测试通过的只用两种:一种是在图形界面上点运行。另一种是在命令行模式输入运行命令。如果要实现轮训采集,需要通过Kettle的API实现调用,即需要融合Kettle。并且如果涉及到及时采集,除了融合问题,对采集的算法和性能也有很高的要求。2、性能问题:由于Kettle只是一个很灵活的采集工具,实现同一个采集的方式可以有很多种,性能的瓶颈还是在采集算法上(后面还有一些提高性能的原则),所以为了更好的使用Kettle,需要整理一些常用的采集算法和采集模板。3、Kettle本身的问题:Kettle属于开源产品,该产品还在不断的完善中,虽然有一个比较详细的使用文档,但是并不是很详细,很多细节必须上论坛找或更多的只能通过看源代码并且写demo来测试验证。而且由于Kettle的实现是基于多线程的,存在一定的线程bug。Kettle介绍•目的•Kettle介绍–总体介绍–家族介绍–概念定义•Kettle实战•使用原则KETTLE介绍Kettle家族目前包括4个产品:Spoon、Pan、CHEF、Kitchen。•SPOON允许你通过图形界面来设计ETL转换过程(Transformation)。例如,从EOMS系统抽取信息,并把这些信息存储到一个文本文件里的转换任务如下:KETTLE介绍KETTLE介绍•PAN允许你批量运行由Spoon设计的ETL转换(例如使用一个时间调度器)。Pan是一个后台执行的程序,没有图形界面。•CHEF允许你创建任务(Job)。任务通过允许每个转换,任务,脚本等等,更有利于自动化更新数据仓库的复杂工作。任务通过允许每个转换,任务,脚本等等。任务将会被检查,看看是否正确地运行了。(下面是一个Chef的任务图)•KITCHEN允许你批量运行用Chef设计的jobs。(例如用scheduler)•KITCHEN允许你批量使用由Chef设计的任务(例如使用一个时间调度器)。KITCHEN也是一个后台运行的程序。Kettle介绍•目的•Kettle介绍–总体介绍–家族介绍–概念定义•Kettle实战•使用原则概念介绍本节介绍Kettle中的两个重要的定义:Transformation(转换)和Job(工作),用Kettle可以话Transformation图和Job图。Job与Transformation的差别是:Transformation专注于数据的ETL,而Job的范围比较广,可以是Transformation,也可以是Mail、SQL、Shell、FTP等等,甚至可以是另外一个Job。•Transformation(转换)定义如右图,Transformation主要是由Step和Hop组成。Transformation主要包括几个原型概念:Step、Hop、InputStream、OutputStream、Row、Value。下面给出定义–Step(步骤)如右图的“TableInput”,每个Step就是一个元操作。–Hop(跳跃线)连接Step的线,代表了数据的流向。–InputStream(输入流)输入Step的数据流–OutputStream(输出流)从Step输出的数据流–Row(记录行)InputStream中存在多个Row,Row存在多个Value。–Value(值)值,带类型的值,例如String类型的值。概念介绍•Job(工作)定义–JobEntry(工作实体)执行具体的任务(例如调用转换)–Hop连接JobEntry的线。可以指定是否有条件的执行。例如,根据前一个JobEntry执行的结果,判断是否执行这条Hop指向的下一个JobEntry。Kettle实战•目的•Kettle介绍•Kettle实战–常用Step介绍–检查、调试、运行–日志–采集demo•使用原则常用Step介绍•生成字段和空操作–生成记录功能:用于生成数据行用途:一般用来模拟数据测试用。–空操作功能:什么都不做。用途:1、汇总数据集(待汇总的数据集必须结构(字段)一致)2、调试时作为展现数据的节点常用Step介绍•TableInput和TableOutputa1表字段名:a,bA2表字段名:a,c在这个demo中可以看出两点:1、数据流(输入/出流)中的数据字段名与生成该数据流的Step自动获取。2、表输出是按照数据流的数据自动匹配并且插入到输出表中的。常用Step介绍•字段选择用于筛选数据流中的字段。常用Step介绍•获取系统信息可以通过获取系统信息获取系统的一些信息,以及获取调用转换时传入的参数。常用Step介绍•MergeJoinMergeJoinStep做的连接运算是在内存中运行的。它有一个特殊要求:要求做集合的连接key必须已经按相同方式排好序了(无论是用Sql的orderby还是用KETTLE提供的排序记录Step),要不然会出现不可预知的错误,例如右图。常用Step介绍修改后的图Kettle实战•目的•Kettle介绍•Kettle实战–常用Step介绍–检查、调试、运行–日志–采集demo•使用原则检查、调试、运行•右图红框标出的工具栏–运行–预览–调试–检查检查、调试、运行–检查检查功能检查出图中的应用级错误(不能检查出逻辑错误)。点击检查按钮后弹出下图:红色的为错误,必须解决。黄色的为警告,可能会引起错误,不一定需要解决。检查、调试、运行–预览能够看到执行完该步骤后的输出数据(有的可能看不到,例如,需要参数传入的执行步骤)。一般在个别步骤中也有预览按钮。检查、调试、运行–调试调试转换,可以输入参数和设置要观测的步骤。从中可以看到每个步骤的输出结果。检查、调试、运行–运行运行后可以看到一下结果。对部分参数解释一下:读:从输入流读取的记录数。写:输出到输出流的记录数。输入:从数据库读取的记录数。输出:输出到数据库的记录数。错误:执行时错误数。激活:Step执行的状态。时间:执行该步骤的时间。速度:该Step处理每行记录用的时间。Pri/in/out:显示因为该Step的输入缓存为空,或者输出缓存已满而等待进入休眠的时间。Kettle实战•目的•Kettle介绍•Kettle实战–常用Step介绍–检查、调试、运行–日志–采集demo•使用原则日志在Kettle的日志机制中存储方式分两类,一类是存储在文本日志里,一类是存储在数据库里。本节暂时只介绍记录在日志里的情况。日志日志级别:可以点击记录配置日志级别。Nothing不显示任何输出。Error只显示Error。Minimal只记录必要日志。Basic默认日志级别。Detailed输出对话级别的日志。Debug输出调试级别的日志。Rowlevel每一行的操作都会记录日志。Kettle实战•目的•Kettle介绍•Kettle实战–常用Step介绍–检查、调试、运行–日志–采集demo•使用原则采集demo•采集demo1和采集demo2说明两个demo实现的业务是一样的,区别是demo2多用了几个step去实现连接功能。意在说明两点:1、如果一条sql实现不了的,可以通过Kettle提供的step实现。2、Kettle很灵活,所以从性能上考虑,对开发人员的要求也是挺高的,下面一节会给出一些原则。采集demo•采集demo1采集demo•采集demo2使用原则•目的•Kettle介绍•Kettle实战•使用原则使用原则•尽量使用数据库连接池•尽量提高批处理的commitsize•尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流)•Kettle是Java做的,尽量用大一点的内存参数启动Kettle.•可以使用sql来做的一些操作尽量用sqlGroup,merge,streamlookup,splitfield这些操作都是比较慢的,想办法避免他们.,能用sql就用sql•插入大量数据的时候尽量把索引删掉•尽量避免使用update,delete操作,尤其是update,如果可以把update变成先delete,后insert.使用原则•能使用truncatetable的时候,就不要使用deleteallrow这种类似sql•合理的分区•如果删除操作是基于某一个分区的,就不要使用deleterow这种方式(不管是deletesql还是delete步骤),直接把分区drop掉,再重新创建•尽量缩小输入的数据集的大小(增量更新也是为了这个目的)•尽量使用数据库原生的方式装载文本文件(Oracle的sqlloader,mysql的bulkloader步骤)•尽量不要用kettle的calculate计算步骤,能用数据库本身的sql就用sql,不能用sql就尽量想办法用procedure,实在不行才是calculate步骤.•要知道你的性能瓶颈在哪,可能有时候你使用了不恰当的方式,导致整个操作都变慢,观察kettlelog生成的方式来了解你的ETL操作最慢的地方。•远程数据库用文件+FTP的方式来传数据,文件要压缩。(只要不是局域网都可以认为是远程连接)