ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kettle基本概念

2021-04-25 22:51:14  阅读:197  来源: 互联网

标签:转换 步骤 数据库 kettle 作业 基本概念 etl


本章主要讲述kettle的基本概念,我们需要了解kettle工具本身的一些设计原则,以及kettle里的不同功能模块。首先讲述如何通过转换,以数据行的形式来处理数据,然后解释如何使用作业以工作流形式将转换连接起来。

本章要讲述如下的kettle概念:

数据库连接

工具和常用程序

资源库

虚拟文件系统

参数和变理

可视化编程

设计原则

kettle工具在设计初始就考虑一些设计原则,这些原则也借鉴了以前使用过的其他一些etl工具积累下的经验和教训。先总结一下以前的经验,看我们能从中获得哪些有益的经验。

易于开发:作为数据仓库和etl开发者,你只想把时间用在创建bi解决方案,任何于软件安装,配置的时间都是一种浪费。例如,为了创建数据库连接,很多和kettle类似的java工具都要求用户手工输入数据库驱动类名和jdbcurl连接串。尽管用户通过互联网都能搜索到这些信息,但这明显把用户的注意力转移到了技术方面而非业务方面,kettle尽量避免这类问题的发生。

避免自定义开发:一般来说,etl工具要使用简单的事情更简单,使用复杂的事情成为可能。ETL工具提供了标准化的构建组件来实现etl开发人员不断重复的需求。当然可以通过java代码或java 脚本实现一些功能。

所有功能都通过用户界面完成:对于这一黄金准则也有很少的几个例外(如kettle.properties和shared.xml文件就是两个例外),不能通过界面,要手工修改配置文件。如果不直接把所有功能通过界面的方式提供给用户,实现上就是在浪费开发人员的时间,也是在浪费用户的时间,专家级的etl用户还要去学习隐藏在界面以外的一些特性。在kettle里,etl元数据可以通过xml格式表现,或通资源库,或通过使用java api.无论etl元 数据是以哪种形式提供,都可以百分之百图用户来编辑。

没有命名限制:ETL转换里有各种各样的名称,如数据库连接、转换、步骤、数据字段,作业等都要有一个名称。如果还要在命名时考虑一些限制(如长度、选择的字符),就会给工作带来一个麻烦,etl工具需要足够的智能化来处理etl开发人员设置的各种名称,最终etl解决方案应该可以尽可能地自描述。

透明:如果etl工具需要你了解转换中某一部分工作如何完成的,那么这个etl工具就是不透明的。当然,如果想自已实现etl工具里某一种同样的功能,你就要确切地知道这一部分功能是如何完成的。不过允许用户看到etl过程中各部分的运行状态也是很重要的,这样可以加快开发速度、降低维护成本。

灵活的数据通道:对etl开发者来说,创造性极端重要,创造性不但让你享受到工作的乐趣,而且能让你以最快的方式开发出etl方案。kettle从设计初始就在数据的发送、接收方式上尽可能灵活。kettle可以在文本文件、关系数据库等不同目标之间复制和分发数据,从不同数据源合并数据也是内核引擎的一部分,也同样很简单。

只映射需要映射的字段:在一些etl工具经常可以看到数百行的输入和输出映射,对于维护人员来说这是一个噩梦。有etl开发过程中,字段要经常变动,这样的大量的映射也会增加维护成本。

kettle的一个重要核心原则就是etl流程中所有未指定的字段都自动被传递到下一个组件。这个原则极大减少了维护成本。也就是说输入中的字段会自动出现在输出中,除非中间过程设置终止某个字段的传递 。

kettle设计模块

通常每个kettle工具都用不同的名字区分不同的组成部分,名字就是说明了这一组成部分的功能。或可以使用这一部分得到什么结果,kettle也不例外。本书解释了一些kettle特定的功能名称。通过本章可以了解如何在转换里逐行处理转换,如何在作业处理工作流,你也学习诸如数据类型和数据转换等细节内容。

转换

转换是etl解决方案中最主要的部分,它处理抽取,转换,加载各阶段对各种数据行的操作,转换包括一个或多个步骤如读取文件,过滤输出行、数据清洗或将数据加载到数据库。

转换里的步骤通过跳来连接,跳定义一个单向通道,允许数据从一个步骤向另一个步骤流动。在kettle里,数据的单位是行,数据流就是数据行从一个步骤到另一个步骤移动。数据流的另一个同义词就是记录流。

显示了一个转换例子,该转换从数据库表读取数据并写入到文本文件。

除了步骤和跳,转换还包括了注释,注释是一个小的文本框,可以放转换流程图的任何位置,注释的主要目的的合作转换文档化。

