您看收集社交数据,利用众多存储选项将其存储在 BigInsights 中,包括分布式文件系统和存储引擎,比如 HBase。
图 5. BigInsights 分布式文件系统和存储引擎
基于文本的社交媒体帖子存储在 BigInsights 中后,您需要提取感兴趣的信息,以便可在以后轻松地为其建立索引和探查。BigInsights 提供了复杂的文本分析功能,帮助您提取与产品相关的态度和提取社交媒体用户概要信息。下图显示了从社交媒体提取实体和态度的输出片段,突出显示了这次实体 提取的一些重要字段,包括 Category、Brand、Product、Source、IsSentiment、IsCustomerOf、Polarity、Created Time、FullName、Screenname、UserID 和 Text。
图 6. Tweet 上的产品态度
计和管理您的应用程序实体模型
拥有从上一节的 BigInsights 文本分析中提取的实体信息后,您就可以设计 Data Explorer 实体模型了。
这一节介绍将在解决方案中考虑并设计到您的实体模型中的一组元素。此过程将确保您的应用程序解决方案能够满足您的业务分析师的需求,提供可扩展的大数据搜索环境所需的访问和探查模式。我们将简要介绍一下这个设计过程中的步骤,稍后将更详细地分析它们:
确定您感兴趣的一组重要的业务实体和关系,以支持 Data Explorer 中的进一步搜索和探查,并在这些业务实体分散在各处时识别各种来源。
在您场景的实体模型中捕获这些实体和关系。
确定您的 Data Explorer 集群的可伸缩性,将这些规范设计到您的实体模型中。这些规范将确定您的 Data Explorer 部署的可伸缩性。
将您的实体模型部署到 Zookeeper 集群中,以实现配置设置的集中化管理。
确定一组重要的业务实体和关系,以构建上下文信息
在我们的示例场景中,我们积累了关于现有客户和我们的产品的内部数据。这些数据存储在一个关系 DBMS 中。此外,我们还收集了一些社交 tweet,使用 BigInsights 文本分析提取了用户对我们的产品的态度。我们的业务分析师可能希望获取一个更全面的视图,以便了解客户如何认知我们的产品和我们的产品在整体市场中的知名 度。将企业和社交媒体数据相结合,可为我们的业务分析提供更有用的洞察。我们发现,业务分析师将对以下实体很感兴趣:
从 BigInsights 中的社交数据提取的用户对产品的态度
存储在一个关系数据库中的产品数据
存储在一个关系数据库中的在线客户
同样重要的是,需要为业务分析师提供正确的上下文信息。为实现此目标,您需要定义实体之间的一组关系。关系是一个重要元素,Data Explorer Application Builder 使用它链接实体之间的交互,提供了构建上下文信息的重要好处。例如,在我们的场景中,我们需要捕获 tweet 与特定用户(客户)有关联以及一些 tweet 可能与产品相关的事实。
在实体模型中捕获这些实体和任何重要关系
Data Explorer 实体模型为 XML 格式。可使用您选择的 XML 编辑器来为该实体模型创建一个新文件:
添加实体 sentiment:
将 sentiment 实体添加到实体模型中的代码段类似于下面的清单。它包含一些字段的附加信息,我们希望捕获这些信息,让它们可用在 Data Explorer Application Builder 可构建的搜索应用程序中。
清单 1. 实体 sentiment 的定义
<entity-definition default-searchable="true" identifier="@hash" name="tweet" store-name="tweet-search-store"> <field external-name="Category" name="Category" /> <field external-name="Brand" name="Brand" /> <field external-name="Product" name="Product" /> <field external-name="IsSentiment" name="IsSentiment" /> <field external-name="Polarity" name="Polarity" /> <field external-name="CreatedTime" name="CreatedTime" /> <field external-name="Screenname" name="Screenname" /> </entity-definition>
添加实体 products:
将 product 实体和相关字段添加到实体模型中的代码段类似于下面的清单:
清单 2. 实体 product 的定义
<entity-definition default-searchable="true" identifier="@hash" name="product" store-name="product"> <field external-name="BRAND" name="BRAND" /> <field external-name="PRODUCT_NUMBER" name="PRODUCT_NUMBER" /> <field external-name="PRODUCT_BRAND_CODE" name="PRODUCT_BRAND_CODE" /> <field external-name="PRODUCT_DESCRIPTION" name="PRODUCT_DESCRIPTION" /> </entity-definition>
添加我们的实体之间的必要关系:
关系是一个重要的元素,Data Explorer Application Builder 使用它链接实体之间的交互,并提供构建上下文信息的重要好处。以我们的场景为例,我们可能希望捕获一些 tweet 与产品相关的事实。关系定义可能类似于下面的清单:
清单 3. 关系的定义
<entity-definition default-searchable="true" identifier="@hash" name="product" store-name="product"> ... <association-definition name="feedback" to="FEEDBACK_TYPE"> <link from-field="BRAND" fuzzy="false" to-field="Brand" /> </association-definition> </entity-definition>
提供您的 Data Explorer 集群的拓扑结构规范
指定 Data Explorer 的集群集合存储:
识别感兴趣的实体和关系后,需要构建一个索引来支持搜索、发现和分析。为此,您需要为此索引指定一种存储机制,即一个集合存储。对于涉及 BigInsights 的用例,比如我们的场景,我们希望使用一个集群集合存储。它是 Data Explorer 支持的集中集合存储类型之一。选择该集群集合存储类型,将使 Data Explorer 引擎能够利用一个机器集群来水平扩展,从而处理 BigInsights 数据的更大规模索引。
下面的代码段展示了如何指定集群集合存储,以便为来自 BigInsights 的社交数据建立索引。另一个表示来自关系 DBMS 的数据的实体将使用更加典型的单一集合。
清单 4. BigInsights 数据的集群集合存储
<cluster-collection-store activity-collection="false" collection-name="tweet-search-store" monitor-activities="false" name="tweet-search-store" base-collection="default-push" n-shards="2" /> <collection-store activity-collection="false" collection-name="gssdb-product" monitor-activities="false" name="product" />
指定您的 Data Explorer 集群的可伸缩性:
向搜索应用程序添加分片 (shard),允许对数据进行水平分区,尤其是在这些分片分散在多个物理 Data Explorer 实例上时。在处理大量数据时,总体性能将会提升,因为索引和搜索操作分布在一个集群环境中。我们重用了上面的实体模型示例,在集群集合存储中指定一些分 片,将它们分散在两个不同的物理 Data Explorer 实例上。
清单 5. 指定 BigInsights 数据的可伸缩性
<velocity-instance url="http://velocity1.domain.com:9080/vivisimo/cgibin/ velocity?v.app=api-soap&wsdl=1&use-types=true&" username="api-user" password="password"> <serves name="tweet-search-store" shard="1" n-shards="2" port="9081" /> <serves name="tweet-search-store" shard="2" n-shards="2" port="9082" /> </velocity-instance> <velocity-instance url="http://velocity2.domain.com:9080/vivisimo/cgibin/ velocity?v.app=api-soap&wsdl=1&use-types=true&" username="api-user" password="password"> <serves name="tweet-search-store" shard="1" n-shards="2" port="9081" /> <serves name="tweet-search-store" shard="2" n-shards="2" port="9082" /> </velocity-instance>
使用 ZooKeeper 管理您的 Data Explorer 实体模型
Data Explorer 使用 ZooKeeper 管理您应用程序的实体模型。Zookeeper 是一个集中化的服务,用于维护配置信息,提供分布式同步功能,以及提供分组服务。现在我们已经定义了我们的应用程序实体模型,我们需要通过上传到 ZooKeeper 集群将它提供给应用程序。应用程序将使用这个集群配置来发现所使用的部署拓扑结构:
将您的实体模型上传到 ZooKeeper 集群:
设置您的 ZooKeeper 集群后,您可以将您的 Data Explorer 应用程序实体模型 上传到这个 ZooKeeper 集群并使用它进行管理。Data Explorer BigIndex API ZIP 文件的 lib 文件夹中包含的 bigindex JAR 是一个可执行文件,可用作一个基本的命令行工具,在 ZooKeeper 中上传和管理实体模型。该命令行的用法如下所示。
清单 6. 将实体模型上传到 ZooKeeper 集群
java -jar bigindex-2.0.0.jar --properties-file zookeeper.properties --import-file scenario_entity_model.xml --export-to-screen --legacy-model
请注意,如果使用 Data Explorer Application Builder 管理 UI 来管理应用程序实体模型,可以跳过上面的步骤,将您的应用程序指向 Data Explorer Application Builder 所使用的相同的 ZooKeeper 服务器实例和命名空间。您可以在 IBM/IDE/AppBuilder/wlp/usr/servers/AppBuilder/apps/AppBuilder/WEB-INF/config 的 zookeeper.yml 中找到所使用的 ZooKeeper 配置的更多细节。
使用 Data Explorer 开发您的第一个 BigInsights 索引应用程序
完成 Data Explorer 实体模型的设计后,您就可以利用 BigInsights 应用程序开发生命周期来开发您的第一个索引应用程序,以便将社交数据推送到 Data Explorer 的一个搜索集合中。BigInsights 应用程序框架使您能够以极少的工作创建、发布和部署您的第一个索引应用程序。
创建一个 BigInsights 项目并创建一个新 Java 类
您需要为应用程序创建一个适当的项目,就像您期望在任何基于 Eclipse 的应用程序开发工作中看到的一样,请查阅文章 “使用 InfoSphere BigInsights 开发、发布并部署您的第一个大数据应用程序”,了解创建一个 BigInsight 项目的快捷步骤(请参阅 参考资料)。创建 BigInsights 项目后,您需要向项目添加一个新 Java 类。为此,从 Eclipse 环境中选择 File > New > Java > Class。填入您的类的信息(包名称等),完成后单击 Finish。
使用新 BigIndex API 在 Data Explorer 中对 BigInsight 数据建立索引
您的应用程序将调用 Data Explorer 所提供的一组索引 Java API (BigIndex API) 来推送来自 BigInsights 的数据。后续步骤将给出完成此目标所需的各种重要的 API 部分:
检索 Data Explorer 部署拓扑结构以建立索引:
回想一下前面介绍实体模型的一节,Data Explorer 集群拓扑结构捕获在上传到 ZooKeeper 的实体模型中。您的索引应用程序将需要建立与此 ZooKeeper 集群的一个连接,以检索该拓扑结构并找到 Data Explorer 集群来建立索引。下面的清单是实现此任务的代码段。
清单 7. 建立与 ZooKeeper 集群的连接
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("namespace_sample_big_data_app", new ZookeeperEndpoint("zkhost1.domain.com", 2181));
使用一个字段解析器来处理您的输入数据格式:
建立了我们将用于建立索引的 Data Explorer 实例后,我们就可以处理用于索引的输入数据了。对于我们的示例场景,社交数据以 CSV 格式捕获。我们可能需要使用开源 OpenCSV 解析器来解析每个 CSV 文件,将每一行处理为一个键值列表。这要求以正确的格式准备数据,以便 Data Explorer 索引引擎可以使用它们。下面的代码段提供了分析 CSV 数据的应用程序逻辑的一个示例。备注:您需要使用合适的字段解析器来处理您的索引的输入数据的数据格式。
清单 8. 解析 CSV 数据的示例代码
// Read each CSV input file stored on BigInsights HDFS for (FileStatus fStatus : listFilesFromHDFS(inputDirectory)) { // For each CSV file, parse each row into a list of key values CSVReader reader = new CSVReader(new InputStreamReader(fs.open(fStatus.getPath()))); // For each key, we will show later how to index it into // the Data Explorer index record while((listOfFields = reader.readNext())!= null){ ...
定义示例社交数据的记录模式:
Data Explorer 索引器还要求应用程序定义一个索引记录的模式。下面清单中的 Java 代码段使用 Data Explorer BigIndex API 定义我们的 Tweet 数据的各种关键字段的记录模式。备注:在下面对 addRecordType() 的调用中,输入值必须与您的实体模型中定义的实体的名称匹配。在我们的场景中,实体名为 “tweet”。
清单 9. 定义记录模式
RecordSchema recordSchema = new RecordSchemaBuilder() .addRecordType("tweet") .addTextField("Category").retrievable(true).sortable(true) .addTextField("Brand").retrievable(true).sortable(true) .addTextField("Product").retrievable(true).sortable(true) .addTextField("isSentiment").retrievable(true).sortable(true) .addDateField("CreatedTime").retrievable(true).sortable(true) .addTextField("Screenname").retrievable(true).sortable(true) .build();
将记录的索引建立到 Data Explorer 引擎中:
现在您已经完成一个记录的模式的定义,可以将记录的每个字段添加到索引中,并继续处理下一个字段,直到为您的社交 tweet 数据中的所有记录都建立了索引。以下代码段给出了将记录的索引建立到 Data Explorer 引擎中的过程。备注:在 newRecordBuilder() 调用中,所用的值必须与您的实体模型中定义的实体的名称相匹配。例如,在我们的示例场景中,实体名称为 “tweet”。
清单 10. 为记录建立索引
RecordBuilderFactory recordBuilderFactory = new RecordBuilderFactory(recordSchema); // In the following call, provide the name of // the entity as defined in the entity model RecordBuilder recordBuilder = recordBuilderFactory.newRecordBuilder("tweet"); // For each CSV row that's been parsed into a list of fields while((listOfFields = csvreader.readNext())!= null){ recordBuilder.id(String.valueOf(recordId++)); // For each field, set field name and field value while (i != listOfFields.length){ String fieldName = listOfFieldNames[i]; String fieldValue = listOFields[i]; // Add the field to the indexing record recordBuilder = recordBuilder.addField(fieldName, fieldValue); ... } } // Finally, call to generate the record with the // current data and add it to the indexer RequestStatus status = indexer.addOrUpdateRecord(recordBuilder.build());
发布和部署您的索引应用程序
开发索引应用程序后,就可以将其发布到 BigInsights 应用程序目录中。通过打包和发布索引应用程序,您能够定义应用程序的工作流,指定输入数据(您的社交媒体数据)等参数,并指定您的 Data Explorer ZooKeeper 端点。请查阅文章 “使用 InfoSphere BigInsights 开发、发布并部署您的第一个大数据应用程序”,了解创建一个 BigInsight 项目的快捷步骤,大体了解发布 BigInsights 应用程序的步骤。在这个发布过程中,您将为索引应用程序指定以下信息:
应用程序类型:
选择应用程序类型 workflow,如下图所示。
图 7. 应用程序类型
Oozie 工作流定义:
BigInsights Web 控制台生成一个 Oozie 工作流来帮助管理 MapReduce 作业。 在Workflow 选项卡中,接受允许向导创建一个新操作 workflow.xml 文件的默认设置。在下拉菜单中,将工作流类型更改为 Java,如下所示。