文章
商务智能
作者:Ricardo Giampaoli 和 Rodrigo Ratke
2017 年 1 月
Oracle 已经发布了丰富的云服务产品,包括 Oracle 数据库云服务 (DBCS)、商务智能云服务 (BICS) 以及计划和预算云服务 (PBCS)。
最初的想法是提供一个开发小型项目的环境,通过不断扩展,这些小项目最终可以取代客户的内部环境。拥有优秀的数据库和 BI 工具,而不必在大量基础设施上花费数百万美元,这是一种极具吸引力、广受市场热捧的方案。
事实上,Oracle 的主要目标客户是中小型企业,即让它们能够以极具吸引力的价格创建梦寐以求的 BI 项目。Oracle 正在加大其在云服务产品上的投资,服务器上每个月安装的版本数量以及涌入顾问市场的项目数量佐证了这一点。
唯一与实际不符的是,BI 项目都不简单。对 BI 工具的渴望导致公司将能想像到的一切都放在这个云环境中,而未尊重“小型项目”的初始设想,甚至未考虑最初的环境规格。
其中最大的挑战就是管理客户的期望;除此之外,还需要解决一些技术问题。
由于其宗旨是为中小型企业甚至大型公司中的部门创建小型项目,因此云产品只提供了非常有限的手动集成服务。Oracle 仍在努力完善 ODI 云服务,力争让其能够支持“大型项目”。
但请先等一等。这是真的吗?我们可以通过内部部署环境中的无缝 ODI 集成甚至云端 ODI 来创建“大型项目”吗?
答案是:可以!
这个研究案例涉及一家与 Oracle 签订了一些云服务和 ODI 合同的公司。该公司希望拥有一个 BI 环境,而不必自己搭建内部部署基础设施。事实上,该客户的数据库由几个不同的提供方托管,也就是说其 IT 基础设施的规模非常小。该客户希望能够专注于核心业务,而不是将时间和资金浪费在 IT 基础设施上,因此选择采用这些 Oracle 服务:PBCS、BICS、DBCS 和 ODI。
该项目包括从四个不同的 ERP 收集销售、PNL 和员工数据。这些数据由三种不同类型的数据源提供:SQL Server、Oracle 数据库和文件系统。文件系统数据来自现金出纳机票据,这意味着所有数据都在一个文件中,必须按照特定的顺序进行精简。
这些系统彼此不交互;ETL 需要将它们合并到一个统一的数据集市中,以便全面了解整个公司的情况。这需要将所有数据源整合到 DBCS 中;随后将 PNL、员工和部分销售数据加载到 PBCS 中,从而提供预测计划所需的 Actual 信息。更详细的销售数据应当加载到将在 BICS 中使用的星型模式中。该客户还希望将 PBCS 中的预测数据加载到 BICS 中。
所有这一切都必须在客户的基础设施之外完成,这是一种非常基本的方式(仅使用用户 PC),不需要服务器或数据库。

