使用 InfoSphere Streams 与 Informix

如何设置和连接 Informix CLI 与 IBM Common Driver

本文将介绍如何连接 IBM® Informix® 和 IBM InfoSphere Streams,并将其用作一种数据源或数据目标。本文介绍了特定于 Informix 的协议的使用,以及更常见的 IBM Common Driver 协议的使用,后一种协议供多种 IBM 数据库产品使用。阅读本文之后,读者将能够在流环境中使用 Informix。

Jacques Roy, 技术主管, IBM

Jacques Roy 是 Informix 开发团队的经理,主要负责应用程序开发和数据库可扩展性特性。他拥有超过 29 年的行业经验,自 2001 年以来一直效力于 IBM。Jacques 是著名的 Informix 创作者,撰写了多本书籍、红皮书和 developerWorks 文章。他还经常出席各种年度会议,比如 International Informix Users Group 会议和 IBM Information on Demand 会议。



2013 年 7 月 08 日

简介

如今,大数据几乎无处不在。由于这个主题涉及的范围很广,所以对于我们所讨论的不同数据类型,具体需求也有所不同。例如,我们看到的需求包括利用 InfoSphere BigInsights™ 分析大量非结构化数据,实时处理 InfoSphere Streams,以及利用 Informix TimeSeries 处理基于时间的数据。即使在处理基于时间的数据时,我们也有多种需求(计费、客户查询、分析和实时处理)能够快速响应关键事件。

本文重点介绍了将 InfoSphere Streams 与 Informix 用作数据源或数据目标所需的基本设置。这是允许您整合这些产品的第一步。


Streams 简介

InfoSphere Streams 是一个允许您实时处理数据的软件平台。速度是 Streams 的关键所在。这就是将 Streams 设计为在内存中处理数据的原因。

处理数据流的方法就是将 InfoSphere Streams 附带的运算符或用户创建的运算符连成一串字符。这为处理数据提供了充分的灵活性。

运算符在工具包 中提供。InfoSphere Streams 大约附带了十多种工具包。其中一种工具包称为数据库工具包。该工具包提供了一组访问数据库(包括 Informix)的运算符,并包括以下运算符:

  • DB2SplitDB 确定将输入元组写入已分区的 DB2® 数据库时将会使用的分区。运算符将输入元组提交给对应于分区编号的输出流。
  • DB2PartitionedAppend 将数据写入已分区的 DB2 数据库中指定分区的表中。使用 INSERT 语句向每一个元组的表附加一行。
  • NetezzaLoad 将数据高速加载到一个 Netezza 数据库中。
  • NetezzaPrepareLoad 将传入元组转换为分隔的字符串,可通过该字符串的外部表界面将其写入 Netezza。
  • ODBCAppend 使用 INSERT 将输入流存入 DBMS 表。
  • ODBCEnrich 对每一个输入元组执行 SELECT
  • ODBCRun 执行用户提供的一个通用 SQL 语句。
  • ODBCSource 根据 SELECT 语句的结果生成一个数据流。
  • SolidDBEnrich 根据输入流和 solidDB® 表查询的结果集生成一个数据流。

对于实现我们的目的有帮助的运算符是以 ODBC 开头的。

数据库工具包文档表明,使用 Informix CLI (ODBC) 驱动程序可提供 Informix 11.50。这可能是官方的声明,但我测试后发现,还可以使用 11.70 及其更高版本。此外,还可以通过 DB2 使用的 IBM Common Driver 访问 Informix。这种方法特别有趣,因为它允许应用程序同时访问 Informix 和 DB2。


Informix 简介

Informix 是 IBM 提供的一种可扩展关系数据库产品。许多客户将 Informix 用于任务关健型应用程序。Informix 的其中一些关键特征包括可伸缩性、高可用性和易于管理。Informix 是一种 “设置并自动执行” 类型的数据库。这就使得 Informix 成为了任意规模嵌入式系统的绝佳选择。

Informix 还有其他一些特性,比如支持空间数据和专用的存储,以及处理基于时间的数据。由于产品中内置了存储和访问优化,因此,对于这种类型的数据而言,最后一个特性是作为一个操作型数据存储的理想选择。大多数公用事业公司部署的智能仪表会产生这类数据。许多这样的公司对数据的收集将从每个月收集一次转为每 15 分钟收集一次。这就意味着他们现在可以在 3 小时内产生过去一年内才能收集到的数据(大约是以前数据的 3,000 倍)。这就是大数据,而且 Informix 已经准备好迎接这场挑战。


设置 Informix CLI (ODBC)

Informix CLI 是 Informix Client Software Development Kit (CSDK) 的组成部分。CSDK 也可以单独从 Informix 数据库软件 下载。

设置 Informix CLI 时需要使用以下两个文件:

  • .odbcinst.ini:定义驱动程序实例
  • .odbc.ini:定义数据来源