步骤:

步骤在转换里的基本组成部分,它以图标的方式图形化展形,图2-1显示了两个步骤,表输入和文本文件输出,一个步骤有如下几个特性。

步骤需要有一个名字,这个名字的转换范围内唯一

每个步骤都会读、写数据行(唯一例外是生成记录步骤,该步骤只写数据)

步骤将数据写到与之相连一个或多个输出跳,再传送到另一端的步骤,对另一端步骤来说这个跳就是一个输入跳,步骤通过输入跳接收数据。

大多数的步骤可以有多个输出跳,一个步骤的数据发送可以被 设置为轮流发送和复制发送。轮流发送是将数据行依次发给每一个输出跳,复制发送是将全部数据行发送给所有输出跳。

在运行转换时,一个线程运行一个步骤和步骤的多份拷贝,所有步骤的线程几乎同时运行,数据行连续流过步骤之间的跳。

除了上面这些标准的功能,每个步骤都都有明显的功能区别,这可以通过步骤类型体现。如图2-1中的表输入步骤就是向关系型数据库的表发出一个sql查询,并将得到的数据行写到它的输出跳。另一方面文本文件输出步骤从它的输入跳读取数据行,并将数据行写文件文件。

转换的跳:跳就是步骤之间带箭头的连线,跳定义了步骤之间的数据通路。跳实际上是两个步骤之间的被 称为行集的数据行缓存(行集的大小可以在转换的设置里定义),当行集满了,向行集数据的步骤停止写入,直到行集里又有了空间,当行集空了,从行集读取数据的步骤停止读取,直到行集里又有可读的数据行。

当创建新跳的时候,需要记住跳转换里不能循环,因为转换里每个步骤都依赖前一个步骤获取字段值 。

并行

跳的这个基于行集缓存的规则允许每个步骤由一个独立的线程运行,这样并发程序最高,这一规则也允许数据以最小消耗内存的方式来处理。在数据仓库里,我们经常需处理大量数据,所以这种并发低消耗方式来处理。在数据仓库里,我们经常要处理大量数据,所以这种并发低耗内存的方式也是etl工具的核心需求。

对于kettle,不可能定义一个执行顺序,不可能也没有必要确定一个起点或终点。因为所有步骤都以并发方式执行,当转换启动后,所有步骤都同时启动,从它们的输入跳中读取数据,并把处理过的数据写到输出跳,直到输入跳里不再有数据,就中止步骤的运行。当所有的步骤都中止了,整个转换就中止了,也就是说,从功能角度来看,转换也有明确的起点和终点。

转换启动后,从它们的输入跳中读取数据,并把处理过的数据写出输出跳,直到输入跳里不再有数据,就中止步骤的运行。当所有的步骤都中止了,整个转换就中止了,也就是说,从功能的角度来看,转换也有明确的起点和终点。例如显示的转换起点就是表输入步骤,终点就是文本文件输出步骤因为这个步骤将数据写到文件,而且后面不再有其他节点。

上面说的如何定义转换的起点和终点看上去有点自相矛盾或截然相反,实际上并没有这个复杂,只是因为看问题的角度不同。你能想像到数据沿转换里的步骤移动,而形成一条从头到尾的数据通路。而另一方面,转换里的步骤几乎是同时启动的,所以不可能判断哪个步骤是第一个启动的步骤。

如果想要一个任务沿着指定的顺序执行,那么就要使用本章后面讲的作业了。

数据行

数据以数据行的形式沿着步骤移动,一个数据行是零到多个字段的集合,字段包括几种数据类型。

string:字符类型数据。

number:双精度浮点数。

integer:带符号长整形(64位)。

bignubmer:任意精度数值。

date:带毫秒精度的日期时间值。

boolean:取值为true和false的布尔值 

binary:二进制字段可以包括图形,声音,视步骤及其他类型的二进制数据。

每个步骤在输出数据行时都有对字段的描述,这种描述就是数据行的元数据。通常包括下面一些信息:

名称:行里的字段名应该是唯一的。

数据类型:字段的数据类型

长度:字符串的长度或bignumber类型长度。

精度:bignumber数据类型的十进制精度。

掩码:数据显示的格式。如果要把数值型(number,integer,bignumber)或日期类型转换成字符串类型就需要掩码,例如在图形界中预览数值型,日期型数据,或者把这些数据保存成文本或xml格式就需要用这种格式。

小数点:十进制数据的小数点格式,不同文化背景下小数点符号是不同的,一般是点.或逗号,

分组符号:数值类型数据的分组符号,不同文化背景下数字里的分组符号也是不同的。一般是逗号(,)或点. 或单引号(‘)。