图 1:理想的设计解决方案
问题是:
我们先来看看所涉及的工具及其局限性。
PBCS 是精简版的 Hyperion Planning,只不过换了个名字,因此可由 Oracle 托管在其服务器上。从本质上说,这个 Hyperion Planning 版本只允许每个实例(云实例)一个应用,是一个使用文件加载或提取数据的独立服务。由于不支持云集成,因此它提供了一些受限的集成方案。
BICS 是 Oracle Business Intelligence 企业版 (OBIEE) 的云端版本。在此之前,BICS 只能访问 Oracle 数据库云中的数据库/模式,但现在可以通过一个新特性来定义外部数据库连接,这样就可以用自己的内部部署数据库构建模型并运行查询。您只需要确保能够通过公共 IP 地址访问数据库即可。如果所讨论的客户有一个内部部署数据库(本例并非如此),那就太好了。
即便如此,此特性也非常有用,因为我们可以在 DBCS 模式中连接 BICS,在我们的环境之间建立第一个集成。现在只需要在 DBCS 中创建 DW 并将其用作 BICS 模式。顺便说一句,由于云服务之间未建立连接,因此 BICS 不能像 OBIEE 那样直接与 Planning 数据库 Essbase 相连。
Oracle 计算云服务适用于需要一个能够全面控制 Oracle 软件安装和设置的云环境的客户。此服务还允许“自带许可”使用任何 Oracle 产品。
DBCS 提供了多种数据加载方式:
| 使用 DBCS 控制台 | 使用 Database Cart | 使用入站 REST 服务 | 使用出站 SOAP 和 REST 调用 API | Oracle Data Sync | |
| 加载方式 | 手动 | 手动 | 程序化 | 程序化 | 程序化 |
| 加载量 | 低 | 高 | 低至中 | 中等(建议分块) | 高 |
| 实施所需的技能 | 基本数据库知识 | 开发人员或 DBA 技能 | REST 和 PL/SQL | PL/SQL | 开发人员或 PL/SQL 技能 |
| 加载期间的验证 | 数据库级完整性 | 数据库级完整性 | PL/SQL 级和数据库级 | PL/SQL 级和数据库级 | PL/SQL 级和数据库级 |
| 一次运行导入多个对象 | 否 | 是 | 是 | 是 | 是 |
表 1:DBCS 加载方案
本案例谈论的 BI 项目每天要从内部部署环境中加载约 20 万行数据,还需要通过高强度的 ETL 作业来合并所有不同的 ERP 数据以及来自 PBCS 的数据 — 所有这些方案均不足以满足此项目的要求:
我们需要通过另一种方案来实现数据集市集成,而这就是 ODI 的用武之地。ODI 为在 SOA、BI 和数据仓库环境中构建、部署和管理以实时数据为中心的架构提供了一个完全统一的解决方案。此外,它还整合了数据集成的所有元素 — 实时数据移动、转换、同步、数据质量、数据管理和数据服务 — 可确保各个复杂系统间信息及时、准确和一致。
这看似不错,但是 ODI 有一个问题:ODI 与云服务之间未建立直接连接 (KM)。
更加深入地了解环境、工具和约束之后,剩下的就是将所有要素整合到一起,打造一个 100% 的云解决方案。但是这个 100% 有个问题,对吧?ODI 是一个内部部署应用,要怎么处理它呢?如何将其迁移至云端?如何使其能够访问所有不同的数据源并将数据加载到所有目标?
我们需要让 ODI 能够在一个集中位置编排整个环境,但是这个集中位置在哪里呢?对于一个 100% 的云来说,这个集中位置也应当在云中,因此我们有三个选择:PBCS、BICS 和 DBCS。
看起来很有希望解决这个问题。如果我们可以将这台机器作为普通 Linux 机器来管理,这意味着我们可以:
DBCS 是我们的集中环境,可以无缝整合一切要素。
请注意,DBCS 提供了四个服务方案:
| 服务 | 理想客户 |
|---|---|
| Oracle 计算云服务 | 适用于需要一个能够全面控制 Oracle 软件安装和设置的云环境的客户。此服务还允许“自带许可”使用任何 Oracle 产品。 |
| Oracle 数据库云 — 数据库即服务 — 虚拟映像 | 适用于需要预安装 Oracle 数据库软件的客户,同时需要能够全面控制环境,但不要求运行 Oracle 数据库。 |
| Oracle 数据库云 — 数据库即服务 | 适用于需要预配置 Oracle 数据库的客户,同时需要能够全面控制环境,随带新的 Oracle 云自动化工具,并且要求运行 Oracle 数据库。 |
| Oracle 数据库云 — 数据库模式服务 | 适用于需要面向 Oracle 数据库和/或基于浏览器的应用的开发和部署平台但不支持 SQL*Net 访问的客户。 |
表 2:Oracle DBCS 服务方案
以上所有方案都可用于构建这个环境,但最后一个除外:Oracle 数据库云 — 数据库模式服务。
完成一切安装和配置后,环境如下所示(图 2)。