假设这两个文件位于执行程序的用户的主目录中。请注意,如果使用的是 InfoSphere Streams,则会启动 Streams 实例的用户。您可以使用以下环境变量将这些文件放到其他位置:

  • INFORMIXDIR:安装 Informix CSDK 的位置
  • ODBCINSTINI:.odbcinst.ini 文件的位置
  • ODBCINI:.odbc.ini 文件的位置

清单 1 显示了 .odbcinst.ini 文件的一个示例。该示例假设 Informix CSDK 的安装位置为 /opt/IBM/informix。

清单 1. .odbcinst.ini 内容示例
[INFORMIX]
Driver=/opt/IBM/informix/lib/cli/iclit09b.so
Setup=/opt/IBM/informix/lib/cli/iclit09b.so
APILevel=1
ConnectFunctions=YYY
DriverODBCVer=03.51
FileUsage=0
SQLLevel=1
smProcessPerConnect=Y
[ODBC]
Trace=No
TraceFile=/tmp/odbc.out

该示例中的重要部分是 Driver 条目,它指出了程序查找所需共享库的位置。

.odbc.ini 文件提供了该系统上可用的有关数据源的信息。

清单 2. .odbc.ini 内容示例
[ODBC Data Sources]
DBCustomer=INFORMIX
 
[DBCustomer]
Driver=/opt/IBM/informix/lib/cli/iclit09b.so
Description=IBM INFORMIX ODBC DRIVER
Database=stores
LogonID=informix
pwd=in4mix
Servername=ol_ifmx1170

第一节定义该文件中定义的不同数据源所使用的驱动程序。在我们的示例中,仅有一个数据源,而且该数据源使用的是 .odbcinst.ini 中定义的 Informix 驱动程序。

请注意,Servername 参数指的是默认名称为 $INFORMIXDIR/etc/sqlhosts 的文件中发现的名称,该文件定义可用的服务器以及与这些服务器的通信方式。

使用 Informix 对 Streams 进行其他设置

搭建好 Informix CLI 环境之后,需要为 InfoSphere Streams 设置其他三个环境变量。同样,我们假设 CSDK 的安装位置为 /opt/IBM/informix:

  • STREAMS_ADAPTERS_ODBC_IDS=1(表示正在使用 Informix)
  • STREAMS_ADAPTERS_ODBC_INCPATH=/opt/IBM/informix/incl/cli(查找包含文件的位置)
  • STREAMS_ADAPTERS_ODBC_LIBPATH=/opt/IBM/informix/lib(查找 Informix 库的位置)

将 Streams Programming Language (SPL) 程序编写为可执行的二进制文件时会用到这三个环境变量。


设置 IBM Common Driver

应用程序也可以使用 IBM Common Driver 将 ODBC 和 CLI 与 Informix 连接。Informix 安装包中包括这个驱动程序和其他 IBM Common Driver。您还会发现这也是 Informix CSDK(撰写本文时版本为 V9.7 修订包 5)的组成部分。

安装过程极其简单:前面提到的 CSDK 包含一个名为 IBM_Data_Server_Driver_Package 的目录,在该目录中可以找到类似 v9.7fp5_linuxx64_dsdriver.tar 的文件。只需将文件解压到安装驱动程序的目录,就会创建一个名为 dsdriver 的目录。然后执行 installDSDriver 脚本。驱动程序的主目录是 dsdriver 目录。

搭建一个连接环境与之前看到的环境类似。搭建环境的方式有很多种。我们在此处使用的是 db2cli.ini 文件。文件位置是用 DB2CLIINIPATH 环境变量设置的。清单 3 显示了该文件的一个内容示例。

清单 3. db2cli.ini 内容示例
[DBCustomer]
uid=informix
pwd=in4mix
autocommit=0
Database=stores
Protocol=tcpip
hostname=streamslab
Servicename=23509

在本例中,我们已经连接到了 streamlab 上使用端口 23509 的 Informix 数据库存储区。我们使用的用户名是 informix,密码是 in4mix

使用通用驱动程序对 Streams 进行其他设置

在 Informix CLI 一节中,我们看到还需要为 InfoSphere Streams 设置其他一些变量:

  • STREAMS_ADAPTERS_ODBC_DB2=1(表示正在使用 IBM 通用驱动程序)
  • STREAMS_ADAPTERS_ODBC_INCPATH=/opt/IBM/informix/dsdriver/incl/cli(查找包含文件的位置)
  • STREAMS_ADAPTERS_ODBC_LIBPATH=/opt/IBM/informix/dsdriver/lib(查找 IBM Common Driver 库的位置)

从 Streams 中读取 Informix

要想读取数据库数据,可使用数据库工具包函数 ODBCSource。该程序还需要一个定义可用连接的文件:connections.xml。清单 4 显示了我们的示例中读取 Informix 时的连接规范。