初始步骤:kettle在元数据里还记录了字段由哪个步骤创建的,可以让你快速定位字段由转换里的哪个步骤最后一次创建或修改。

当设计转换时有几个数据类型的规则需要注意:行级里的所有行都应该有同样的数据结构。就是说,当从多个步骤向一个步骤写数据时,多个步骤输出的数据行应该有相同的结构。

字段元数据不会在转换中发生。就是说,字符串不会自动截去长度以适应指定的长度,浮动数也不会自动取整以适应指定的精度。这些功能必须通过一些指定步骤来完成。

默认情况下,空字符串被认为null相等。

注意:空字符串与null是否相等,可以通过一个参数kettle_empty_string_differs_from_null来设置。

数据转换:即可以显式地转换数据类型,如在字段选择步骤中直接选择要转换的数据类型,也可以隐式转换数据类型,如将数值类型数据写入数据库varchar类型字段。这两种形式数据转换实际是完全一样的,都是使用了数据对数据的描述。

Date和string的转换:

kettle内部的date类型里包括了足够的信息。可以用这些信息来表现任何毫秒精度的日期、时间值。如果要在String和date类型转换,唯一要指定就是日期格式掩码。关于日期和时间的掩码可以参考java api文档的date and time patterns部分。部分:http://java.sun.com/j2se/1.4.2/docs/api/text/SimpleDateFormat.html.这个文档列出所有可以用于编码的字母,不用于编码目的字母都应该包含的单引号里。

例如:表2-1显示了一个例子日期2009年12月6日21点6分6秒321毫秒的几个字符串日期编码的例子。

转换掩码结果
yyyy/MM/dd HH:mm:ss.SSS2009/12/06 21:06:54.321
h:mm s9:06 PM
HH:mm:ss21:06:54
M-d-yy12-6-09
  

Numeric和String的转换

Numeric数据(包括number,integer,bignumber)类型之间的转换用到了下面几种字段的元数据。

转换掩码

小数点符号

分组符号

贷币符号

这些转换掩码只是决定一个文本字符串如何转换一个值。而数值本身实际 精度和舍入无关。java api中定义了所有可用的掩码符号和格式规划:参考 http://java.sun.com/j2se/1.4.2/docs/api/java/text/DecimalFormat.html

转换掩码小数点符号分组符号结果
123.5678#,###.###.,1,234.57
1234.5668000,000.0000,.001.234,45
1.9#.00;-#.00.,-1.9
1200000;00000  12

其他转换:

描述
booleanstring转换y或N,如果设置长度大于等于3,转换成true或false
stringboolean字符串Y,true,yes,1都转换true,其它字符串转换为false(不区分大小写)
Integer datedate integer整形和日期之间转换时,整形就是1970-01-01 00:00:00 GMT开始计算的毫秒值。例如2010-09-12可以转换为128411280000,反之亦然。

作业:

大多数etl项目都需要完成各种各样的维护工作。例如,当运行中发生错误,要做哪些操作,如何转换文件,验证数据表是否存在,等等,而这些操作要按照一些顺序完成。因为转换以并行方式执行。就需要一个可以串行执行作业处理这些操作。

一个作业包括一个或作业项,这些作业项某种顺序来执行。作业执行顺序由作业项之间的跳和每个作业项的执行结果来决定的作业。

作业项:

作业项是作业的基本构成部分。如同转换的步骤,作业项也可以使用图标的方式图形化展示。但是,如果你再仔细观察。还是会发现作业一些地方不同于步骤。

新步骤的名字应该是唯一的,但作业项可以有影考贝。这样可以把一个作业项放在多个不同的位置。这些影子拷贝里的信息都是相同的,编辑了一份拷贝,其他拷贝会随之修改。

在作业项之间可以传递一个结果对象,这个结果对象里包含了数据行,它们不是以流的方式来传递的。而是等一个作业项执行完了,再传递下一个作业项。

默认情况下,所有的作业项都是以串行方式执行的,只是在特殊的情况下,以并行方式执行。

因为作业顺序作业项,所以必须定义一个起点。有一个叫开始的作业项就定义了这个起点。一个作业只能定义一个开始作业项。

作业跳:

作业的跳是作业项之间的连接线,它定义了作业的执行路径。作业里每个作业项的不同运行结果决定了作业的不同执行路径。对作业项的运行结果的判断如下:

无条件执行,不论上一个作业执行成功还是失败,下一个作业项都会执行。这是一种黑色的连接线。上面有一个锁的图标,如图2-2所示。