图 2:云环境
无论采用何种客户端,核心理念是使用 DBCS 作为云环境的中心;BICS 可以从外部访问它,我们可以配置 VPN 访问外部数据库,配置 SFTP 来管理文件,配置 Samba 方便用户访问日志,甚至可以在数据源获取或放置文件,安装 ODI 代理和 ODI 客户端,等等。
如果可能的话,最好是用一台单独的机器来安装所需的所有工具,但是对于这个项目,客户的预算有限,因此我们需要和 Oracle DB 共用一台机器。与数据库共用一台机器时,用额外的硬盘驱动器来安装工具是一种明智的做法;事实上,最好是用一个 HDD 来安装数据库,用一个 HDD 来存放数据库文件,再用一个 HDD 来安装工具。这样,当数据库发生任何问题时,我们就可以执行完全恢复,而不会影响我们的安装/配置。
即使没有 ODI,您仍然可以从此架构中获益,因为在安装了所有 VPN 之后,您就可以在内部部署架构中使用 DBCS 作为 DB。这样,您就可以使用异构服务访问其他数据库和数据库链接;您还可以创建过程和触发器,甚至可以使用 GoldenGate 在这些环境之间同步数据。
本文不打算介绍如何创建 Oracle 数据库实例、配置备份,等等。我们假设已经完成了让数据库正常运行所需的一切步骤。接下来,我们来谈谈模式和表格设计。
您每租赁一个 PBCS 和 BICS 实例,都会收到一个测试和生产环境。就 DBCS 而言,您会收到一台包含特定配置的机器,您可以配置要使用的内容和使用方式。如果 DBCS 中包含大量配置,您可以创建两个实例,一个用于 DEV,另一个用于 PRD,这些实例将与每个 PBCS 和 BICS 环境相“关联”。
如果不是这样,您可以只有一个实例,将模式拆分成 DEV 和 PRD 模式;这样,当业务在其环境中运行接口和加载数据时,您可以进行开发。
为本案例设计的模式包括一个源 (Source) 区域(加载所有数据库/文件的所有数据源)、一个临时 (Stage) 区域(转换和合并所有数据)和一个 DW 模式(所有数据都将以各自的格式加载)。
我们还为 ODI 信息库提供了两个模式,一个用于主数据库,另一个用于工作/执行信息库。
我们希望创建一个 DEV 和一个 PRD 环境,下表列出了所创建的模式:
| 开发 | 生产 |
|---|---|
| DEV_ODI_MASTERREP | PRD_ODI_MASTERREP |
| DEV_ODI_WORKREP | PRD_ODI_EXECREP |
| DEV_SOURCE_AREA | PRD_SOURCE_AREA |
| DEV_STAGE_AREA | PRD_STAGE_AREA |
| DEV_DW | PRD_DW |
表 3:模式命名
云环境中的 ODI 安装过程与内部部署环境中完全相同:
安装并配置 ODI 之后,接下来该需要进行集成。
由于 BICS 和 PBCS 开发是相同的,因此我们将重点介绍集成方面,主要是 DBCS 与 PBCS 之间的集成,因为 BICS 将直接访问 DBCS。
BICS 集成非常简单,因为它已经实现了与 DBCS 的现成集成,最近也与内部部署数据库实现了集成(前提是内部部署数据库拥有公共 IP)。
要集成 BICS 与 DBCS,请打开 BICS 实例,访问 Console 和 Connections,如图 3 所示:

图 3:BICS 主屏幕
在这里,我们只需设置 DBCS 连接配置:

图 4:BICS 连接配置
您还可以根据需要使用高级选项插入 TNS,但是上述配置对于 BICS 与 DBCS 集成已经足够了。随后,BICS 开发与使用默认数据库相同:
加载到 DW 表中的所有数据都将显示在仪表盘中。此项集成已就绪。
接下来就要开始迎接挑战了。首先,我们先来谈一谈 PBCS。PBCS 提供了两个截然不同的界面:常规界面和简化应用。
常规界面与 Planning 内部部署界面完全相同:它只支持通过导入和导出文件来加载和提取数据及元数据。

图 5:PBCS 导入和导出文件
当您要开始构建应用时,这非常方便,因为您只需要获取一堆 Excel 文件,然后开始加载所有维度和数据,而无需进行任何配置或预设置。但是在集成方面,此特性毫无用处。
简化界面是一个全新的、更现代化的界面,更适合在平板电脑或智能手机上使用,并且还提供了一些新特性。我们需要关注的主要特性是新的收件箱/发件箱,这是与外部世界的唯一联系点。所有要加载的数据都必须先上传到此处,所有要提取的数据也都必须先从此处下载。在 PBCS 中实现流程自动化的步骤如下:
PBCS 还提供了一个作业调度程序,可在 PBCS 上实现流程自动化。如果您只有 PBCS 并且希望实现流程自动化,那么此特性可发挥巨大的作用。但是,我们希望建立一种更加结构化的流程,因为我们有 ODI,我们不需要调度任何作业 — 我们只需要创建导入和导出数据及元数据的作业。
但作业是什么呢?从本质上说,作业是包含操作指令的模板。例如,数据导出作业包含需要导出的数据的 POV。每次运行该作业时,系统都会导出 POV。
我们来看看如何创建一个作业。在 PBCS 中,访问 Console 菜单:

图 6:PBCS Console 菜单
此处提供了创建和监视作业所需的一切。几乎所有数据作业都可以通过点击 Actions 菜单来创建,几乎所有元数据作业都可以通过点击 Dimension 选项卡以及 Export 和 Import 按钮来创建。
我们来看看这些操作:

图 7:在 PBCS 简化界面中导入和导出数据
如图 7 所示,Console 的 Actions 菜单中提供了 Import Data、Export Data 和 Inbox/Outbox Explorer。Import Data 用于创建导入数据作业。
此菜单中的重要选项如下:

图 8:PBCS 导入数据作业
Location:必须设置为 Inbox。如果选择 Local,则不会启用 Save as Job 按钮。(Local 用于手动导入文件。)
Source Type:用于确定文件的格式。Essbase 要求文件格式与我们用于将数据加载到 Essbase 的文件格式相同,这意味着每个计划类型都需要一个文件。Planning 是不同的,因为文件会通过 Planning 加载,而不是直接在 Essbase 中加载。这意味着我们只能使用一个文件将数据加载到所有计划类型。为此,该文件必须具有特定的格式:
| Account | BegBalance | Dec | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Point of View | Data Load Cube Name |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 100000 | 1462.06 | 100 | 110 | 120 | 130 | 140 | 150 | 160 | 170 | 180 | 190 | 200 | 210 | "112001|USD|Actual|Final|FY16" | PNL |
| 200000 | 2462.06 | 100 | 110 | 120 | 130 | 140 | 150 | 160 | 170 | 180 | 190 | 200 | 210 | "112001|PR123|USD|Actual|Final|FY16" | Sales |
| 300000 | 3462.06 | 100 | 110 | 120 | 130 | 140 | 150 | 160 | 170 | 180 | 190 | 200 | 210 | "112001|IC2|USD|Actual|Final|FY16" | WrkForce |
表 4:Planning 导入数据格式
格式非常简单:
这种格式在集成方面非常高效,因为可以轻松创建通用组件按照此格式加载所有来源的所有数据。此外,由于我们对 PBCS 的访问权限并不高,如果可以一次性加载所需的一切,显然要比与系统进行多次交互更好。
File Type:用于设置列分隔符。您可以将其定义为逗号、制表符或者任何其他分隔符。我倾向于使用竖线“|”,因为它不在其他地方使用,且易于辨识。
上面这些就是我们需要关注的重要选项。其他选项都可以保留默认设置,包括文件名,因为我们将使用 EPM Automate 发送文件名。
现在,我们来看看如何创建一个 Export Data 作业。

图 9:PBCS 导出数据作业
创建 Export Data 作业与创建 Import Data 作业没有什么不同。我们仍然需要选择 Outbox 选项,启用 Save as Job 按钮,然后选择要导出数据的多维数据集;这意味着每个计划类型都需要一个导出作业,设置列分隔符和 POV(或 Slice Definition)。
Slice Definition 非常简单。您可以使用替代变量、用户变量以及 Essbase 函数。数据作业现已创建完成。
我们现在来看看如何创建元数据作业。仍然是在 Console 菜单中,单击 Dimensions 选项卡,找到 Import 和 Export 按钮。

图 10:PBCS 导入和导出元数据
创建导入和导出元数据的作业甚至比创建数据作业还要简单。要导入元数据,我们只需选择我们的老朋友 Outbox 选项,启用 Save as Job 按钮,随后插入各个维度的文件名,选择列分隔符,并指示是否需要在元数据加载之前执行 Clear Members。