清单 4. connections.xml 内容示例
<st:connections xmlns:st="http://www.ibm.com/xmlns/prod/streams/adapters"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<connection_specifications>

<connection_specification name="DBCustomer" >
    <ODBC database="DBCustomer" user="informix" password="passw0rd" />
</connection_specification>

</connection_specifications>

<access_specifications>

<access_specification name="Customer">
    <query query="SELECT fname FROM customer" replays="1"
          isolation_level="READ_COMMITTED" />
    <parameters></parameters>
    <uses_connection connection="DBCustomer" />
    <native_schema>
        <column name="fname" type="CHAR" length="15" />
    </native_schema>
</access_specification>

</access_specifications>

</st:connections>

本例通过数据源 DBCustomer 使用了 Informix CLI 设置。该数据源定义了名为 Customer 的访问规范,包括要执行的 SELECT 语句。有关这个 XML 文件定义的更多信息,请查看 Streams 文档(参阅 参考资料)。

下面是一个简单的 SPL 程序,该程序从数据库中读取数据,并将结果写入标准输出。

清单 5. SPL 程序示例 (ReadFname.spl)
use com.ibm.streams.db::*; // make operators from the database toolkit available

composite ReadFname {
graph
  stream <rstring fname> Names = ODBCSource() { // return a stream called Names
    param
       connection : "DBCustomer"; // Identify the connection to use
       access : "Customer"; // identify the statement to execute
       connectionDocument : "connections.xml"; // identify the connections definition file
  }
() as Sink = Custom(Names) {
      logic onTuple Names : printStringLn(fname);
  }
}

如果想使用 IBM Common Driver,只需更改环境变量并重新编译程序即可。


从 Streams 写入 Informix

在本例中,我们使用 ODBCAppend 运算符将数据 INSERT 一个表中。我们使用上一个示例的输出插入一个名为 target 的新表。该表只有一个名为 fname 的列,与输入表中列的定义匹配。

我们需要修改 connections.xml 文件。下面突出显示的部分为修改后的内容。

清单 6. 全新的 connections.xml 版本
<st:connections xmlns:st="http://www.ibm.com/xmlns/prod/streams/adapters"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<connection_specifications>

<connection_specification name="DBCustomer" >
<ODBC database="DBCustomer" user="informix" password="passw0rd" />
</connection_specification>

</connection_specifications>

<access_specifications>

<access_specification name="Customer">
<query query="SELECT fname FROM customer"
          replays="1" isolation_level="READ_COMMITTED" />
  <parameters></parameters>
  <uses_connection connection="DBCustomer" />
  <native_schema>
    <column name="fname" type="CHAR" length="15" />
  </native_schema>
</access_specification>

<access_specification name="Target">
  <table tablename = "target" transaction_batchsize="100" rowset_size="10" />
  <uses_connection connection="DBCustomer" />
  <native_schema>
    <column name="fname" type="CHAR" length="15" />
  </native_schema>
</access_specification>


</access_specifications>

</st:connections>

现在,只需将 SPL 程序的 Custom 运算符替换为 ODBCAppend 运算符即可。

清单 7. 修改后的 SPL 程序 (RwFname.spl)
use com.ibm.streams.db::*; // make operators from the database toolkit available

composite RwFname {
graph
  stream <rstring fname>  Names = ODBCSource() { // return a stream called Names
    param
       connection : "DBCustomer"; // Identify the connection to use
       access : "Customer"; // identify the statement to execute
       connectionDocument : "connections.xml"; // identify the connections definition file
  }
  () as Sink = ODBCAppend(Names) {
      param
       connection : "DBCustomer"; 
       access : "Target"; 
       connectionDocument : "connections.xml"; 
  }
}

如上所述,使用一个驱动程序或其他驱动程序只需更改环境变量并重新编译即可。这就为您从一个驱动程序轻松迁移到另一个驱动程序提供了灵活性。如果认为一个驱动程序比另一个更好使用的话,这为您提供了一种选择。


结束语

InfoSphere Streams 可以补充 Informix 的功能。Informix 也可以通过提供有效的永久存储器补充 Streams 的实时功能,这些功能也可用来补充流处理。凭借 TimeSeries 的功能,Informix 为基于时间的数据处理需求提供了一种独特的解决方案。对于那些对相同数据既有实时数据处理需求又有操作数据存储需求的许多客户来说,InfoSphere Streams 和 Informix 可能是一个理想的解决方案。

参考资料

学习

获得产品和技术

  • 现在,您可以免费使用 DB2。下载 DB2 Express-C,这是一个面向社区的 DB2 Express Edition 免费版本,可提供与 DB2 Express Edition 相同的核心数据功能,并为构建和部署应用程序提供了一个坚实的基础。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=936813
ArticleTitle=使用 InfoSphere Streams 与 Informix
publish-date=07082013