当运行结果为真时执行。当上一个作业项执行结果为真时,执行下一个作业项。通常在需要无错误执行的情况下使用。这是一种绿色的连接线,上面有一个对钩号的图标。

当运行结果为假时执行:当一个作业项的执行结果为假时或没有成功执行时,执行下一个作业项,这是一种红色的连接线,上面有一个红色的停止图标。

在作业项连接的右键菜单上和跳的小图标的选项里都可以设置上这几种判断方式。

多路径和回溯

kettle使用一种回溯算法来执行作业里的所有的作业项,而且所以项的运行结果(真或假)也决定执行路径。回溯算法是:假设执行到了图里的一条路径的某个节点时,要依次这个节点所有子路径。直到没有再可以执行的子路径。就返回该节点的上一节点,再反复这个过程。

A\B\C三个作业项的执行顺序如下:

首先开始作业项搜索所有下一节点作业项,找到A和C

执行A

搜索A后面的作业业,发现b

执行b

搜索b后面的,没有找到任何作业项

回到a,也没发现其他作业项

回到start ,发现另一个执行的作业项c

执行c

搜索c后同的作业项,没有找到任可作业项

回到start,没有找到任何作业项。

作业结束。

这种回溯算法有两个重要特征:

因为作业可以嵌套的,除了作业项有运行结果,作业也需要一个运行结果,因为一个作业可以是另一个作业的作业项。

一个作业的运行结果,来自于最后一个执行的作业项。上面的例子里例子的执行顺序可以是abc,也可以cab,所以不能保证作业项c的结果就是作业的结果。

当你在作业里面创建一个循环,作业项就会被执行多次,作业项的多次运行结果会保存在同存里,以便以后使用。

并行执行:

有时候需要将作业项并行执行,这种并行执行也可以的,一个作业项可以并发的方式执行它后面的所有作业项:

并行执行的作业项

在这个例子里,作业项a和c几乎同时启动,需要注意的是,如果a和c顺序的多个作业项。那么两组作业项也并行执行的。

两组同时执行的作业项:

在这个例子里,作业项【A,B,LOg1】和【C、D、Cleanup Tables】是在两个线程里并行执行的。通过常设计者也是希望以这样的方式执行,设计者希望一部作业并行执行。然后再串行执行其他作业项,这就需要把并行的作业项放到一个新的作业项。然后作为另一个作业的作业项。

并行加载作业作为另一个作业的项

作业项结果:

作业执行结果不仅决定了作业执行路径,而且还向下一个作业项传递了一个结果对象。结果对象包括了一下面一些信息。

一组数据行:在转换里使用复制行到结果,步骤可以设置这组数据行,与之对应,使用从结果获取行,步骤可以获取 这组数据行。在一些作业项,如shell

转换或作业的元数据:

转换和作业是kettle的核心组成部分,以前曾经讨论过,它们可以用xml格式来表示,可以保存存资源库。可以用java api的形式来表示。它们的这些表示试,都依赖于下面的这些元数据。

名字:转换或作业的名字,尽管名字不是必要的,但应该使用名字,不论是在一个etl工程内还是在多个etl工程内,都应尽可能使用唯一名字。这样在远程执行时或多个etl工程共用一个资源库时都会有帮助。

文件名:转换或作业都在文件名或url,只有当转换或作业是以xml文件的形式存储时,才需要设置这个属性,当资源库加载时,不必设置这个属性。

目录:这个目录,是指在kettle资源库的目录,当转换或作业保存资源库里设置。当保存为xml文件时,不用设置。

描述:这是一个可选属性,用来设置作业或转换的简短的描述信息。如果使用了资源库,这个描述属性会出现资源库浏览窗口的文件列表中。

扩展描述:也是一个可选属性,用来设置作业或转换的详细的描述信息。

数据库连接:

kettle里的连接和作业使用数据库连接来连接到关系型数据库。kettle数据库连接实际是数据库连接的描述。也就是建立实际连接需要的参数。实际连接只是在运行才建立,定义一个kettle的数据库连接并不真正打开一个数据库的连接。

不幸的是各个连接库的行为都不是完全相同的。

在数据库连接窗口中主要设置下面3个选项:

连接名称:设置一个在作业或转换范围内唯一的名称。

连接类型:从数据库列表中选择要连接的数据库类型。根据选中数据库的类型不同,要设置的访问方式和连接参数设置也不同,某些kettle步骤或作业项生成sql语句时使用的方言也不同。

访问方式:在列表里可以选择的访问方式,一般都使用jdbc连接。不过也可也可以odbc,jndi数据源,oracle的oci连接,使用oracle 命名服各。