图 11:PBCS 元数据导入作业
大功告成,接下来我们只需将文件上传至 Outbox,执行此作业即可加载元数据。
PBCS 期望的格式取决于维度类型(Account、Entity、Scenario、Version、Periods、Years 和 User Defined Dimension)
| Account | Entity | Scenario |
|---|---|---|
| Account | Entity | Scenario |
| Parent | Parent | Parent |
| Alias:Default | Alias:Default | Alias:Default |
| Valid For Consolidations | Valid For Consolidations | Data Storage |
| Data Storage | Data Storage | Two Pass Calculation |
| Two Pass Calculation | Two Pass Calculation | Description |
| Description | Description | Formula |
| Formula | Formula | Formula Description |
| Formula Description | Formula Description | UDA |
| UDA | UDA | Smart List |
| Smart List | Smart List | Data Type |
| Data Type | Data Type | Hierarchy Type |
| Hierarchy Type | Hierarchy Type | Enable for Dynamic Children |
| Enable for Dynamic Children | Enable for Dynamic Children | Number of Possible Dynamic Children |
| Number of Possible Dynamic Children | Number of Possible Dynamic Children | Access Granted to Member Creator |
| Access Granted to Member Creator | Access Granted to Member Creator | Allow Upper Level Entity Input |
| Allow Upper Level Entity Input | Allow Upper Level Entity Input | Process Management Enabled |
| Process Management Enabled | Process Management Enabled | Start Year |
| Account Type | Base Currency | End Year |
| Time Balance | Start Period | |
| Skip Value | End Period | |
| Exchange Rate Type | Include BegBal | |
| Variance Reporting | Exchange Table | |
| Source Plan Type |
表 5:PBCS 元数据模板 — 第一部分
| Version | Period | Years | User Defined Dimension |
|---|---|---|---|
| Version | Period | Years | Dimension Name |
| Parent | Parent | Parent | Parent |
| Parent | Parent | Parent | Parent |
| Alias:Default | Alias:Default | Alias:Default | Alias:Default |
| Data Storage | Data Storage | Data Storage | Valid For Consolidations |
| Two Pass Calculation | Two Pass Calculation | Two Pass Calculation | Data Storage |
| Description | Description | Description | Two Pass Calculation |
| Formula | Formula | Formula | Description |
| Formula Description | Formula Description | Formula Description | Formula |
| UDA | UDA | UDA | Formula Description |
| Smart List | Smart List | Smart List | UDA |
| Data Type | Data Type | Data Type | Smart List |
| Hierarchy Type | Hierarchy Type | Allow Upper Level Entity Input | Data Type |
| Enable for Dynamic Children | Allow Upper Level Entity Input | Process Management Enabled | Hierarchy Type |
| Number of Possible Dynamic Children | Process Management Enabled | Enable for Dynamic Children | |
| Access Granted to Member Creator | Type | Number of Possible Dynamic Children | |
| Allow Upper Level Entity Input | Start Period | Access Granted to Member Creator | |
| Process Management Enabled | End Period | Allow Upper Level Entity Input | |
| Version Type | DTS Generation | Process Management Enabled |
表 6:PBCS 元数据模板 — 第二部分
PBCS 允许我们在加载元数据时定义这些属性。这并不意味着我们需要通知它们。基本上,如果您发送一个仅包含成员 (Dimension Name) 和父信息的文件,PBCS 应当能够加载数据并将其他所有属性定义为默认值。
此外,对于每个维度(Year 和 Period 没有此属性,因为它们始终存在于所有计划类型中),我们都可以通知关于该计划类型的一些独有信息。
如果在 PBCS 应用中启用了五种计划类型,那么您将获得的属性是上述属性的五倍,分别针对每种计划类型,并且 (PT) 被计划类型的名称取代。
PBCS 会在您创建应用时自动创建一个 ASO 多维数据集;如果有五种计划类型,那么属性将是上述属性的五倍,另外 ASO 多维数据集也会有相应的属性。PBCS 中的 ASO 多维数据集被视为一种计划类型,因此总共有六种计划类型。
导出元数据的更容易,只需要选择 Outbox 选项,选中要导出的维度,然后选择分隔符类型。大功告成。

图 12:PBCS 元数据导出作业
如果我们执行此作业,PBCS 将在发件箱中创建一个 zip 文件。针对我们选择的每个维度,此 zip 文件中将包含一个 txt 文件。文件名格式为 username_job_name_dimension.txt (ServiceAdmin_ExportedMetadata_Account.txt)。
现在我们来看看如何使用 ODI 集成 PBCS。
在讨论如何使用 EPM Automate 集成 PBCS 之前,我们先来看一看 PBCS 的 DW 架构。本文不会太深入讨论这方面的内容,因为您可以根据自己的需要来设计DW。本文主要展示我们认为更易于维护和生成动态代码的设计。

图 13:PBCS 集成设计
如图 13 所示,我们可以将 ODI 集成环境分为两部分:提供方和 DBCS。在提供方环境中,我们有两个不同的数据库(Oracle DB 和 SQL Server DB)以及 Excel 电子表格和文本文件。由于我们为每个提供方都创建了 VPN,因此我们可以将这些数据库视为同一位置的同一网络中的不同数据库。
PBCS 环境也可以分为两部分:数据库本身以及为了更好地管理 ETL 而创建的所有模式;存放用于向 PBCS 加载或者从 PBCS 提取数据的最终产品的文件系统。文件系统是 ODI 直接控制的最后一道防线。
我们已经完成了 ETL 流程的设计,接下来只需要创建步骤来集成它们;为此,我们需要理解每一个步骤的特点:

表 7:PBSC 数据表设计
元数据表的概念与之相同,只不过用维度取代了属性。表中应当包含每个维度所有可能属性以及两个额外的列 — 分别针对计划类型和维度。
在我们看来,这种方法非常适合在 Planning 或 PBCS 中加载或者从中提取数据和元数据。使用这种方法,我们可以更有效地创建尽可能多的动态对象,并且可以非常轻松地组织入站和出站数据。
接下来,最后一个也是相当重要的一个集成点:EPM Automate。
EPM Automate 实用程序将充当 ODI 与 PBCS 之间的桥梁,并且让我们能够集成 DBCS 与 PBCS(也可以是我们的内部部署数据库)。
使用 EPM Automate 实用程序,服务管理员可以在服务实例中远程执行任务,并且可以自动执行许多重复性任务,包括:
该实用程序使用传输层安全协议 1.2 (TLS 1.2) 保护计算机与服务之间的通信。有关可能的命令的完整参考资料,请访问 docs.oracle.com。
我们现在只需要向 PBCS 发送命令并获取结果。我们需要导入和导出数据及元数据。请记住,本文中的所有四个作业都是在 PBCS 集成会话中创建的。
数据导入:
为了顺利完成数据导入过程,我们应当:
最简单的方法是创建三个脚本,并从 ODI 中的三个不同步骤中调用它们。您可以创建一个可以一次完成所有操作的大脚本,但是三个脚本更灵活,因为我们可以只循环一个步骤(例如,发布业务规则),而会不影响其他脚本。
清理区域脚本:
#PRE BR PBCS Data Import
export JAVA_HOME=/u01/app/oracle/product/java/jdk1.8.0_74
url=$1;
user=$2;
password=$3;
identity=$4;
EPMAutomate_Path=$5;
Job_Name=$6;
File_Name=$7;
DataFeed=$8;
Year=$9;
Period=${10};
PType=${11};
#EPM Automate commands
cd $EPMAutomate_Path
#Login
echo ./epmautomate.sh login $user $password $url $identity
./epmautomate.sh login $user $password $url $identity
#Clear Load Area
echo ./epmautomate.sh runbusinessrule "$PType-ODI_Clear_load_Region"
"vg_Periods=$Period"
"vg_Years=$Year"
./epmautomate.sh runbusinessrule "$PType-ODI_Clear_load_Region" "vg_Periods=$Period"
创建此脚本是为了接收 11 个参数并在命令中替换它们。它会调用 PBCS 中创建的一个业务规则,并将 Period 和 Year 作为参数传递给它。这样,接口就可以在加载之前清理该区域。
所有这些命令在实际运行之前都会运行一个“echo”命令,仅用于记录日志。这样就可以更加轻松地识别脚本执行过程中发生了什么。
首先,我们需要使用 EPM Automate 登录 PBCS。为此,我们需要四项信息:用户、密码、PBCS Url 和 PBCS 身份。由于我们使用 ODI,因此最好是将这些信息存储在拓扑中。我们没有 PBCS 技术,但没关系;我们只需要一个地方存储这些信息,为此选择了 Planning 技术。过程几乎相同:创建一个数据服务器和一个物理模式,并将它们与逻辑模式相关联(正常情况下)。

图 14:ODI PBCS 拓扑配置
通过这些设置,我们可以从 KM 或过程(本例中就是这种情况)内部的拓扑中检索信息。为此,我们只需要从数据源获取信息并将其存储在一些 Java 变量中。

图 15:ODI 过程 PBCS 连接信息
在这些 Java 变量中存储信息之后,我们可以根据需要随时使用它们。现在该调用脚本来传递所有必要的信息了;为此,我们将使用过程中的另一个步骤。

