然后详细地介绍了通过 Java 运算符模型描述文件以及 API 来构建 Streams 应用程序的方法,并讨论了 Java 运算符的生命周期与线程安全;之后对 Java 运算符各个层面 Metrics 的监控进行了讨论;最后给出了 Java 运算符的调试方法。本文特别适合流计算应用的">开发人员阅读,对需要了解和设计流计算架构的人员也有很大的参考价值。
IBM InfoSphere Streams( 以下简称 Streams) 是 IBM 于 2009 年推出的具有高可靠性,高可扩展性,分布式流计算平台,前瞻性地把支持每秒 6G 或者每小时 21600G(相当于互联网上所有网页数量之和)数据处理能力作为系统设计的指标,实现了流数据“永恒分析”的能力。它包含一个运行时环境 ( 或者称为实例 ) 和编程模型来简化需要对大批量连续流数据进行提取、过滤、分析以及关联的应用程序的开发,能够广泛的应用于制造、零售、交通运输、金融证券以及监管各行各业的解决方案之中,使得实时快速做出商业决策的理念得以实现。
Streams 应用程序的总体结构如下图所示,是由一系列运算符通过输入 / 输出端口相互连接而构成的。为方便描述,我们首先给出 Streams 应用程序中的一些术语:
流:代表任何来自于数据源的连续数据流,数据的表现形式是由一系列属性构成的元组。 运算符:流数据处理的功能组件,接收一个或多个输入流,对流数据对应的元组和属性进行处理,最终产生一个或多个输出流。 输入端口:用于接收其他运算符输出流的端口。 输出端口:用于产生输出流的端口。 处理元素(PE):Streams 应用程序被物理上分割为的一系列处理单位,一般以动态连接库的形式存在。 运算符融合:一种把多个运算符融合产生一个 PE 的优化技术,以减少数据在多个运算符之间的传输代价。 作业 (Job): Streams 应用程序在 Streams 运行时间上的表现形式。
图 1. Streams 应用程序结构
Java 编程语言作为第三代高级语言,自 20 世纪 90 年代诞生以来,以其使用简单、完全面象对象、平台可移植性、健壮的沙盒安全机制、动态性,以及大量可用的开发包等一系列优势,在互联网分布式环境下得到了极其广泛的应用,几乎涵盖了互联网应用的方方面面。相比较 C++/C++ 程序员,Java 程序员只需关注于业务逻辑的开发,而无需纠结于与系统相关的资源分配与释放等细节,这些琐碎的工作统一由 Java 虚拟机 (JVM) 处理,从而极大地提升了开发效率。由于运行在虚拟机之上,Java 程序与原生的 C/C++ 程序相比,性能上可能略逊一筹,但虚拟机经过几十年的发展与优化,这种差距在逐步缩小。尤其在 CPU 性能大幅提高的今天,这种性能上的差异表现的越来越不明显。
基于上述考虑,Streams 平台提供了使用 Java 编程语言来构建 Streams 应用程序的框架,具体包括 Java 运算符模型描述文件以及 Java 运算符 API 两部分。下图是实现数据库存储功能 DBPersist 运算符的一个具体的例子,图中左半边 xml 通过一系列属性提供了该运算符的模型定义,右半边对应于 Java 类的实现,主要是元组的处理逻辑。在这个具体的例子当中,运算符的 Java 实现除了依赖于自己的 Jar 包之外,还依赖于一些第三方的 Jar 包,这些依赖关系都需要在运算符模型中指定清楚。
图 2. Java 运算符模型以及实现