根据选择的数据库不同,右侧面板的连接参数设置也不同,例如oracle数据可以设置表空间选项.

一般常用的连接参数如下:

主机名:数据库服务器的主机名或ip地址

数据库名:要访问的数据库名。

端口号:默认是选中的数据库服务器的默认端口号。

用户名和密码:数据库服务器的用户名和密码。

特殊选项:

对大多数据用户来说,使用数据库连接窗口的一般标签的足够了。但偶尔也可能需要设置对话框高级标签的内容。

支持boolean数据类型:对boolean数据类型,大多数数据库的处理方式都不相同。许多数据库根本不支持boolean类型。所以默认情况下,kettle使用一个字段的字段(char(1))的不同值(Y或N)来代替boolean字段,如果选中了这个选项,kettle就会支持boolean类型的数据库生成正确的sql的言。

双引号分割标识符:强迫sql语句里的所有标识符(列名,表名)加双引号,一般用于区分大水上写的数据库,或者你怀疑kettle里定义的关键字列表和实际数据库不一致。

强制转为小写:将所有标识符(表名和列名)转为小写。

强制转为大写:将所有标识符(表名和列名)转为大写。

默认模式名:当不明确指定模式名,默认的模式名。

连接后要执行的sql语句:一般用于建立连接后,修改某此参数,如Session级的变量或调试信息等。

关系型数据库的力量:

关系型数据库是一种高级的软件,它在数据的连接、合并、排序等方面有着突出的优势。和基于流的数据处理引擎,如kettle相比,它有一大优点,数据库使用的数据都存储在磁盘中,当关系型数库进行连接或排序操作时,只要使用这些数据的引用即可,而不用这些数据加载内存里,这就体现出明显的性能方面的优抛。但缺点也是很明显的,把数据加载到关系型数据库里也会产生性能的瓶颈。

对etl开发者而言,要尽可能利用数据库自身的性能优势,来完成连接或排序这样的操作,如数据的来源不同,也应该先在数据库里排序,以便在etl里做连接操作。

连接和事务。
数据库连接只在执行作业或转换时使用。在作业里,每一个作业项都打开和关闭一个独立的数据库连接。转换也是如此,但是因为转换的步骤是并行执行的,每个步骤打开一个独立的数据库开始一个事务。尽管这样的在很多情况下会提高性能,但当不同步骤更新同一个表时,也会带锁和参照完整性问题。

为解决打开多个连接产生的问题,kettle可以在一个事务中完成转换。转换序曲置对话框的选项转换放在数据库事务中,可以完成此功能。当选中了这个选项,所有步骤里的数据库连接都使用同一个数据库连接。只有所有步骤都正确,转换正确执行,才能提交事务,否则回流事务。

表数据库集群的表输入

在上图中,同样的一个查询会被执行五遍,每个数据分区执行一遍,每个数据分区执行一遍。在kettle里,所有使用数据库连接的步骤都可以使用分区特性。例如,表输出步骤在分区模式下会把不同数据输出到不同的数据分区。

工具:kettle里有不同工具,用于etl不同阶段,主要工具如下:

spoon 图形界面工具,快速设计和维护复杂etl工作流。

kitchen:运行作业的命令工具。

pan:运行转换的命令行工具。

carte:轻量级Web服务器,用来远程执行转换或作业,一个运行有cart进程的机器可以作为从服务器,从服务器是kettle集群的一部分。

资源库:

当你的etl项目规模比较大,有很多etl开发人员一起工作,开发人员之间的合作就显得很重要,kettle以插件的方式灵活地定义不同种类的资源库,但不论是哪种资源库,它们基本要素是相同的,这些资源库使用相同的用户界面,存储相同的元数据。目前有3种常见资源库: 数据库资源库、pentaho资源库和文件资源库。

无论资源库都应该具有下面的特性:

中央存储:在一个中心位置存储所有的转换和作业。etl用户可以访问工程的最新视图。

文件加锁:防止多个用户同时修改。

修订管理:一个理想的资源库可惟存储一个转换或作业的所有历史版本,以便将来参考,你可以打开历史版本,并查看变更日志。

依赖完整性检查:检查资源库转换或作业之间的相互依赖关系,可以确保资源库里没有丢失任何链接,没有丢失任务转换,作业或数据库连接。

安全性:安全性可以未授权的用户修改或执行etl作业。

引用:重新组织转换、作业、或简单重新命名,都是etl开发人员的常见工作,要做好这些工作,需要完整的转换或作业的引用。

 

 

 

 

 

 

标签:转换,步骤,数据库,kettle,作业,基本概念,etl
来源: https://blog.51cto.com/u_13887992/2733364

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有