kettle简介
Kettle是一款免费开源的基于Java的企业级ETL工具,功能强大简单易用,无可抗拒。
kettle有两个比较重要且常用的脚本文件:1)转换(Transformation)和作业(Job),其中转换是对数据处理的容器,包含对数据的各种处理,有多个步骤(Step)组成;作业相对于转换可以配置出更多高级的操作,可以将多个转换组合成一块进行数据处理
kettle的使用方式
1.图形化界面工具(spoon)
上图截取了数据处理的转换脚本,可以看出基于图形化界面操作kettle进行数据处理,只需按照数据处理的流程配置相应的步骤即可,简单易用,但不适合在程序中集成
2.依赖jar包的方式
应用程序集成kettle更多采用的是maven依赖jar包的方式,在jar包依赖之后可以通过两种方式对数据进行处理:
1)通过调用kettle脚本的方式:
在kettle图像化界面配置好脚本(工作或转换),然后通过应用程序加载执行脚本即可完成对数据的处理操作,程序实例如下:
代码语言:javascript复制// 转换脚本路径
String filename = "C:/Desktop/person_import_data.ktr";
// 初始化kettle环境
KettleEnvironment.init();
// new tran的源数据对象
TransMeta transMeta = new TransMeta(filename);
// 创建tran对象
Trans trans = new Trans(transMeta);
// 异常处理
trans.prepareExecution(null);
// 开始执行
trans.startThreads();
// 记录最后一个步骤的数据
final List<RowMetaAndData> rows = new ArrayList<RowMetaAndData>();
RowListener rowListner = new RowListener() {
public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row)
throws KettleStepException {
rows.add(new RowMetaAndData(rowMeta, row));
}
public void rowReadEvent(RowMetaInterface arg0, Object[] arg1)
throws KettleStepException {
}
public void errorRowWrittenEvent(RowMetaInterface arg0,Object[] arg1) throws KettleStepException {
}
};
List<StepMetaDataCombi> steps = trans.getSteps();
String stepname = steps.get(steps.size() - 1).stepname;
StepInterface stepInterface = trans.findRunThread(stepname);
stepInterface.addRowListener(rowListner);
// 等待执行完毕
trans.waitUntilFinished();
if (trans.getErrors() > 0) {
log.error(LogFormatter.toLog(CommonErrorCode.ERR_ERROR, "message"), "transformation of kettle occurred error while extracting data");
throw new BaseRuntimeException(CommonErrorCode.ERR_ERROR);
}
for (int i = 0; i < rows.size(); i ) {
RowMetaAndData rmad = rows.get(i);
String[] fields = rmad.getRowMeta().getFieldNames();
Map<String, Object> map = new HashMap<>();
for (String field : fields) {
map.put(field, rmad.getString(field, null));
}
list.add(map);
}
2)调用kettle的api:通过kettle的api可以模拟步骤(step),脱离图形化界面,下面通过kettle的api模拟了一个表输入步骤,但是通过kettle的api模型步骤,适用常用的步骤,很多步骤在api中是没有的
代码语言:javascript复制//添加数据连接
DatabaseMeta dataBaseInput = new DatabaseMeta("DbInput", dbInfo.getDbType(), "Native", dbInfo.getIp(), dbInfo.getDbName(),dbInfo.getPort(), dbInfo.getUser(), dbInfo.getPassWord());
transMeta.addDatabase(dataBaseInput);
//表输入
TableInputMeta tableInputMeta = new TableInputMeta();
tableInputMeta.setDatabaseMeta(transMeta.findDatabase("DbInput"));
tableInputMeta.setSQL(dbInfo.getSql());
StepMeta inputStep = new StepMeta("table",tableInputMeta);
//inputStep.setLocation(50,50);
inputStep.setDraw(true);
transMeta.addStep(inputStep);
kettle性能分析
在对数据进行同步时,测试了分别在数据库中生成10万、100万、1000万和1亿数据,通过kettle处理入库,观察其性能。性能如下表所示:
数据量(万条) | 同步时间(s) |
---|---|
10 | 3.8 |
100 | 37.5 |
1000 | 620 |
10000 | 5987 |
常见问题
- Kettle连接mysql并不支持目前springboot规定的mysql-connector-java版本(8.0.19),可以用5.1.47版本的驱动解决这个问题
- Oracle可以根据数据库服务名(service_name)和数据库实例名(instance_name,SID)连接数据库,jdbc连接oracle时,可以根据不同的url形式,决定采用service_name还是instance_name进行连接;kettle默认是采用instance_name连接oracle数据库的,如果想要采用service_name连接oracle,则需要在service_name前加上“/”。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184288.html原文链接:https://javaforall.cn