KETTLE使用经验总结Word格式.docx
《KETTLE使用经验总结Word格式.docx》由会员分享,可在线阅读,更多相关《KETTLE使用经验总结Word格式.docx(40页珍藏版)》请在冰豆网上搜索。
![KETTLE使用经验总结Word格式.docx](https://file1.bdocx.com/fileroot1/2023-2/3/1fda2e70-0d07-48c2-9799-66cd3f0fe270/1fda2e70-0d07-48c2-9799-66cd3f0fe2701.gif)
3.3.安装PDI
地址
3.4.创建资源库
DI可使用文件或资源库的形式来存储作业、转换和其它服务器配置。
使用资源库来存储任务,可以方便地存储和分发作业到不同的服务器执行,实现数据的并发处理。
打开SPOON时,会提示新建资源库;
或者进入主界面后,通过工具>
资源库>
连接资源库,打开资源库连接对话框:
点击左上角“+”按钮,选择Kettledatabaserepository项目,在弹出的资源库信息框中,点新建按钮新建一个数据库连接,选择JDBC连接数据库,并填写连接到数据库的相应信息,该数据库就是存储DI资源的数据库。
然后点击“创建或更新”按钮,在弹出的框中输入管理员密码。
出现一个SQL语句的对话框,点击执行按钮。
这样资源库就创建好了,输入用户名admin和密码登录。
打开用户主目录下的.kettle目录,找到repositories.xml文件,该文件存储了服务器到资源库的数据库连接,将它复制到各服务器用户目录下的.kettle目录下。
如果linux的root目录了下没有.kettle目录,将整个目录拷贝到root下。
3.5.修改配置文件
在data-integration/pwd目录中有几个示例配置文件,它们是DI服务器启动的配置文件。
在主服务器上,修改master配置文件,在<
slaveserver>
段中,修改主机名,端口,用户名和密码等信息,为安全起见,密码需使用Encr.bat或encr.sh加密:
(encr-kettlepassword)(注意:
地址请使用IP,不然其他服务器无法读取)
<
<
name>
master<
/name>
hostname>
ip<
/hostname>
port>
8080<
/port>
<
username>
cluster1<
/username>
password>
Encrypted2be98afc86aa7f2e4a815bb63ca97bd8b<
/password>
master>
Y<
/master>
/slaveserver>
添加<
repository>
段,设置资源库的连接方式:
id>
KettleDatabaseRepository<
/id>
kettle_res<
description>
kettlereposity<
/description>
admin<
Encrypted2be98afc86aa7f2e4cb79ce71da9fa6d4<
/repository>
在从服务器上修改配置文件,需要配置<
masters>
,<
report_to_masters>
段,同样地,需要添加<
段。
/masters>
/report_to_masters>
slave-8081<
8081<
cluster2<
N<
3.6.启动服务器
在data-integration路径下使用master配置文件来启动主服务器,如:
nohup./carte.shpwd/carte-config-master-8080.xml&
使用slave文件启动从服务器
nohup./carte.shpwd/carte-config-slave-8080.xml&
至此:
kettle集群配置完成。
可以使用http:
//localhost:
8080/kettle/getSlaves查看主服务器下子服务器连接情况
4.操作说明
4.1.运行转换/作业
进入主服务器data-integration路径下,使用pan命令提示转换可以使用的参数
然后以pan/trans:
’转换名’的格式运行相应转换,如果使用了资源库,一定要加上/rep、/user、/pass参数。
同理,用kitchen命令来运行作业。
./kitchen.sh-repRE-useradmin-passadmin-dir/GP测试-job作业测试
./pan.sh-repRE-useradmin-passadmin-dir/GP测试-trans-直接输出测试
4.2.转换的并行
kettle运行采用的是流水线的机制(各个步骤并行执行,只要前一个步骤产生了新的内容,后一个步骤就会执行),如果某一个步骤执行比其他步骤缓慢,就会拖累整个转换的执行,可以采用步骤复制来解决这个问题。
首先要保证上一步骤到该步骤数据发送方式为Round-robin(复制模式会导致数据重复)
然后右键该步骤,选择“改变开始复制的数量”,然后输入一个复制数X,代表启用X个线程共同执行这个步骤。
注意:
多线程同时执行会影响数据的排序,如果后面还需要排序(去重、记录集连接等),建议不要复制,因为排序操作会影响整个转换流水线的执行。
4.3.作业的并行
如果作业项之间没有严格的先后关系,也可以并行作业。
在某一作业项上选择“launchnextentriesinparallel”,该项后面的作业项会在该项完成后同时启动执行。
4.4.集群的使用
打开spoon.bat,新建一个转换。
选择主对象树-子服务器,右键新键子服务器:
填写内容与master/slave保持一致,其中主服务器要勾选如上图选项。
所有服务器均建立对应的子服务器后,可以建立集群了。
在主对象树中选择kettle集群schemas,填写schema名称,端口、sokects缓存大小、sockets刷新时间间隔、socketts数据是否压缩。
在右边点击选择子服务器,选择需要的子服务器。
Schema名称即集群的名称。
端口即集群对外服务的端口.sockets缓存大小:
sockets缓存Sockets刷新时间间隔:
达到多少行记录时刷新到子服务器。
Sockets数据是否压缩:
如果网络状况差,则建议选择。
网络良好时不用选择。
相比固定子服务器的集群,使用动态集群可以在部分子服务器出现故障时仍然保证转换正常执行,动态集群只需要在建立时勾选“Dynamiccluster”,并且只选取主服务器即可。
配置完成后,在对应的转换步骤上右键,选择“集群”,再选择已经配置好的集群。
选择然后会发现该步骤多出”CX2”,表示有2个子服务器来执行。
4.5.记录日志
双击空白转换/作业空白处或者右击,选择转换设置,可以打开转换设置窗口,选择日志项进行日志设置。
每一个日志都手动设置比较麻烦,而且不方便统一,可以采用触发器方式自动设置日志,方法如下:
先建立日志库(KETTLELOG)和相关日志表(直接在KETTLE上执行SQL创建,保证表结构和KATTLE日志结构的一致性),然后使用以下Job创建日志触发器:
转换日志触发器:
DELIMITER$$
DROPTRIGGERIFEXISTS`r_trans_log`$$
CREATEDEFINER=`root`@`localhost`TRIGGER`r_trans_log`BEFOREINSERTON`R_TRANS_ATTRIBUTE`
FOREACHROW
begin
--Kettle
转换操作-日志配置触发器
DECLAREv_trans_logvarchar(30)default'
TB_TRANS_LOG'
;
DECLAREv_step_logvarchar(30)default'
TB_TRANS_STEP_LOG'
DECLAREv_performance_logvarchar(30)default'
TB_TRANS_PERFORMANCE_LOG'
DECLAREv_channel_logvarchar(30)default'
TB_TRANS_CHANNEL_LOG'
--数据库连接名(日志)
DECLAREv_database_namevarchar(30)default'
KETTLELOG'
--更新日志表
ifnew.code='
TRANS_LOG_TABLE_TABLE_NAME'
then
setnew.value_str=v_trans_log;
elseifnew.code='
STEP_LOG_TABLE_TABLE_NAME'
setnew.value_str=v_step_log;
PERFORMANCE_LOG_TABLE_TABLE_NAME'
setnew.value_str=v_performance_log;
CHANNEL_LOG_TABLE_TABLE_NAME'
setnew.value_str=v_channel_log;
TRANS_LOG_TABLE_CONNECTION_NAME'
setnew.value_str=v_database_name;
STEP_LOG_TABLE_CONNECTION_NAME'
PERFORMANCE_LOG_TABLE_CONNECTION_NAME'
CHANNEL_LOG_TABLE_CONNECTION_NAME'
endif;
end$$
DELIMITER;
作业日志触发器:
DROPTRIGGERIFEXISTS`r_job_log`$$
CREATEDEFINER=`root`@`localhost`TRIGGER`r_job_log`BEFOREINSERTON`R_JOB_ATTRIBUTE`
DECLAREv_job_logvarchar(30)default'
TB_JOB_LOG'
DECLAREv_job_entry_logvarchar(30)default'
TB_JOB_ENTRY_LOG'
DECLAREv_job_channel_logvarchar(30)default'
TB_JOB_CHANNEL_LOG'
JOB_LOG_TABLE_TABLE_NAME'
setnew.value_str=v_job_log;
JOB_ENTRY_LOG_TABLE_TABLE_NAME'
setnew.value_str=v_job_entry_log;
setnew.value_str=v_job_channel_log;
JOB_LOG_TABLE_CONNECTION_NAME'
JOB_ENTRY_LOG_TABLE_CONNECTION_NAME'
触发器建好后,转换和作业执行时都会有完整的日志记录,可以修改触发器取舍某些日志项。
4.6.连接hbase
2.6.1统一hadoop版本
进入kettle安装目录,路径data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations下
每一个文件夹对应不同的hadoop版本。
kettle以插件的形式对hadoop不同版本进行支持,每个版本的kettle都会有默认支持版本(如kettle5.4支持hadoop2.1,kettle6.1支持hadoop2.3),如果默认版本与hadoop环境的版本不一致,需要对相应jar包进行替换,下面以kettle5.4支持hadoop2.3进行举例说明。
进入hadoop-configurations目录,将hdp22复制一份,改名为hdp23;
清空hdp23\lib\client目录下的jar包;
将Hadoop安装目录下share目录下的所有jar包复制到client目录下(这里为了方便,我直接从kettle6.1对应文件夹下复制jar包);
将hadoop安装目录下的(linux下已经配好的)配置文件复制到hdp23目录下,复制的文件为图中红框部分。
这样一来,kettle就可以支持hadoop的其他版本了。
2.6.2修改配置文件
1、在hdp23目录下config.properties文件中添加hadoop版本号并添加如下一行
authentication.superuser.provider=NO_AUTH
2、在pentaho-big-data-plugin目录下plugin.properties文件中修改hdp选项(要支持哪个hadoop版本就用相应的文件夹名)
3、在C:
\Windows\System32\drivers\etc目录下修改域名映射文件hosts,将hadoop集群的域名与Ip映射关系添加进去
2.6.3修改kettle客户端用户权限
为了避免访问hbase出现权限不足,需要将kettle安装文件的主属修改为和hdfs文件系统主属一致。
在计算机管理里添加用户组,并将当前用户修改为hdfs文件系统用户名,并添加到刚刚建立的用户组中
完成该过程后需要注销并重新登录。
2.6.4连接hdfs
新建一个转换,在“主对象树”中选择“Hadoopcluster”,点击右键选择“NewCluster”,填写相关信息,如下图所示
因为版本5.4还没有提供连接测试,所以只能通过后面操作是否报错来发现问题。
但是kettle6.1以后提供了测试功能,可以直接测试,结果如下图
表明kettle与hadoop连接成功。
2.6.5hbaseinput
首先,在Configurequery页签选择已创建的HadoopCluster集群,
然后切换到第二个页签Createmappings,点击Gettablenames(这里可以看到hbase里的表,说明前面连接成功),选择需要往外读的表,
然后给要建的映射关系命名(如下图的distest),在下方创建映射关系。
说明:
1需要输出的每个列(columnname)都设置别名(Alias);
2必须要有一个字段来存储行健(district_id);
3Type全部选用String
点击svemapping将该映射关系保存到hbase中(pentaho_mappings)。
最切换至标签一,点击getmappedtablenames获取hbase表名,点击getmappingsforthespecifiedtable选择需要使用的映射关系,再点击getkey/fieldsinfo获取映射关系,保存设置。
2.6.6hbaseoutput
Hbaseoutput的设置和Hbaseinput十分类似,仅有以下两个区别:
1配置映射关系时可以直接获取前面步骤输入的字段(getincomingfields);
2配置连结时只需选择映射关系不用再列出具体匹配(区别如下图)
2.6.7注意事项
1,因为hdfs文件系统的权限控制,kettle运行环境(windows客户端或者linux服务器)的权限要与其一致;
2,如果遇到hbase连结通过(Gettablenames能够看到Hbase的表),但是执行时报UnabletoobtainaconnectiontoHBase:
null错误,需要将已保存转换关闭并重新打开,看看该组件是否能正常打开,如果不能,说明是kettle自身组件问题。
(经测试,kettle6.1的hbaseoutput组件存在该问题,设置正常,保存后重新打开转换组件不能打开,报错如下)
4.7.读取XML文件
2.7.1注意事项
使用输入下的XML文件输入(StAX解析)组件来读取XML文件,结构如下
XML文件结构如下
2.7.2拆表
我们读取的XML里面包含多个表的数据,我们需要将他进行拆分,分别取值。
选取流程中的Switch/Case组件,通过对全路径的解析来达到拆分各表数据的目的,
如图,我们把收案和立案信息表和与案实体名录表的信息分别进行输出和处理。
2.7.3筛选与行列转换
获取到各个表的数据之后,我们还需要将它转换为我们我们常见的横表结构,而非现在的字段名一个列,值一个列的竖表结构。
这就需要应用到转换中的列转行组件
如图,这个组件中,关键字段就是我们需要它每行的值转换为新表字段的那一列,分组字段就是通过哪个字段确定哪些数据在新表的同一行。
下方关键字段就是行转列的依据值。
这个组件需要对分组字段进行排序,所以在之前要先有排序组件,再使用筛选组件排除开始结束标签和R标签的干扰。
。
输出结果如下
4.8.连接hive2
因为kettle安装后自带hadoop插件,其中包含了Hive的驱动,所以只需要将pentaho-big-data-plugin的配置文件plugin.properties指向对应的hdp版本即可
然后使用HadoopHive2建立数据库连接
测试通过,如果测试没有通过或者报了驱动问题,可以参考2.6同步hadoop版本
从hive数据库读出数据只需要使用表输入组件即可,写语句的时候注意在表前面加上数据库名,否则会默认取default库取值,
往hive数据库写值用表输出组件即可,但是要注意在数据库字段匹配时hive表显示的字段是带表明的,如图中test.id,这样的话数据无法正常插入Hive表。
解决方法是手动去掉test.字样,只使用hive里的字段名即可。
错误处理:
org.apache.hadoop.ipc.RemoteException:
Permissiondenied:
user=hive,access=WRITE,inode="
/apps/hive/warehouse/zwz_dw.db/test/.hive-staging_hive_2017-02-28_17-16-14_234_2052200583886124766-2"
:
hdfs:
drwxr-xr-x
该错误表明,hive用户不具有写入数据权限,需要将Hive数据源的配置用户改为hdfs,同时将本机的用户改为用户组hdfs下的hdfs用户
4.9.大字段处理
Kettle没有大字段类型,所以大字段需要转换