一,目的

在学习的过程中,需要用到 PDI---一个开源的ETL软件。主要是用它来设计一些转换流程来处理数据。但是,在PDI中设计好的 transformation 是在本地的执行引擎中执行的,(参考源码中的 Trans.java ),现可以对DI加以改造:在DI中设计的转换,将之转换成Storm的Topology,然后再把该Topology提交到Storm集群中执行。这样,既可以利用DI强大的设计能力(因为在DI中可以设计各种各样的转换流程,这些用DI设计出来的 transformation流程是前人已经实现好的数据处理功能,把该 transformation 转换成 Storm Topology 可以避免自己编写实现数据处理功能的Storm Topology 代码);又可以利用Storm的分布式实时流处理数据的能力。

在Pentaho Lab 官网上有一个相应的开源项目,但是貌似已经不再更新了。参考: kettle-storm 的 github以及 相关介绍

二,实现概述

①Storm 端的运行流程:

不管在DI中设计了何种转换,将转换 转化成 Storm 的Topology时,都只得到两种类型的Topology,即输入拓扑和处理拓扑。提交Topology的代码如下:

 StormSubmitter.submitTopology(basictopo.getName(), config, basictopo.getInputTopology());//commit inputtopology
StormSubmitter.submitTopology(basictopo.getName(), config, basictopo.getProcessTopology());//commit processtopology

②PDI中的转换设计

一个典型的转换如下图:图片来源

设计好一个这样的转换流程图后,在运行该转换前,需要将设计好的转换保存成一个 .ktr 文件,PDI从该.ktr 文件中解析出 transMeta 对象,(transMeta对象 代表运行过程中的 某个转换)。transMeta对象记录了整个转换过程中需要的所有信息。而我们的目标就是将上图中的设计的transformation 自动 变成 Storm的Topology。从而,可以在Storm中执行如上图所示的 transformation了。

③transformation 到 Topology 的变换

由上图设计的转换可以看出,它是一个有向无环图。而Storm的Topology也是一个DAG图,因此可以通过算法将 transformation 变成 Topology。

三,细节及遇到的问题

❶transMeta 对象不能直接序列化,如何在Storm集群中获得transMeta对象,然后根据该对象构造Topology?

主要用 .ktr 文件 来生成 TransMeta对象。当在本地运行时,TransMeta对象代表整个转换的执行,但当提交到集群中时,本地执行过程中的transMeta对象不可能直接提交到集群中去的。需要将之序列化,再发送到集群中。而,每个 .ktr文件就代表了一个转换,因此可以直接将 .ktr 文件打包上传到集群中,然后再解析jar包中的 .ktr 文件来生成 构成 InputSpout 和 Bolt 所需的transMeta 对象。关于序列化知识,可参考

InputSpout 解析transMeta对象:

URL fileURL = this.getClass().getResource("/test-random.ktr");
ktrFile = fileURL.toString();
transMeta = new TransMeta(ktrFile, (Repository) null);

TransactionalBolt解析transMeta对象:

InputStream inputStream = this.getClass().getResourceAsStream("/test-random.ktr");
if(transMeta == null )
{
try{
KettleEnvironment.init();
transMeta = new TransMeta(inputStream, (Repository)null, true, null, null);
}catch(Exception e){
e.printStackTrace();
e.getMessage();
}
}

遇到了一个奇怪的问题:即InputSpout中解析transMeta对象是在本地完成的,也即在Topology的main函数所在的类执行时完成的。而TransactionalBolt.java中解析transMeta对象是在将Topology提交到集群上之后,在集群上执行时去读取 .ktr 文件并解析transMeta对象。

因此,InputSpout.java中读取 .ktr 文件解析transMeta对象时,是按照文件流的形式读取的。而在把Topology提交到集群后, .ktr 文件是随着Topology的jar包一起打包提交的,因此读取jar包中的 .ktr文件。

❷Storm执行Topology时需要依赖DI中的jar包,依赖包问题如何解决?

将DI的执行引擎换成了Storm执行引擎,但不管是什么执行引擎,执行的代码还是会依赖PDI的lib目录下的一些依赖包。比如,PDI连接数据库时需要一个 mysql-connector-java-5.1.26.jar ,当把从 transformation中生成的Topology提交到Storm集群时,若transformation中有访问数据库的操作且storm 安装目录下的 lib 目录下没有相应的jar包时,Topology会执行失败。因此需要将mysql-connector-java-5.1.26.jar 复制到 storm 安装目录下的 lib 目录中。同理,其他的一些依赖jar包都需要复制到 storm 安装目录下的 lib 目录中。依赖的包如下:

metrics-core-2.2.0.jar
scala-library-2.11.5.jar
kafka_2.11-0.8.2.0.jar
esapi-2.0.1.jar
source.jar
etl-core-5.0.jar
kafka-clients-0.8.2.0.jar
mysql-connector-java-5.1.26.jar
zookeeper-3.4.6.jar
commons-vfs-20100924-pentaho.jar

❸Topology的构造需要依赖transMeta对象,进而需要依赖DI源码中的 .class 文件,如何正确打包 storm.jar 并自动提交(不是通过命令行 运行 storm jar 进行提交)?

命令行的storm jar 命令是Python 脚本实现的,它完成的功能主要是设置环境变量(将jar文件的路径设置成 "storm.jar" 环境变量STORM_JAR)并打包成jar文件,该部分功能可以在主类中实现,从而不需要在命令行运行 storm jar 命令进行Topology的提交。