图 16:ODI 过程调用 EPM Automate 脚本
为了调用脚本,我们将使用 OdiOSCommand 命令通知 ERR_File 和 OUT_File;这样一来,我们的文件夹中将包含一个日志和一个错误文件,以及脚本在服务器中的路径、登录信息(所有 java 变量 <@=….@>),此外还有作业名称、时段、年份和我们所需的任何其他信息的变量。此脚本执行以下操作:
大功告成。这就是集成 PBCS、连接和向其发出命令所需的一切。
接下来,我们将继续执行数据加载过程。
清理要加载的区域之后,我们可以加载数据。为此,我使用了以下脚本:
#Import Data to PBCS
export JAVA_HOME=/u01/app/oracle/product/java/jdk1.8.0_74
url=$1;
user=$2;
password=$3;
identity=$4;
EPMAutomate_Path=$5;
Job_Name=$6;
File_Name=$7;
DataFeed=$8;
Year=$9;
Period=${10};
PType=${11};
#EPM Automate commands
cd $EPMAutomate_Path
v #Login
echo ./epmautomate.sh login $user $password $url $identity
./epmautomate.sh login $user $password $url $identity
#Delete Previous Files
echo ./epmautomate.sh deletefile $File_Name.zip
./epmautomate.sh deletefile $File_Name.zip
#Upload PBCS_Data.zip
echo ./epmautomate.sh uploadfile $DataFeed/$File_Name.zip
./epmautomate.sh uploadfile $DataFeed/$File_Name.zip
#Import Data
echo ./epmautomate.sh importdata $Job_Name $File_Name.zip
./epmautomate.sh importdata $Job_Name $File_Name.zip
#Logout
echo ./epmautomate.sh logout
./epmautomate.sh logout
此脚本执行以下操作:
最后,要完成数据加载过程,我们只需要运行其他一些业务规则;为此,我使用了以下脚本:
#POS BR PBCS Data Import
export JAVA_HOME=/u01/app/oracle/product/java/jdk1.8.0_74
url=$1;
user=$2;
password=$3;
identity=$4;
EPMAutomate_Path=$5;
Job_Name=$6;
File_Name=$7;
DataFeed=$8;
PType=$9;
#EPM Automate commands
cd $EPMAutomate_Path
#Login
echo ./epmautomate.sh login $user $password $url $identity
./epmautomate.sh login $user $password $url $identity
#Run BR
echo ./epmautomate.sh runbusinessrule "$PType-ODI_Convert_Currency" "vg_Scenario=Actual"
"vg_Version=Final"
./epmautomate.sh runbusinessrule "$PType-ODI_Convert_Currency" "vg_Scenario=Actual"
"vg_Version=Final"
#Logout
echo ./epmautomate.sh logout
./epmautomate.sh logout
此脚本执行以下操作:
注:这是调用脚本的通用方法,可以从程序包或过程接收业务规则和参数的名称。这意味着,我们可以根据需要循环运行此步骤多次并执行多个业务规则。
元数据导入:
为了顺利完成元数据导入过程,我们应当:
为此,我们需要以下脚本:
#Metadata Import
export JAVA_HOME=/u01/app/oracle/product/java/jdk1.8.0_74
url=$1;
user=$2;
password=$3;
identity=$4;
EPMAutomate_Path=$5;
Job_Name=$6;
File_Name=$7;
DataFeed=$8;
PType=$9;
#EPM Automate commands
cd $EPMAutomate_Path
#Login
echo ./epmautomate.sh login $user $password $url $identity
./epmautomate.sh login $user $password $url $identity
#Delete Previous Files
echo ./epmautomate.sh deletefile $File_Name.zip
./epmautomate.sh deletefile $File_Name.zip
#Upload PBCS_Metadata.zip
echo ./epmautomate.sh uploadfile $DataFeed/$File_Name.zip
./epmautomate.sh uploadfile $DataFeed/$File_Name.zip
#Import Metadata
echo ./epmautomate.sh importmetadata $File_Name.zip
./epmautomate.sh importmetadata $File_Name.zip
#Refresh the Cube
echo ./epmautomate.sh refreshcube
./epmautomate.sh refreshcube
#Logout
echo ./epmautomate.sh logout
./epmautomate.sh logout
此脚本执行以下操作:
就 ODI 而言,我们将使用与之前相同的方法,因为我们只需要调用脚本并传递所需的信息。
数据导出:
为了顺利完成数据导出过程,我们需要提取数据。为此,我们需要以下脚本:
#Export Data from PBCS
export JAVA_HOME=/u01/app/oracle/product/jdk1.7.0_79/
url=$1;
user=$2;
password=$3;
identity=$4;
EPMAutomate_Path=$5;
Job_Name=$6;
#EPM Automate commands
cd $EPMAutomate_Path
#Login
./epmautomate.sh login $user $password $url $identity
#Extract Data
./epmautomate.sh exportdata $Job_Name $Job_Name.zip
#Download Metadata.zip
./epmautomate.sh downloadfile $Job_Name.zip
#Logout
./epmautomate.sh logout
此脚本执行以下操作:
PBCS 足以为我们压缩导出的文件。从 PBCS 下载文件之后,我们需要进行解压缩,然后将数据加载到表中。可以通过简单的 ODI 界面完成此操作。
元数据导出:
为了顺利完成元数据导出过程,我们需要提取元数据。为此,我们需要以下脚本:
#Export Metadata from PBCS
export JAVA_HOME=/u01/app/oracle/product/java/jdk1.8.0_74
url=$1;
user=$2;
password=$3;
identity=$4;
EPMAutomate_Path=$5;
Job_Name=$6;
#EPM Automate commands
cd $EPMAutomate_Path
#Login
./epmautomate.sh login $user $password $url $identity
#Extract Metadata
./epmautomate.sh exportmetadata $Job_Name $Job_Name.zip
#Download Metadata.zip
./epmautomate.sh downloadfile $Job_Name.zip
#Logout
./epmautomate.sh logout
此脚本执行以下操作:
元数据导出与数据导出没有任何区别。PBCS 会将所有文本文件压缩到一个文件中,该文件在下载后可以通过 ODI 界面加载;唯一的区别是,zip 将为每个维度包含一个文本文件,如“PBCS 集成”一节所述。由于我们通常每次都会导出多个维度,因此可以为每个维度创建一个界面,如果采用本文所建议的方法,也可以创建一个包含多个数据源的界面。可以使用一个 UNION ALL 操作符实现此目的。
本文创建了一个 100% 的云解决方案,包含 PBCS、BICS、DBCS 和 ODI,一切要素协同工作并由 ODI 进行编排。当然,这只是演示 ODI 用法的一个简单例子,毕竟 ODI 的可能性是无限的。
当我们开始设计此架构时,我们认为这将是一项挑战;但最终的结果是,这种架构就像使用内部部署工具一样简单。实际上,由于 PBCS 的最终结果只是一些文件,因此可以更轻松地集成到内部部署工具中;具体来说,我们可以将 ODI 移至内部部署环境并让其继续与 PBCS 协同作业。
这赋予了此架构非常高的灵活性 — 灵活性始终是好的。在项目审查过程中,我们安排了五名工作人员(两名负责 PBCS 和 ODI 集成,三名负责 BICS 及其集成)。PBCS 在四个月内完成了测试和交付。本来速度可以更快的,但由于客户根本没有任何结构,我们不得不投入更多的时间来理解如何实现整合。
BICS 开发工作耗时五个月,测试工作耗时两个月。之所以耗时更长,主要是因为对 ERP 数据进行了合并,导致它比 PBCS 规模更大且更加复杂。
未来,我们打算通过更换 EPM Automate 来实现更直接的集成。我们正在研究用一些 ODI KM 来完成此任务,运气好的话,可能很快就会有进展。如果效果不好,我相信 Oracle 很快就会发布适用于 PBCS 的 KM,毕竟 Oracle 正在不断加大云解决方案上的投资。
如果必须指出此环境的任何问题或改进机会,由于所有版本都自动安装在云服务中,因此 ODI 集成可能会产生一些问题。具体在这个项目中,当 Oracle 应用新版本之后,元数据加载过程便会停止运行。这是因为在新路径下,提取的元数据文件中多了两列,因此我们需要更新数据存储以反映这些新列。
除此之外,我们看到的都是这个环境的优点。我们甚至认为它是中小型企业以非常实惠的价格建立非常强大的 BI 环境的一种完美方式;它还可以帮助大型企业将自己的 BI 环境扩展至外部提供商,甚至扩展至客户。
正如我们所说的,可能性是无限的。
Oracle ACE Ricardo Giampaoli 拥有 20 年的 IT 行业经验,过去九年中一直担任 EPM 顾问。作为一位 Hyperion Planning、Essbase、OBIEE 和 ODI 认证专家,Ricardo 是 Oracle EPM 工具的不懈倡导者;Ricardo 通过其博客、客户、Oracle Academy、大学以及与 Oracle 产品管理层的交流,在全球各地积极推进这些工具的应用。
Oracle ACE Rodrigo Radtke 是 Dell 的软件开发顾问,他是一位软件开发经验丰富的计算机工程师,尤其擅长金融 BI 领域。作为一位 Oracle Data Integrator、Oracle SQL Expert 和 Java(SCJP 和 SCWCD)认证专家,他是 Oracle 技术的真正倡导者,致力于通过创新的方式使用 ODI 充分发挥 EPM 的潜力。他与 Ricardo Giampaoli 共同运营了一个博客 (devepm.com),在该博客上分享了各种技术提示和技巧。
本文已经过相关 Oracle 产品团队审查,符合 Oracle 产品使用标准和实践。