在具体的学习中,直接把整个工程的 bin 目录下的所有编译好的文件都打进jar包,这样可以解决Topology运行时依赖DI中的代码而报的 java.lang.NoClassDefFoundError 错误。但是,这样做使得需要提交的jar包非常的大!

四,缺点

由于PDI中转换中的许多插件都不是针对分布式环境而设计的,因此,在PDI中设计的部分 transformation 是不能正常运行在 Storm之上的,可参考Pentaho Lab中关于Kettle On Storm的描述。

其次,PDI中已有的一些插件不能满足大数据集群的需求,需要重新开发新的PDI插件。

Storm Topology 提交 总结---Kettle On Storm 实现的更多相关文章

  1. STORM_0005_第一个非常简单的storm topology的提交运行

    配置好storm之后就可以开始在eclipse里面写topology了. 下面是我在网上搜到的一个简单的例子,我按照自己的理解注释了一下. 第一步,创建mvn工程 这是pom.xml文件 <pr ...

  2. Storm编程入门API系列之Storm的Topology默认Workers、默认executors和默认tasks数目

    关于,storm的启动我这里不多说了. 见博客 storm的3节点集群详细启动步骤(非HA和HA)(图文详解) 建立stormDemo项目 Group Id :  zhouls.bigdata Art ...

  3. Storm编程入门API系列之Storm的Topology多个Workers数目控制实现

    前期博客 Storm编程入门API系列之Storm的Topology默认Workers.默认executors和默认tasks数目 继续编写 StormTopologyMoreWorker.java ...

  4. Storm编程入门API系列之Storm的Topology多个Executors数目控制实现

    前期博客 Storm编程入门API系列之Storm的Topology默认Workers.默认executors和默认tasks数目 Storm编程入门API系列之Storm的Topology多个Wor ...

  5. Storm编程入门API系列之Storm的Topology多个tasks数目控制实现

    前期博客 Storm编程入门API系列之Storm的Topology默认Workers.默认executors和默认tasks数目 Storm编程入门API系列之Storm的Topology多个Wor ...

  6. Storm编程入门API系列之Storm的Topology的stream grouping

    概念,见博客 Storm概念学习系列之stream grouping(流分组) Storm的stream grouping的Shuffle Grouping 它是随机分组,随机派发stream里面的t ...

  7. storm入门(一):storm编程框架与举例

    基础 http://os.51cto.com/art/201308/408739.htm   模型 http://www.cnblogs.com/linjiqin/archive/2013/05/28 ...

  8. Learning storm book 笔记8-Log Processing With Storm

    有代码的书籍看起来就是爽,看完顺便跑个demo,感觉很爽! 场景分析 主要是利用apache的访问日志来进行分析统计 如用户的IP来源,来自哪个国家或地区,用户使用的Os,浏览器等信息,以及像搜索的热 ...

  9. Storm编程入门API系列之Storm的定时任务实现

    概念,见博客 Storm概念学习系列之storm的定时任务 Storm的定时任务,分为两种实现方式,都是可以达到目的的. 我这里,分为StormTopologyTimer1.java   和  Sto ...

随机推荐

  1. [转帖]super-inspire

    quickStart/快速开始 访问临时服务器地址, 你可以在这里选择一个喜欢的系统, 然后系统将自动创建该系统的容器, 并自动打开新的网页进入 web shell 交互. 目前支持 Ubuntu14 ...

  2. super 使用以及原理

    用super也很久了,但是一直没有关注过他的原理.最近开始越来越多关注python更底层的实现和奇技淫巧.看到该方法越发使用得多所以也研究了一波 平时单继承可能是我们遇到最多的情况.无非就是类似情况. ...

  3. PostgreSQL、SQL Server数据库中的数据类型的映射关系

    PostgreSQL 8.1 轰动发布,我也打算将原来使用 SQL Server 的一些应用迁移到 PostgreSQL 上,首先需要迁移的是表,那么这就必须要先搞清楚这两个数据库中的数据类型的映射关 ...

  4. JTextPane或JTextPane设置了滚动条,文本增加后,滚动条自动下滑,追加文本的例子

    http://zhizaibide1987.iteye.com/blog/1012955 https://zhidao.baidu.com/question/2116908942184706107.h ...

  5. BZOJ4650 NOI2016优秀的拆分(后缀数组)

    显然只要求出以每个位置开始的AA串数量就可以了,将其和反串同位置的结果乘一下,加起来就是答案.考虑对每种长度的字符串计数.若当前考虑的A串长度为x,我们每隔x个字符设一个关键点,求出相邻两关键点的后缀 ...

  6. Sightseeing tour HDU - 1956(混合欧拉回路)

    题意: 有n个点,m条边,其中有单向边和双向边,求是否存在欧拉回路 解析: 刚开始想...判断一下每个点的度数不就好了...emm..还是年轻啊.. 判断是解决不了问题的,因为可能会有某两个点冲突,比 ...

  7. 矩阵游戏 HYSBZ - 1059(最大流)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6266  Solved: 3065[Submit][Stat ...

  8. 03 Zabbix4.0添加cisco交换机基本监控步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 03 Zabbix4.0添加cisco交换机基本监控步骤 主题监控一台cisco网络设备的6项内容 ...

  9. 自学Linux Shell14.2-在脚本中使用其他文件描述符

    点击返回 自学Linux命令行与Shell脚本之路 14.2-在脚本中使用其他文件描述符 在脚本中重定向输入和输出,并布局限于以上讲的3个默认的文件描述符,shell最多可以有9个打开的文件描述符.这 ...

  10. 洛谷 P3853 路标设置 解题报告

    P3853 路标设置 题目背景 B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离.为了便于研究这个问题,我们把公路 ...