Hadoop 数据分析高级教程(三)

原文:Pro Hadoop Data Analytics

协议:CC BY-NC-SA 4.0

八、规则引擎、系统控制和系统编排

在本章中,我们将描述 JBoss Drools 规则引擎,以及如何使用它来控制和编排 Hadoop 分析管道。我们描述了一个基于规则的控制器示例,它可以与 Hadoop 生态系统结合使用,用于各种数据类型和应用程序。

Note

使用 JBoss Drools 系统的大部分配置都是通过 Maven 依赖项完成的。当我们讨论 JBoss Drools 的初始设置时,在第三章中显示了适当的依赖关系。有效使用 JBoss Drools 所需的所有依赖项都包含在示例 PROBDA 系统中,可以从代码下载站点获得。

8.1 规则系统介绍:JBoss Drools

JBoss Drools ( www.drools.org )在本章的所有例子中都有使用。这不是规则引擎的唯一选择。有许多免费的规则引擎框架,但是 Drools 是一个高性能的系统,可以立即用来定义许多不同种类的控制和架构系统。JBoss Drools 还有一个优势。关于 Drools 系统(docs.jboss.org)、编程方法和优化细节,以及基于规则的技术的解释,有大量的在线和印刷文档。本章末尾列出了一些 Drools 参考书。这些提供了对基于规则的控制系统、规则机制和编辑以及其他重要细节的全面介绍。

在这一章中,我们将通过一个具体的应用来简要概述基于规则的技术:定义一个复杂事件处理器(CEP)的例子。

CEPs 是数据管道主题的一个非常有用的变体,可以用在实际系统中,包括从信用卡欺诈检测系统到复杂的工厂控制系统。

在所有的规则系统中,有两种数据结构在起作用:当然是规则,它在基于规则的系统中提供“if-then-else”条件功能(然而,我们很快就会知道,这种类型的规则,称为“正向链接”规则,并不是我们将遇到的唯一规则;还有“反向链接”规则,稍后将对其进行描述)。使用的另一种数据结构是事实,它是单独的“数据项”这些被保存在一个叫做工作记忆库的储存库中。请参见图 8-1 了解这在 Drools 系统中是如何工作的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-1。

Download the Drools software from the Drools web page Note

本书使用了 JBoss Drools 最新发布的版本,在写本书的时候是 6.4.0 版本。如果 JBoss Drools 的新版本可用并且您想要使用它,请更新 PROBDA 项目 pom.xml 中的 drools.system.version 属性。

让我们从安装 JBoss Drools 和测试一些基本功能开始。安装过程很简单。在 JBoss Drools 首页,点击下载按钮,下载 Drools 当前版本,如图 8-1 所示。

cd 到安装目录并运行 examples/run-examples.sh。您将看到一个类似于图 8-2 中的选择菜单。运行一些输出示例来测试 Drools 系统,并在控制台中观察输出,类似于图 8-3 ,或者一个面向 GUI 的示例,如图 8-4 。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-4。

JBoss Drools rule system architecture

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-3。

JBoss Drools GUI-oriented example

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-2。

Select some Drools examples and observe the results to test the Drools system

内置的 Drools 示例有一个菜单,您可以从中选择不同的测试示例,如图 8-2 所示。这是测试整个系统设置并了解 JBoss Drools 系统功能的好方法。

JBoss Drools 的一些示例组件有一个关联的 UI,如图 8-3 所示。

JBoss Drools 规则系统的基本架构如图 8-4 所示。

Note

此系统中的所有示例代码都可以在 Java 包 com.apress.probda.rulesystem 中附带的示例系统代码库中找到。有关安装、版本控制和使用的其他说明,请参见相关的自述文件和文档。

在我们的系统中,带有时间戳的 Probda 事件的界面再简单不过了:

package com.probda.rulesystem.cep.model;

import java.util.Date;

public interface IEvent extends Fact {

        public abstract Date getTimestamp();
}

IEvent 的实现如下所示:

IEvent 的实现如下所示:

清单 8-1。一个基本的 JBoss Drools 程序

让我们以举例的方式给评估系统添加一个规则系统。只需为 drools 规则系统添加适当的依赖项(Drools 最新版本的 Google“Drools maven 依赖项”)。清单 3-2 中显示了完整的 pom.xml 文件(构建于我们的原始文件之上)。我们将在第八章的完整分析引擎示例中利用 JBoss Drools 的功能。请注意,我们提供依赖关系来连接 Drools 系统和 Apache Camel 以及 Drools 的 Spring 框架。

8.2 基于规则的软件系统控制

基于规则的软件系统控制可以从一个调度组件(如 Oozie)结合 JBoss Drools 或其他规则框架中的适当功能来构建,如图 8-5 中的示例架构所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-5。

Rule-based software systems control architecture, using JBoss Drools as a controller

8.3 使用 JBoss Drools 的系统编排

在这一节中,我们将讨论一个简单的例子,说明如何使用 JBoss Drools 作为控制器来完成系统编排任务。我们将使用 Activiti 开源项目( http://activiti.org )以及一些如何将工作流编排器/控制器集成到基于 Spring 框架的项目中的例子。

git clone https://github.com/Activiti/Activiti.git
export ACTIVITI_HOME=/Users/kkoitzsch/activiti
             cd $ACTIVITI_HOME
mvn clean install

Don’t forget to generate the documentation by
        cd $ACTIVITI_HOME/userguide
        mvn install

Insure Tomcat is installed. On the Mac platform, do

brew install tomcat
Tomcat will then be installed at /usr/local/Cellar/tomcat/8.5.3

图 8-6 显示了在 Activiti 构建结束时,您可以从 Maven reactor 总结中得到什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-6。

Maven reactor summary for Activiti system install

export TOMCAT_HOME=/usr/local/Cellar/tomcat/8.5.3
cd $ACTIVITI_HOME/scripts

然后运行活动脚本

./start-rest-no-jrebel.sh

您将看到 Activiti 成功启动,如图 8-7 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-7。

Activiti script running successfully

Activiti 程序成功运行的屏幕截图如图 8-7 所示。

图 8-8 显示了 Activiti Explorer 仪表盘成功运行的图片。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-8。

Activiti explorer dashboard running successfully

8.4 带规则控制的分析引擎示例

在本节中,我们将演示一个带有规则控制的分析引擎示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-11。

A Lucene-oriented system design, including user interactions and document processing , step 3

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-10。

A Lucene-oriented system design, including user interactions and document processing , step 2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-9。

An initial Lucene-oriented system design, including user interactions and document processing

我们可以使用 Splunk 系统来接收数据。

我们可以使用面向时间序列的数据库,比如 OpenTSDB ( https://github.com/OpenTSDB/opentsdb/releases )作为中间数据存储库。

JBoss Drools 提供了基于规则的转换。

文档库功能可以由 Cassandra 数据库的实例提供。

Note

请注意,您没有义务使用图 8-12 中所示的技术组件。根据您的应用程序需求,您可以使用另一个消息传递组件,比如 RabbitMQ,而不是 Apache Kafka,或者 MongoDB,而不是 Cassandra。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-12。

An integrated system architecture with lifecycle, including the technology components used

8.5 总结

在本章中,我们讨论了将基于规则的控制器用于其他分布式组件,尤其是 Hadoop 和 Spark 生态系统组件。我们已经看到,基于规则的策略可以为分布式数据分析添加一个关键要素:以灵活且有逻辑的方式组织和控制数据流的能力。调度和优先化是这些基于规则的技术的自然结果,我们在本章中查看了一些基于规则的调度器的例子。

在下一章中,我们将讨论到目前为止我们所学的技术在一个集成的分析组件中的应用,它适用于各种用例以及问题域。

8.6 参考文献

阿玛多,卢卡斯。Drools 开发者食谱。英国伯明翰:PACKT 出版社,2012 年。

巴厘岛,米哈尔。Drools JBoss 规则 5.0 开发者指南。英国伯明翰:PACKT 出版社,2009 年。

布朗,保罗。JBoss 口水商业规则。英国伯明翰:PACKT 出版社,2009 年。

诺维格,彼得。人工智能范例:Common Lisp 案例研究。加利福尼亚州圣马特奥:摩根-考夫曼出版社,1992 年。

九、将所有这些放在一起:设计一个完整的分析系统

在本章中,我们将描述一个端到端的设计示例,使用到目前为止讨论过的许多组件。我们还讨论了在系统开发项目的需求获取、计划、架构、开发、测试和部署阶段使用的“最佳实践”。

Note

本章使用了本书其他地方讨论的许多软件组件,包括 Hadoop、Spark、Splunk、Mahout、Spring Data、Spring XD、Samza 和 Kafka。查看附录 A 中的组件摘要,并确保在尝试本章中的示例时可以使用它们。

构建一个完整的分布式分析系统比听起来容易。在前面的章节中,我们已经讨论了这样一个系统的许多重要组成部分。一旦您理解了您的数据源和汇点将会是什么,并且您对要使用的技术栈和要利用的“glueware”有了一个相当清晰的概念,编写业务逻辑和其他处理代码就可以成为一个相对简单的任务。

一个简单的端到端架构如图 9-1 所示。对于数据源、处理器、数据接收器和存储库以及输出模块实际使用的技术,这里显示的许多组件都留有余地,其中包括我们将在其他章节中看到的熟悉的仪表板、报告、可视化等。在本例中,我们将使用熟悉的导入工具 Splunk 来提供输入源。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-1。

A simple end-to-end analytics architecture

在下一节中,我们将介绍如何设置 Splunk 并将其与示例系统的其他组件集成。

How to Install Splunk for the Example System

Splunk ( https://www.splunk.com )是一个日志框架,非常容易下载、安装和使用。对于我们在这里展示的示例分析系统来说,它附带了许多非常有用的功能,包括一个内置的搜索工具。

要安装 Splunk,请转到下载网页,创建一个用户帐户,并下载适用于您的适当平台的 Splunk Enterprise。这里展示的所有例子都使用 MacOS 平台。

为您选择的平台正确安装 Splunk Enterprise。在 Mac 平台上,如果安装成功,您将看到 Splunk 出现在您的应用程序目录中,如图 9-2 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-2。

Successful Splunk Enterprise installation for Mac OSX

关于如何启动 Splunk,请参考 http://docs.splunk.com/Documentation/Splunk/6.4.2/SearchTutorial/StartSplunk 。请注意,正确启动后,可以在http://localhost:8000找到 Splunk Web 界面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-3。

Login page for Splunk Enterprise

当您将浏览器指向 localhost:8000 时,最初会看到 Splunk 登录页面。首先使用默认的用户名和密码,按照指示进行更改,并确保用于连接的 Java 代码使用更新的用户名(’ admin ‘)和密码(’ changename ')。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-4。

Change password during initial Splunk Enterprise setup

从 github 下载以下非常有用的库,splunk-library-javalogging:

git clone https://github.com/splunk/splunk-library-javalogging.git

cd splunk-library-javalogging

mvn clean install

在您的 Eclipse IDE 中,导入现有的 Maven 项目,如图 9-5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-5。

Import an existing Maven to use splunk-library-javalogging

图 9-5 显示了导入现有 Maven 项目以使用 splunk-library-javalogging 的对话框。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-6。

Select splunk-library-javalogging for import

如图 9-7 所示,选择合适的 pom.xml 是您在这一步需要做的全部工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-7。

Select the appropriate root directory for Maven construction

如图 9-8 所示,修改以包括适当的用户名和密码值通常是此安装步骤所必需的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-8。

Eclipse IDE installation of Splunk test code

如图 9-9 所示,为 Splunk 配置 HadoopConnect 组件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-9。

Configure the HadoopConnect component for Splunk

Splunk 仪表盘中的文本搜索可如图 9-10 所示完成。我们还可以选择一个合适的带时间戳的时间间隔来对数据集执行查询。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-10。

Searching for Pro Data Analytics events in the Splunk dashboard

可视化是这一整合过程的重要组成部分。查看本章底部的一些 D3 参考资料,了解一些可以与数据管道的其他组件结合使用的技术。

9.1 摘要

在这一章中,我们讨论了构建一个完整的分析系统,以及架构师和开发人员在这个过程中遇到的一些挑战。我们使用前几章中讨论的现已熟悉的技术组件构建了一个完整的端到端分析管道。特别是,我们讨论了如何使用 Splunk 作为输入数据源。Splunk 是一种特别通用和灵活的工具,可用于各种通用日志事件。

9.2 参考文献

莫克,德里克,约翰逊,保罗,迪亚昆,乔什。Splunk 运营情报指南。英国伯明翰:PACKT 出版社,2014 年。

朱,尼克齐。用 d3.js Cookbook 实现数据可视化。英国伯明翰:PACKT 出版社,2014 年。

十、数据可视化工具:查看分析并与之交互

在这一章中,我们将讨论如何查看—可视化—我们的分析结果。这其实是一个相当复杂的过程,或者说可以。这完全是为您的应用程序所需的可视化类型选择合适的技术堆栈的问题。分析应用程序中的可视化任务可以从创建简单的报表到成熟的交互系统。在本章中,我们将主要讨论 Angular JS 及其生态系统,包括 ElasticUI 可视化工具 Kibana,以及用于图形、图表和表格的其他可视化组件,包括一些基于 JavaScript 的工具,如 D3.js 和 sigma.js。

10.1 简单的可视化

最简单的可视化架构之一如图 10-1 所示。前端控制界面可以是基于网络的,或者是独立的应用程序。控制 UI 可以基于单个网页,或者更先进的软件插件或多个页面组件。前端的“Glueware”可能涉及可视化框架,比如 Angular JS,我们将在下面的小节中详细讨论。在后端,像 Spring XD 这样的 glueware 可以使可视化界面更加简单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-1。

Typical visualization component architecture

让我们简单谈谈图 10-1 中的不同组件。每个圆圈代表使用分析软件组件时典型用例的不同方面。你可能会认为这些圆圈是我们试图解决的个别子问题或问题。例如,分组、排序、合并和整理可能由一个标准的表格结构来处理,如图 10-2 所示。大多数排序和分组问题都可以通过内置的表格功能来解决,比如单击一列来对行进行排序,或者对项目进行分组。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-2。

One tabular control can solve several visualization concerns

提供有效的显示功能非常简单,只需选择适当的表格组件用于面向行的数据。图 10-2 所示的表格组件是一个很好的例子,它提供了数据导入、排序、分页和易于编程的特性。此组件在 https://github.com/wenzhixin/bootstrap-table 可用。这里显示的控件利用一个名为 Bootstrap.js ( http://getbootstrap.com/javascript/ )的助手库来提供高级功能。能够将 JSON 数据集导入可视化组件是一个关键特性,它支持与其他 UI 和后端组件的无缝集成。

图 10-1 中发现的许多问题可以通过嵌入网页的前端控件来控制。例如,我们都熟悉“Google 风格”的文本搜索机制,它只包含一个文本字段和一个按钮。我们可以使用 d3 实现一个可视化工具,对脸书的推文进行简单的分析,作为数据可视化的介绍。如图 10-2 和图 10-3 所示,我们可以控制显示的“内容”以及“方式”:我们可以看到示例数据集的饼图、条形图和气泡图版本,它来自 Spring XD 数据流。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-3。

Simple data visualization example of Twitter tweets using Spring XD showing trending topics and languages

我们在图 10-1 中看到的大多数关注点(数据集选择、显示类型选择和其他)在图 10-3 和图 10-4 中有所体现。下拉框等标准控件用于选择数据集和显示类型。呈现类型可以包括各种图形和图表类型、二维和三维显示以及其他类型的呈现和报告格式。Apache POI ( https://poi.apache.org )等组件可用于编写与 Excel 兼容的微软格式的报告文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-4。

An additional simple data visualization example of Twitter tweets using Spring XD

当新的 tweet 数据通过 Spring XD 数据流到达时,这里显示的内容会动态更新。图 10-3 显示了推特数据的一个稍微不同的可视化,其中我们可以看到一些圆圈的大小是如何增长的,代表了推特中的数据“趋势”。

我们将在下一节讨论 Spring XD,因为它在构建可视化工具时作为 glueware 特别有用。

Setting Up the Spring XD Component

像所有 Spring 框架组件一样,设置 Spring XD 组件基本上很简单。

安装 Spring XD 后,在“单节点模式”下用

bin/xd-singlenode
cd bin

使用以下命令运行 XD shell

./xd-shell

使用以下命令创建流

 stream create tweets --definition "twitterstream | log"

 stream create tweetlang  --definition "tap:stream:tweets > field-value-counter --fieldName=lang" --deploy

stream create tweetcount --definition "tap:stream:tweets > aggregate-counter" --deploy

stream create tagcount --definition "tap:stream:tweets > field-value-counter --fieldName=entities.hashtags.text --name=hashtags" --deploy
stream deploy tweets

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-5。

Architecture diagram for Twitter ➤ Spring XD ➤ visualization

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-6。

Bringing up the Spring XD shell successfully

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-7。

Using Spring XD to implement a Twitter tweet stream and then sdeploy the stream

在下一节中,我们将深入一些特别有用的工具包 Angular JS 的综合例子。

10.2 介绍 Angular JS 和朋友

Angular JS ( https://angularjs.org )是一个基于 JavaScript 的工具包,已经成为数据可视化库领域非常突出的竞争者。它有一个简单的模型-视图-控制器(MVC)架构,可以简化设计和实现过程。

顺便提一下,一些 Angular JS 组件,如 Elastic UI(elasticui.com ),可以直接开箱即用,与 Elastic 搜索引擎一起使用。带有 Kibana 的 ElasticUI 是添加可视化组件的一种快速且相对容易的方式。

我们将在本章余下的大部分时间里讨论如何使用 Angular JS 和一些其他可视化工具包来设置一些示例,包括一个非常有趣的新成员 JHipster。

10.3 使用 JHipster 集成 Spring XD 和 Angular JS

JHipster ( https://jhipster.github.io )是一个开源的 Yeoman()生成器,用于创建集成的 Spring Boot 和 Angular JS 组件。这使得以无缝的方式集成 Spring Framework 生态系统的其他组件成为可能。例如,您可以使用一个基于 Spring Data Hadoop 的组件来构建一个数据管道,在前端使用 AngularJS 编写摘要显示。

我们将构建一个简单的 JHipster 迷你项目来展示这可能是如何工作的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-8。

Successful setup of a “probda-hipster” project How to Build the Angular JS Example System

构建一个 Angular JS 示例系统相对简单,我们将在本节中描述如何实现。

构建 Angular JS 示例系统的第一步是在命令行上创建原型项目。Cd 到您希望构建的主目录。然后执行下面的命令,如清单 13.1 所示。

mvn archetype:generate -DgroupId=nl.ivonet -DartifactId=java-angularjs-seed -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

这将创建如清单 10-2 所示的目录和文件。Cd 到目录,并确保它们确实在那里。

./pom.xml
./src
./src/main
./src/main/resources
./src/main/webapp
./src/main/webapp/index.jsp
./src/main/webapp/WEB-INF
./src/main/webapp/WEB-INF/web.xml

构建新的文件和目录来配置项目,如清单 10-3 所示。

mkdir -p src/main/java
mkdir -p src/test/java
mkdir -p src/test/javascript/unit
mkdir -p src/test/javascript/e2e
mkdir -p src/test/resources
rm -f ./src/main/webapp/WEB-INF/web.xml
rm -f ./src/main/webapp/index.jsp
mkdir -p ./src/main/webapp/css
touch ./src/main/webapp/css/specific.css
mkdir -p ./src/main/webapp/js
touch ./src/main/webapp/js/app.js
touch ./src/main/webapp/js/controllers.js
touch ./src/main/webapp/js/routes.js
touch ./src/main/webapp/js/services.js
touch ./src/main/webapp/js/filters.js
touch ./src/main/webapp/js/services.js
mkdir -p ./src/main/webapp/vendor
mkdir -p ./src/main/webapp/partials
mkdir -p ./src/main/webapp/img
touch README.md
touch .bowerrc

运行 npm 初始化,以交互方式构建程序。“npm init”将提供一个逐步问答的方法来创建项目,如清单 x.y 所示

npm init

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install  --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (java-angularjs-seed)
version: (0.0.0)
description: A starter project for AngularJS combined with java and maven
entry point: (index.js)
test command: karma start test/resources/karma.conf.js
git repository: https://github.com/ivonet/java-angular-seed
keywords:
author: Ivo Woltring
license: (ISC) Apache 2.0
About to write to /Users/ivonet/dev/ordina/LabTime/java-angularjs-seed/package.json:

{
  "name": "java-angularjs-seed",
  "version": "0.0.0",
  "description": "A starter project for AngularJS combined with java and maven",
  "main": "index.js",
  "scripts": {
    "test": "karma start test/resources/karma.conf.js"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/ivonet/java-angular-seed"

  },
  "author": "Ivo Woltring",
  "license": "Apache 2.0",
  "bugs": {
    "url": "https://github.com/ivonet/java-angular-seed/issues"
  },
  "homepage": "https://github.com/ivonet/java-angular-seed"
}

Is this ok? (yes)

现在将以下内容添加到文件中:_ _ _ _ _ _ _。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-11。

Additional configuration file for the Angular JS example application

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-10。

Configuration file for the Angular JS example

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-9。

Building the Maven stub for the Angular JS project successfully on the command line

{
  "name": "java-angular-seed",
  "private": true,
  "version": "0.0.0",
  "description": "A starter project for AngularJS combined with java and maven",
  "repository": "https://github.com/ivonet/java-angular-seed",
  "license": "Apache 2.0",
  "devDependencies": {
    "bower": "¹.3.1",
    "http-server": "⁰.6.1",
    "karma": "∼0.12",
    "karma-chrome-launcher": "⁰.1.4",
    "karma-firefox-launcher": "⁰.1.3",
    "karma-jasmine": "⁰.1.5",
    "karma-junit-reporter": "⁰.2.2",
    "protractor": "∼0.20.1",
    "shelljs": "⁰.2.6"
  },
  "scripts": {
    "postinstall": "bower install",
    "prestart": "npm install",
    "start": "http-server src/main/webapp -a localhost -p 8000",
    "pretest": "npm install",
    "test": "karma start src/test/javascript/karma.conf.js",
    "test-single-run": "karma start src/test/javascript/karma.conf.js  --single-run",
    "preupdate-webdriver": "npm install",
    "update-webdriver": "webdriver-manager update",
    "preprotractor": "npm run update-webdriver",
    "protractor": "protractor src/test/javascript/protractor-conf.js",
    "update-index-async": "node -e \"require('shelljs/global'); sed('-i', /\\/\\/@@NG_LOADER_START@@[\\s\\S]*\\/\\/@@NG_LOADER_END@@/, '//@@NG_LOADER_START@@\\n' + cat('src/main/webapp/vendor/angular-loader/angular-loader.min.js') + '\\n//@@NG_LOADER_END@@', 'src/main/webapp/index.html');\""
  }
}

{
    "directory": "src/main/webapp/vendor"
}
bower install angular#1.3.0-beta.14
bower install angular-route#1.3.0-beta.14
bower install angular-animate#1.3.0-beta.14
bower install angular-mocks#1.3.0-beta.14
bower install angular-loader#1.3.0-beta.14
bower install bootstrap

bower init
[?] name: java-angularjs-seed
[?] version: 0.0.0
[?] description: A java / maven / angularjs seed project
[?] main file: src/main/webapp/index.html
[?] what types of modules does this package expose?
[?] keywords: java,maven,angularjs,seed
[?] authors: IvoNet
[?] license: Apache 2.0
[?] homepage: http://ivonet.nl
[?] set currently installed components as dependencies? Yes
[?] add commonly ignored files to ignore list? Yes
[?] would you like to mark this package as private which prevents it from being accidentally pub[?] would you like to mark this package as private which prevents it from being accidentally published to the registry? Yes

...

[?] Looks good? (Y/n) Y

{
    "name": "java-angularjs-seed",
    "version": "0.0.0",
    "authors": [
        "IvoNet <webmaster@ivonet.nl>"
    ],
    "description": "A java / maven / angularjs seed project",
    "keywords": [
        "java",
        "maven",
        "angularjs",
        "seed"
    ],
    "license": "Apache 2.0",
    "homepage": "http://ivonet.nl",
    "private": true,
    "ignore": [
        "**/.*",
        "node_modules",
        "bower_components",
        "src/main/webapp/vendor",

        "test",
        "tests"
    ],
    "dependencies": {
        "angular": "1.3.0-beta.14",
        "angular-loader": "1.3.0-beta.14",
        "angular-mocks": "1.3.0-beta.14",
        "angular-route": "1.3.0-beta.14",
        "bootstrap": "3.2.0"
    },
    "main": "src/main/webapp/index.html"
}
rm -rf ./src/main/webapp/vendor
npm install

现在我们配置。/src/test/JavaScript/karma . conf . js:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-13。

Data configuration in the package.json file

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-12。

Console result of Angular component install

module.exports = function(config){
  config.set({

    basePath : '../../../',

    files : [
      'src/main/webapp/vendor/angular**/**.min.js',
      'src/main/webapp/vendor/angular-mocks/angular-mocks.js',
      'src/main/webapp/js/**/*.js',
      'src/test/javascript/unit/**/*.js'
    ],

    autoWatch : true,

    frameworks: ['jasmine'],

    browsers : ['Chrome'],

    plugins : [
            'karma-chrome-launcher',
            'karma-firefox-launcher',
            'karma-jasmine',
            'karma-junit-reporter'
            ],

    junitReporter : {
      outputFile: 'target/test_out/unit.xml',

      suite: 'src/test/javascript/unit'
    }

  });
};

把下面的内容放进去。/src/main/WEB app/we b-INF/beans . XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="annotated">
</beans>

<project  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>nl.ivonet</groupId>
    <artifactId>java-angularjs-seed</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>

    <name>java-angularjs-seed Maven Webapp</name>

    <url>http://ivonet.nl</url>

    <properties>
        <artifact.name>app</artifact.name>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>

            <version>7.0</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>
    <build>
        <finalName>${artifact.name}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>

                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

10.4 使用 d3.js、sigma.js 等

D3.js ( https://d3js.org )和 sigma.js ( http://sigmajs.org )是流行的用于数据可视化的 JavaScript 库。

d3 和 sigmajs 工具包可能实现的图形可视化示例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-15。

Another typical data visualization of a portion of a graph database

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-14。

A portion of a sigma.js-based graph visualization example

我们可以手工制作用户界面来适应我们的应用程序,或者我们可以选择使用一些已经作为独立库、插件和工具包提供的复杂的可视化工具。

回想一下,我们也可以直接从图数据库中可视化数据集。例如,在 Neo4j 中,我们可以在加载 CSV 数据集后浏览萨克拉门托的犯罪统计数据。点击单个节点会导致字段摘要出现在图形显示的底部,如图 10-16 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-16。

Browsing crime statistics as individual nodes from a query in a Neo4j graph database

10.5 摘要

在这一章中,我们看了分析问题的视觉方面:如何看到和理解我们分析过程的结果。可视化挑战的解决方案可以像 Excel 中的 CSV 报告一样简单,也可以是复杂的交互式仪表板。我们强调了 Angular JS 的使用,这是一个基于模型-视图-控制器(MVC)范式的复杂的可视化工具包。

在下一章中,我们将讨论基于规则的控制和编排模块的设计和实现。规则系统是一种在计算机软件中有着悠久历史的控制系统,并且随着时间的推移,已经在广泛的控制和调度应用中证明了它们的有效性。

我们将发现,基于规则的模块在分布式分析系统中是一个有用的组件,特别是对于在整个应用程序执行中调度和编排单个流程。

10.6 参考

福特,布莱恩和鲁贝克,卢卡斯。Angular JS 在行动。马萨诸塞州波士顿:奥赖利出版社,2015 年。

亚当·弗里曼。亲角。纽约州纽约市:阿普瑞斯出版社,2014 年。

弗里斯比,马特。AngularJS Web 应用程序开发指南。英国伯明翰:PACKT 出版社,2013 年。

默里斯科特。面向 Web 的交互式数据可视化。马萨诸塞州波士顿:奥赖利出版社,2013 年。

皮考夫,克利福德 a,图克斯伯里,斯图尔特 k(编辑)。科学可视化的前沿。纽约州纽约市:威利-Interscience,1994 年,

泰勒斯威兹克。用 d3.js 实现数据可视化。英国伯明翰:PACKT 出版公司,2013 年。

沃尔夫,罗伯特 s,耶格尔,拉里。自然现象的可视化。纽约州纽约市:泰洛斯/施普林格出版社,1993 年。

朱,尼克齐。用 D3.js Cookbook 实现数据可视化。英国伯明翰:PACKT 出版社,2013 年。

十一、生物信息学案例研究:分析显微镜载玻片数据

在这一章中,我们描述了一个分析显微载玻片数据的应用程序,例如在对病人样本的医学检查或犯罪现场的法医证据中可能发现的数据。我们举例说明了 Hadoop 系统如何用于组织、分析和关联生物信息学数据。

Note

本章使用一组免费提供的果蝇图像来展示如何分析显微镜图像。严格地说,这些图像来自电子显微镜,它能够实现比你可能在高中生物课上第一次遇到的普通光学显微镜更高的图像放大倍数和分辨率。然而,对传感器数据输出的分布式分析的原理是相同的。例如,您可以使用来自小型无人机的图像,并对无人机相机输出的图像进行分析。软件组件和许多分析操作保持不变。

11.1 生物信息学简介

生物学作为一门科学有着悠久的历史,跨越了许多世纪。然而,只是在过去的五十年左右,生物数据作为计算机数据才成为理解信息的一种方式。

生物信息学是将生物数据理解为计算机数据,并对计算机数据进行有规律的分析。我们通过利用专门的库来翻译和验证生物和医学数据集中包含的信息来执行生物信息学,这些数据包括 x 射线、显微镜载玻片图像、化学和 DNA 分析、传感器信息(如心电图、MRI 数据)以及许多其他类型的数据源。

光学显微镜已经存在了数百年,但是直到最近,图像处理软件才开始分析显微镜载玻片图像。最初,这些分析是以非常特别的方式进行的。然而,现在显微镜载玻片图像本身已经成为“大数据”集,可以通过使用数据分析管道进行分析,正如我们在整本书中所描述的那样。

在这一章中,我们检查了一个分布式分析系统,该系统专门用于执行我们在图 8-1 中看到的自动化显微镜载玻片分析。在我们的其他例子中,我们将使用标准的第三方库在 Apache Hadoop 和 Spark 基础设施上构建我们的分析系统。

对于医学生物信息学的技术和算法的深入描述,参见 Kalet (2009)。

在我们深入到这个例子之前,我们应该再次强调在前面介绍的节点中提出的观点。无论我们使用电子显微镜图像、显微镜载玻片的光学图像,还是更复杂的图像,例如通常代表 X 射线的 DICOM 图像。

Note

本案例研究需要几个特定领域的软件组件,包括一些专门设计的软件包,用于将显微镜及其摄像头集成到标准图像处理应用中。

我们将在本章讨论的示例代码基于图 11-1 所示的架构。大多数情况下,我们并不关心机械装置的物理力学,除非我们想要精确控制显微镜的设置。分析系统从该过程的图像采集部分结束的地方开始。与我们所有的示例应用程序一样,在开始定制代码之前,我们会经历一个简单的技术堆栈——组装阶段。使用显微镜是图像处理的一个特例,即“作为大数据的图像”,我们将在第十四章中对此进行更详细的讨论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-1。

A microscope slide analytics example with software and hardware components

当我们为我们的技术堆栈选择软件组件时,我们也发展了我们希望在软件中实现的高层次图表。这种想法的一个结果可能如图 11-2 所示。我们有数据源(主要来自显微镜摄像头)、处理元素、分析元素和结果持久性。其他一些组件也是必要的,比如保存中间结果的缓存存储库。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-2。

A microscope slide software architecture: high-level software component diagram

11.2 自动化显微镜介绍

图 11-3 至 11-5 显示了载玻片在自动显微镜中经历的阶段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-5。

Color-coded regions in the image

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-4。

Contour extraction from the microscope image

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-3。

Original electron microscope slide image, showing a fruit fly tissue slice

我们可以使用组织切片的几何模型,如图 11-6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-6。

Geometric computation of slice dimensions

我们可以使用三维可视化工具来分析一堆神经组织切片,如图 11-7 和 11-8 中的例子所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-8。

Another example of organizing neural tissue

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-7。

An example of analyzing slices of neural tissue

11.3 代码示例:用图像填充 HDFS

我们将使用 HIPI 包( http://hipi.cs.virginia.edu/gettingstarted.html )将图像摄取到 HDFS。Apache Oozie 可以用来安排导入。我们可以按照 HIPI 的在线说明,从基本的 Hadoop 工作开始:

package com.apress.probda.image;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class ImageProcess extends Configured implements Tool {
  public int run(String[] args) throws Exception {
    System.out.println("---- Basic HIPI Example ----");
    return 0;
  }
  public static void main(String[] args) throws Exception {

    ToolRunner.run(new ImageProcess(), args);
    System.exit(0);
  }
}

编辑、编译和运行程序以验证结果。

程序的第二次迭代如下:

package com.apress.probda.image;
import org.hipi.image.FloatImage;
import org.hipi.image.HipiImageHeader;
import org.hipi.imagebundle.mapreduce.HibInputFormat;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class ImageProcess extends Configured implements Tool {

  public static class ImageProcessMapper extends Mapper<HipiImageHeader, FloatImage, IntWritable, FloatImage> {
    public void map(HipiImageHeader key, FloatImage value, Context context)
      throws IOException, InterruptedException {
    }
  }
  public static class ImageProcessReducer extends Reducer<IntWritable, FloatImage, IntWritable, Text> {
    public void reduce(IntWritable key, Iterable<FloatImage> values, Context context)
      throws IOException, InterruptedException {
    }
  }
  public int run(String[] args) throws Exception {
    // Check input arguments
    if (args.length != 2) {
      System.out.println("Usage: imageProcess <input HIB> <output directory>");
      System.exit(0);
    }
    // Initialize and configure MapReduce job
    Job job = Job.getInstance();
    // Set input format class which parses the input HIB and spawns map tasks
    job.setInputFormatClass(HibInputFormat.class);
    // Set the driver, mapper, and reducer classes which express the computation
    job.setJarByClass(ImageProcess.class);
    job.setMapperClass(ImageProcessMapper.class);
    job.setReducerClass(ImageProcessReducer.class);
    // Set the types for the key/value pairs passed to/from map and reduce layers
    job.setMapOutputKeyClass(IntWritable.class);
    job.setMapOutputValueClass(FloatImage.class);
    job.setOutputKeyClass(IntWritable.class);
    job.setOutputValueClass(Text.class);
    // Set the input and output paths on the HDFS
    FileInputFormat.setInputPaths(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    // Execute the MapReduce job and block until it complets
    boolean success = job.waitForCompletion(true);

    // Return success or failure
    return success ? 0 : 1;
  }
  public static void main(String[] args) throws Exception {
    ToolRunner.run(new ImageProcess(), args);
    System.exit(0);
  }
}

在代码贡献中寻找完整的代码示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-9。

Successful population of HDFS with University of Virginia’s HIPI system

通过在命令行中键入以下命令,检查图像是否已使用 HibInfo.sh 工具成功加载:

tools/hibInfo.sh flydata3.hib --show-meta

您应该会看到类似于图 11-10 中的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11-10。

Successful description of HDFS images (with metadata information included)

11.4 摘要

在本章中,我们描述了一个使用分布式生物信息学技术来分析显微镜载玻片数据的示例应用程序。

在下一章,我们将讨论一个基于贝叶斯分类和数据建模方法的软件组件。这被证明是一种非常有用的技术,可以补充我们的分布式数据分析系统,并已被用于各种领域,包括金融、法医和医疗应用。

11.5 参考

格哈德,斯蒂芬,芬克,简,马特尔,朱利安,卡多纳,阿尔伯特,和费特,理查德。"神经组织的分段各向异性系统数据集."检索到 2013 年 11 月 20 日 16:09(格林尼治时间) http://dx.doi.org/10.6084/m9.figshare.856713

生物医学信息学原理。英国伦敦:学术出版社 Elsevier,2009 年。

《计算机视觉的特征提取和图像处理》,第三版。英国伦敦:学术出版社 Elsevier,2008 年。

十二、贝叶斯分析组件:识别信用卡欺诈

在这一章中,我们描述了一个贝叶斯分析软件组件插件,该插件可用于分析信用卡交易流,以识别非法用户对信用卡的欺诈性使用。

Note

我们将主要使用 Apache Mahout 提供的朴素贝叶斯实现,但是我们将讨论使用贝叶斯分析的几种可能的解决方案。

12.1 贝叶斯分析简介

贝叶斯网络(也称为信念网络或概率因果网络)是观察、实验或假设的表示。“信念”和“贝叶斯网络”的整个概念是相辅相成的。当我们进行物理实验时,比如使用盖革计数器来识别放射性矿物,或者对土壤样本进行化学测试来推断天然气、煤炭或石油的存在,这些实验的结果都与“信念因素”有关。实验有多精确?实验的“数据模型”——前提、数据、数据变量之间的关系、方法——有多可靠?而我们又有多相信实验的“结论”呢?幸运的是,我们在过去几章中建立的许多基础设施对于处理各种贝叶斯技术非常有用,尤其是图数据库。几乎所有的贝叶斯网络问题都受益于用图形表示——毕竟,它们是网络——图数据库可以帮助无缝表示贝叶斯问题。

Note

贝叶斯分析是一个不断发展的概念和技术的巨大领域,现在包括深度学习和机器学习方面。本章末尾的一些参考资料提供了到目前为止在贝叶斯分析中使用的概念、算法和技术的概述。

贝叶斯技术与一个正在发生的金融问题特别相关:识别信用卡欺诈。让我们来看看一个简单的信用卡欺诈算法,如图 18-1 所示。所示的实现和算法基于 Triparthi 和 Ragha (2004)的工作。

我们将描述如何基于图 12-1 所示的算法构建一个分布式信用卡欺诈检测器,使用前几章中描述的一些现在已经很熟悉的策略和技术。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12-1。

A credit card fraud detection algorithm, following Triparthi and Ragha (2004)

首先:将一个环境变量添加到您的。该应用程序的 bash_profile 文件:

  export CREDIT_CARD_HOME=/Users/kkoitzsch/probda/src/main/resources/creditcard

首先,让我们获取一些信用卡测试数据。我们从在 https://www.cs.purdue.edu/commugrate/data/credit_card/ 发现的数据集开始。这个数据集是 2009 年一个代码挑战的基础。我们只对这些文件感兴趣:

DataminingContest2009.Task2.Test.Inputs
DataminingContest2009.Task2.Train.Inputs
DataminingContest2009.Task2.Train.Targets

将文件下载到$CREDIT_CARD_HOME/data

让我们看看信用卡交易记录的结构。CSV 文件中的每一行都是由以下字段组成的交易记录:

amount,hour1,state1,zip1,custAttr1,field1,custAttr2,field2,hour2,flag1,total,field3,field4,indicator1,indicator2,flag2,flag3,flag4,flag5
000000000025.90,00,CA,945,1234567890197185,3,redjhmbdzmbzg1226@sbcglobal.net,0,00,0,000000000025.90,2525,8,0,0,1,0,0,2
000000000025.90,00,CA,940,1234567890197186,0,puwelzumjynty@aol.com,0,00,0,000000000025.90,3393,17,0,0,1,1,0,1
000000000049.95,00,CA,910,1234567890197187,3,quhdenwubwydu@earthlink.net,1,00,0,000000000049.95,-737,26,0,0,1,0,0,1
000000000010.36,01,CA,926,1234567890197202,2,xkjrjiokleeur@hotmail.com,0,01,1,000000000010.36,483,23,0,0,1,1,0,1
000000000049.95,01,CA,913,1234567890197203,3,yzlmmssadzbmj@socal.rr.com,0,01,0,000000000049.95,2123,23,1,0,1,1,0,1

…以及更多。

查看这个数据集中 CSV 行的标准结构,我们注意到关于字段 4 的一些情况:虽然它有一个 16 位的类似信用卡的代码,但它不符合可以通过 Luhn 测试的标准有效信用卡号。

我们编写一个程序,将事件文件修改为更合适的形式:每个记录的第四个字段现在将包含一个“有效的”Visa 或 Mastercard 随机生成的信用卡号,如图 12-2 所示。我们想引入一些“坏的”信用卡号码,以确保我们的检测器能够发现它们。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12-2。

Merging valid and invalid “real” credit card numbers with test data

12.2 用于信用卡欺诈检测的贝叶斯组件

原则上,从数据集中识别信用卡欺诈的贝叶斯组件与我们讨论的许多其他类型的数据管道是相同的。这又回到了本书的基本原则:分布式分析系统总是某种数据管道,某种工作流处理。可以使用不同的布置、配置和技术选择,但是就整体设计而言,它们共享一些基本特性。

12.2.1 信用卡验证基础

我们从信用卡验证的基本原则开始。使用 Luhn 检查可以确定信用卡号码有效,如清单 12-1 所示。

public static boolean checkCreditCard(String ccNumber)
    {
            int sum = 0;
            boolean alternate = false;
            for (int i = ccNumber.length() - 1; i >= 0; i--)
            {
                    int n = Integer.parseInt(ccNumber.substring(i, i + 1));
                    if (alternate)
                    {
                            n *= 2;
                            if (n > 9)
                            {
                                    n = (n % 10) + 1;
                            }
                    }
                    sum += n;
                    alternate = !alternate;

            }
            return (sum % 10 == 0);
    }

Luhn 信用卡卡号验证算法如图 12-3 流程图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12-3。

The simple Luhn credit card validation algorithm .

我们可以将机器学习技术添加到欺诈检测组合中。

看一下图 12-4 中的算法流程图。该过程包括训练阶段和检测阶段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12-4。

Training and detection phases of a credit card fraud detection algorithm

在训练阶段,聚类过程创建数据模型。

在检测阶段,先前创建的模型用于检测(识别)新的输入事件。

训练/检测程序的实现如图 12-5 和图 12-6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12-6。

Starting the Apache Storm supervisor from the command line

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12-5。

Starting Zookeeper from the command line or script is straightforward

您可以运行代码贡献中的完整示例。

12.3 摘要

在这一章中,我们讨论了一个围绕贝叶斯分类器开发的软件组件,专门用于识别数据集中的信用卡欺诈。这个应用程序已经被重做和重新思考了很多次,在这一章中,我们想要展示一个实现,在这个实现中,我们使用了我们在整本书中已经开发的一些软件技术来激发我们的讨论。

在下一章,我们将讨论一个现实世界的应用:用计算机模拟寻找矿产资源。“资源寻找”应用程序是一种常见的程序类型,在这种程序中,对现实世界的数据集进行挖掘、关联和分析,以确定“资源”的可能位置,这可能是从地下的石油到无人机图像中的树木簇,或者显微镜载玻片上的特定类型的细胞。

12.4 参考

贝叶斯统计导论。纽约州纽约市:约翰·威利父子公司,2004 年。

专家系统和概率网络模型。纽约州纽约市:施普林格出版社,1997 年。

阿德南·达威奇。贝叶斯网络建模与推理。纽约州纽约市:剑桥大学出版社,2009 年。

昆切娃,柳德米拉。组合模式分类器:方法和算法。新泽西州霍博肯:威利跨科学,2004 年。

专家系统中的概率推理:理论与算法。纽约州纽约市:约翰·威利父子公司,1990 年。

尚克,罗杰,里斯贝克,克里斯托弗。内部计算机理解:五个程序加缩影。新泽西州希尔斯代尔:劳伦斯厄尔鲍姆联合公司,1981 年。

特里帕蒂,克里希纳·库马尔和拉加,拉塔。“信用卡欺诈检测的混合方法”,国际软计算与工程杂志(IJSCE) ISSN: 2231-2307,第 3 卷,第 4 期,2013 年 9 月。

十三、寻找石油:Apache Mahout 地理数据分析

在本章中,我们将讨论分布式大数据分析的一个特别有趣的应用:使用一个领域模型来寻找有价值矿物的可能地理位置,如石油、铝土矿(铝矿石)或天然气。我们将介绍一些方便的技术包来获取、分析和可视化结果数据,尤其是那些非常适合处理地理位置和其他地理相关数据类型的数据。

Note

在本章中,我们使用 Elasticsearch 版。这个版本还提供了使用 MapQuest 地图可视化的工具,您将在本章和本书的其他地方看到。

13.1 基于域的 Apache Mahout 推理介绍

大数据分析有许多特定于领域的应用,我们可以使用 Apache Mahout 来有效地解决以领域为中心的问题。有时分析过程中涉及的知识库极其复杂;数据集可能不精确或不完整,或者数据模型可能有缺陷,考虑不周,或者根本不适合解决方案需求。Apache Mahout 作为一个久经考验的机器学习基础设施组件,以及它提供备受信任的算法和工具的方式,消除了构建基于领域的系统的一些头痛。

这种以领域为中心的应用程序的一个相关示例是“资源查找器”应用程序类型。这包括处理大量时间戳数据的分析系统(事实上,有时需要几年或几十年);验证、协调和关联数据;然后,通过使用特定领域的数据模型,计算分析(以及作为这些分析的输出的结果数据可视化),以识别特定“资源”(通常在地球或海洋中)的位置。不用说,数据的时间戳、校对和管理,以及地理位置数据的准确处理,是从这样的“资源查找器”系统产生准确、相关和及时的假设、解释、总结、建议和可视化的关键。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-1。

An abstract component view of a geographical data analytics process

在这种类型的系统中,根据可汗的“勘探者专家系统” https://www.scribd.com/doc/44131016/Prospector-Expert-System ,通常使用四种类型的知识源:规则(类似于 JBoss Drools 系统中发现的那些)、语义网和框架(一种有点混合的方法,在 Shank 和艾贝尔森(1981)中彻底讨论过)。像其他面向对象的系统一样,框架支持继承、持久化等等。

如图 16 所示。1 ,我们展示了一个“假设生成器”的抽象视图,通过这种方式,我们可以预测资源位置,例如石油。这个例子的假设生成器是基于 JBoss Drools 的,我们在第八章中讨论过。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-2。

A Mahout-based software component architecture for geographical data analysis

在示例程序中,我们使用一个 DBF 导入程序,如清单 13-1 所示,从 DBF 导入数据。

Elasticsearch 是一个非常灵活的数据仓库,可以导入各种数据格式。

下载一些标准数据集来适应弹性搜索机制。以下是一些示例:

https://www.elastic.co/guide/en/kibana/3.0/snippets/logs.jsonl

以及在

加载样本数据集只是为了最初测试 Elasticsearch 和 Kibana。你可以试试这些:

curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
curl -XPOST 'localhost:9200/shakespeare/_bulk?pretty' --data-binary @shakespeare.json
curl -XPOST 'localhost:9200/_bulk?pretty' --data-binary @logs.jsonl

Note

在前一章中,我们使用 Apache Tika 来读取 DBF 文件。在这一章中,我们将使用 Sergey Polovko (Jamel)的另一种 DBF 读本。你可以从 GitHub 的 https://github.com/jamel/dbf 下载这个 DBF 阅读器。

package com.apress.probda.applications.oilfinder;

import java.io.File;
import java.util.Date;
import java.util.List;

/** We use a standard DBF reader from github.
 *
 */
import org.jamel.dbf.processor.DbfProcessor;
import org.jamel.dbf.processor.DbfRowMapper;
import org.jamel.dbf.utils.DbfUtils;

public class Main {

        static int rownum = 0;

        public static void main(String[] args) {
        File dbf = new File("BHL_GCS_NAD27.dbf"); // pass in as args[0]

        List<OilData> oildata = DbfProcessor.loadData(dbf, new DbfRowMapper<OilData>() {
            @Override
            public OilData mapRow(Object[] row) {

                for (Object o : row) {

                        System.out.println("Row object:  " + o);

                }
                System.out.println("....Reading row: " + rownum + " into elasticsearch....");

                rownum++;

                System.out.println("------------------------");
                return new OilData(); // customize your constructor here
           }
        });

       // System.out.println("Oil Data: " + oildata);
    }
}

/** We will flesh out this information class as we develop the example.
 *
 * @author kkoitzsch
 *
 */
class OilData {

        String _name;
        int _value;
        Date _createdAt;

        public OilData(String... args){

        }

        public OilData(){

        }

        public OilData(String name, int intValue, Date createdAt) {
                _name = name;
                _value = intValue;
                _createdAt = createdAt;
        }

}

Listing 13-1.A simple DBF reader for geological data source information

当然,阅读地理数据(包括 DBF 文件)只是分析过程的第一步。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-3。

A test query to verify Elasticsearch has been populated correctly with test data sets

使用 Elasticsearch-Hadoop 连接器( https://www.elastic.co/products/hadoop ))将 Elasticsearch 与基于 Hadoop 的应用程序组件连接起来。

要了解更多关于 Hadoop-Elasticsearch 连接器的信息,请参考网页 http://www.elastic.co/guide/en/elasticsearch/hadoop/index.html

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-4。

The Elasticserch-Hadoop connector and its relationship to the Hadoop ecosystem and HDFS

我们可以将 Elasticsearch-Hadoop 连接器与 SpatialHadoop 结合使用,为我们想要处理的基于地理位置的数据提供分布式分析功能。

我们可以设定值的阈值,并提供对“兴趣点”(间距、每个类别有多少个兴趣点,以及其他因素)的约束,以生成显示预期结果可能性的可视化。

某些期望结果的证据和概率可以存储在同一个数据结构中,如图 13-5 所示。蓝色区域表示有证据支持预期结果的可能性,在这种情况下,表示存在石油或石油相关产品。红色和黄色圆圈表示假设空间中的高兴趣点和中等兴趣点。如果网格坐标恰好是地理位置,人们可以在类似于图 13-6 和图 13-7 所示的地图上绘制由此产生的假设。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-7。

Using the Spatial Solr Sandbox tool to query a Solr repository for geolocation data

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-6。

Using Kibana and Elasticsearch for map visualiation in Texas example using latitude and logitude, and simple counts of an attribute

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-5。

Probability/evidence grid: a simple example of grid-based hypothesis analytic

我们可以运行简单的测试来确保 Kibana 和 Elasticsearch 正确显示我们的地理位置数据。

现在是时候描述我们的 Mahout 分析组件了。对于这个例子,我们将保持分析非常简单,以概述我们的思维过程。不用说,现实世界资源寻找者的数学模型需要更加复杂,适应性更强,并允许数学模型中有更多的变量。

我们可以使用另一个非常有用的工具,通过 Ryan McKinley 的 Spatial Solr 沙盒工具( https://github.com/ryantxu/spatial-solr-sandbox )来原型化和查看驻留在 Solr 中的一些数据内容。

13.2 智能制图系统和 Hadoop 分析

智能制图(SC)系统是一种特殊类型的基于数据管道的软件应用程序,用于处理卫星图像,将卫星图像与已知精度的图像数据库(称为“地面实况”数据库)进行比较。地面实况数据库提供标准化的地理位置信息(例如矩形图像的四个角的纬度和经度、图像分辨率、比例和方向参数)以及帮助匹配过程的其他信息。

SC 系统向人工评估团队提供有用的图像匹配反馈,并可以帮助工程师和质量保证人员交互式地查看、验证、编辑、注释和比较输入的卫星图像与“地面实况”图像和元数据。由于消除了由于疲劳、观察误差等引起的人为误差,使用 SC 系统可以使一小组分析员在更短的时间内完成一个更大的评估小组的工作,并得到更准确的结果。

SC 系统可以使用各种传感器类型、图像格式、图像分辨率和数据摄取率,并可以使用机器学习技术、基于规则的技术或推理过程来改进和调整特征识别,以便在卫星图像特征(如位置(纬度经度信息)、图像特征(如湖泊、道路、飞机跑道或河流)和人造物体(如建筑物)之间进行更准确和有效的匹配。购物中心或机场)。

SC 系统的用户可以提供关于所计算的匹配的准确性的反馈,这反过来允许随着时间的推移,随着细化的进行,匹配过程变得更加准确。该系统可以专门对用户选择的特征进行操作,例如道路网络或诸如建筑物的人造特征。

最后,SC 匹配过程以报告或仪表板显示的形式向用户提供图像和地面真实数据之间匹配的准确性测量,以及完整的误差和异常值信息。

SC 系统可以提供一种高效且经济的方法来评估卫星图像的质量、精度和图像序列内的一致性,并可以解决高分辨率精度、任务完成时间、可扩展性和卫星图像的近实时处理等问题,以及为各种卫星图像评估任务提供高性能软件解决方案。

以地理位置为中心的系统中包含的一个有用的组件是 Spatial4j ( https://github.com/locationtech/spatial4j ),这是一个为 Java 程序提供空间和地理位置功能的助手库,它是从一些早期的工作(如前面讨论的 Spatial Solr 沙盒工具包)发展而来的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-8。

Running the tests for Spatial4j, a commonly used geolocation java toolkit library

另一个有用的软件库是 SpatialHadoop ( http://spatialhadoop.cs.umn.edu )),这是 Hadoop 本身的一个基于 MapReduce 的扩展。SpatialHadoop 提供空间数据类型、索引和操作,允许使用简单的高级语言来控制基于 Hadoop 的程序对以地理位置为中心的数据的处理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13-9。

Generating a data file for use with SpatialHadoop

13.3 摘要

在本章中,我们讨论了使用大数据分析作为工具来搜索石油和其他自然资源的理论和实践。我们能够加载 DBF 数据,用基于 Mahout =的代码操作和分析数据,并将结果输出到一个简单的可视化工具。我们还讨论了一些包含在任何以地理位置为中心的应用程序中的有用的库,比如 Spatial4j 和 SpatialHadoop。

在下一章,我们将讨论大数据分析的一个特别有趣的领域:使用图像及其元数据作为我们分析管道的数据源。

13.4 参考

乔戈、拉杜、辛曼、马修·李和鲁索、罗伊。弹性搜索在行动。塞瓦斯托波尔,加利福尼亚州:奥赖利出版社,2015 年。

贾科姆利,皮耶罗。阿帕奇看象人食谱。英国伯明翰:PACKT 出版社,2013 年。

肖恩·欧文、罗宾·阿尼尔、泰德·邓宁和艾伦·弗里德曼。看象人在行动。纽约州谢尔特岛:曼宁出版公司,2011 年。

十四、“作为大数据的图像”系统:一些案例研究

在本章中,我们将简要介绍一个示例工具包,即 Image as Big Data Toolkit (IABDT),这是一个基于 Java 的开源框架,用于以可扩展、高度可用且可靠的方式执行各种分布式图像处理和分析任务。IABDT 是过去几年开发的图像处理框架,旨在应对大数据技术的快速发展,尤其是分布式图像处理技术。IABDT 设计为接受多种格式的图像、信号、传感器数据、元数据和视频作为数据输入。

讨论了图像分析、大数据存储以及图像和图像衍生数据的压缩方法的一般架构,以及图像作为大数据分析的标准技术。作为我们的图像分析架构的一个示例实现,IABDT 解决了图像分析开发人员经常遇到的一些挑战,包括将图像导入分布式文件系统或缓存、图像预处理和特征提取、应用分析和结果可视化。最后,我们展示了 IABDT 的一些特性,特别强调了显示、演示、报告、仪表板构建和用户交互案例研究,以激励和解释我们的设计和方法堆栈选择。

14.1 图像作为大数据的介绍

“大数据”软件技术发展的快速变化使得执行图像分析(自动分析和解释来自计算机图像的复杂半结构化和非结构化数据集)变得比以前更加容易、准确、灵活和快速,即使使用最复杂和高性能的单台计算机或数据中心也是如此。包括 Hadoop、Apache Spark 和分布式计算系统在内的“大数据处理范式”使许多应用领域受益于图像分析和将图像作为大数据处理,包括医疗、航空航天、地理空间分析和文档处理应用。模块化、高效和灵活的工具包仍处于形成或实验开发阶段。图像处理组件、数据流控制和图像分析的其他方面的集成仍然是不明确的和尝试性的。大数据技术的快速变化甚至使得选择“技术堆栈”来构建图像分析应用程序都成了问题。为了解决图像分析应用开发中的这些挑战,我们开发了一个专门用于分布式大数据图像分析支持的架构和基线框架实现。

在过去,低级图像分析和机器学习模块被结合在一个计算框架内,以完成特定领域的任务。随着分布式处理框架(如 Hadoop 和 Apache Spark)的出现,可以构建与其他分布式框架和库无缝连接的集成图像框架,其中“图像作为大数据”的概念已经成为框架架构的基本原则。

我们的示例工具包 IABDT 提供了一个灵活的、面向插件的模块化架构。这使得将许多不同的软件库、工具包、系统和数据源结合在一个集成的分布式计算框架中成为可能。IABDT 是一个以 Java 和 Scala 为中心的框架,因为它使用 Hadoop 及其生态系统以及 Apache Spark 框架及其生态系统来执行图像处理和图像分析功能。

IABDT 可与 NoSQL 数据库(如 MongoDB、Neo4j、Giraph 或 Cassandra)以及更传统的关系数据库系统(如 MySQL 或 Postgres)一起使用,以存储计算结果并用作图像处理管道中预处理和后处理阶段生成的中间数据的数据储存库。这些中间数据可能包括要素描述符、影像金字塔、边界、视频帧、辅助传感器数据(如激光雷达)或元数据。像 Apache Camel 和 Spring Framework 这样的软件库可以作为“粘合剂”将组件相互集成。

创建 IABDT 的动机之一是提供一个模块化的可扩展基础设施,用于执行预处理、分析以及分析结果的可视化和报告——特别是针对图像和信号。它们利用了分布式处理的能力(就像 Apache Hadoop 和 Apache Spark 框架一样),并受到 OpenCV、BoofCV、HIPI、Lire、Caliph、Emir、Image Terrier、Apache Mahout 等工具包的启发。表 14-1 总结了这些图像工具包的特征和特性。IABDT 提供框架、模块化库和可扩展示例,使用高效、可配置和分布式数据流水线技术对图像执行大数据分析。

表 14-1。

Mainstream image processing toolkit features and characteristics

| 工具包名称 | 位置 | 工具语言 | 描述 | | --- | --- | --- | --- | | 开放计算机视觉 | opencv.org | 许多语言绑定,包括 Java | 通用编程图像处理工具包 | | BoofCV | boofcv.org | 爪哇 | 基于 Java 的图像处理工具包 | | 嘘嘘嘘嘘嘘嘘嘘嘘嘘嘘嘘嘘嘘嘘 | hipi.cs.virginia.edu | 爪哇 | Hadoop 工具包的图像处理 | | 阅读/卡利夫/埃米尔 | semanticmetadata.net | 爪哇 | 使用 Lucene 的图像搜索工具包和库 | | 影像梗 | imageterrier.org | 爪哇 | 基于 Lucene 搜索引擎的图像索引和搜索 | | Java 高级成像 | oracle.com/technetwork/java/javase/overview/in… | 爪哇 | 通用图像处理工具包,古老但仍然有用 |

如图 14-1 所示,大数据工具包和组件正在成为基于 Apache Hadoop 和 Apache Spark 的其他分布式软件包中的资源。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-1。

Image as Big Data tookits as distributed systems

IABDT 中实现的图 14-1 中模块类型的一些分布式实现包括:

遗传系统。有许多遗传算法特别适合于图像分析 1 ,包括对大型解决方案空间进行采样、特征提取和分类的技术。前两类技术更适用于分析过程和分布式分类技术的图像预处理和特征提取阶段,甚至是那些使用多个分类器的技术。

贝叶斯技术。贝叶斯技术包括大多数机器学习工具包中的朴素贝叶斯算法,还有更多。

Hadoop 生态系统扩展。可以在现有 Hadoop 组件的基础上构建新的扩展,以提供定制的“大数据图像”功能。

聚类、分类和推荐。这三种类型的分析算法存在于大多数标准库中,包括 Mahout、MLib 和 H2O,它们构成了更复杂的分析系统的基础。

混合系统将许多不同类型的组件集成到一个集成的整体中,以执行单一功能。通常,混合系统包含一个控制组件,它可能是基于规则的系统,如 Drools,或者是其他标准的控制组件,如 Oozie,它可能用于调度任务或其他目的,如 Luigi for Python ( https://github.com/spotify/luigi),它带有内置的 Hadoop 支持。如果您想试用 Luigi,请使用 Git 安装 Luigi,并将其克隆到一个方便的子目录中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-2。

Image as Big Data tookits as distributed systems

git clone

https://github.com/spotify/luigi?cm_mc_uid=02629589701314462628476&cm_mc_sid_50200000=1457296715

cd to the bin directory and start the server

./luigid

14.2 使用 HIPI 系统的第一个代码示例

在本节中,我们将介绍 HIPI Hadoop 图像处理系统,并展示一些简单的示例,说明如何将其用作图像的分布式数据处理管道组件。

hipi.cs.virginia.edu 是一个非常有用的基于 Hadoop 的图像处理工具,它起源于弗吉尼亚大学。它与 OpenCV 等更主流的标准图像处理库集成,以 Hadoop 为中心的方式提供广泛的图像处理和分析技术。

HIPI 系统包含了几个用于基本 Hadoop-centric 图像处理任务的基本工具。

这些工具包括创建“HIB”文件(HIPI 图像包)的工具,如图 14-3 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-3。

A HIPI image data flow, consisting of bunding, culling, map/shuffle and reduce to end result

HIPI 映像包或“HIB”是 HIPI 用来将映像分组到一个物理单元中的结构化存储方法。剔除阶段允许根据适当的程序标准过滤掉每个 HIB。被剔除的图像没有被完全解码,这使得 HIPI 管道更加有效。剔除阶段的输出产生如图所示的图像集。每个图像集都有自己的贴图阶段,随后是洗牌阶段和相应的减少步骤,以创建最终结果。因此,如您所见,HIPI 数据流类似于标准的地图缩减数据流过程。我们重现了图 14-4 中的 Hadoop 数据流过程,供您参考。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-4。

A reference diagram of the classic map-reduce data flow, for comparison with 14-3 Installing a Basic Hipi System

下面是基本的 HIPI 安装说明。

  1. 首先,查看 http://hipi.cs.virginia.edu/gettingstarted.html 的“开始使用”页面,了解系统的最新动态和/或变化。

  2. 安装基本的 HIPI 软件,如“入门”页面所示:

    git clone git@github.com:uvagfx/hipi.git
    
    

这将把源代码安装到一个“hipi”目录中。Cd 到这个“hipi”目录和“ls”目录来查看内容。您将需要一个 Gradle 构建工具安装程序来从源代码进行安装。最终的构建将类似于图 14-5 。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-5。

Successful Gradle installation of the HIPI toolkit

Gradle 是另一个有用的安装和构建工具,类似于 Maven。有些系统,比如 HIPI,使用 Gradle 比使用 Maven 等其他技术更容易安装。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-6。

Example using HIPI info utility: Mage info about a 10-image HIB in the HIPI system

然而,安装 HIPI 只是第一步!我们必须将我们的 HIPI 处理器与分析组件集成在一起,才能得出我们的结果。

14.3 BDA 图像工具包利用高级语言功能

使用 Python 等现代解释语言的能力,以及交互式读取-评估-打印循环(REPLs)和函数式编程,是大多数现代编程语言的特性,包括 Java 9、Scala 和交互式 Python。IABDT 使用这些现代编程语言特性使系统更容易使用,结果 API 代码更加简洁。

IABDT 与 Hadoop 2 和 Apache Spark 无缝集成,并使用 Mahout、MLib、H20 和 Sparkling Water 等标准分布式库来提供分析功能。我们讨论的一个案例研究也在 Hadoop 中使用了标准的以 Java 为中心的统计库,比如 R 和 Weka。

14.4 什么是图像数据分析?

图像数据分析应用与一般数据分析相同的一般原则、模式和策略。区别在于数据来源。我们摆脱了分析数字、行项目、文本、文档、日志条目和其他基于文本的数据源的传统观念。与基于文本的数据源不同,我们现在处理的数据要简单得多:信号(本质上是时间序列)和图像(可以是带有 RGB 值的彩色像素的二维图像,甚至是附加了元数据、地理位置和叠加信息的更奇特的图像类型)。

需要专门的工具包来执行基本的图像数据流水线操作。在顶层,提供了许多预编码和可定制的方法来帮助您。这些方法的分类如表 14-2 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-7。

Architecture of the Image as Big Data Toolkit

表 14-3。

Display methods for visualization provided by the IABDT. Most object types in the IABDT may be displayed using similar methods

| 方法名称 | 方法签名 | 利用工具包 | 描述 | | --- | --- | --- | --- | | 显示 | 显示(图像,属性集) | BoofCV |   | | 显示 | 显示(图像金字塔,属性集) | BoofCV |   | | 显示 | 显示(图像集,属性集) | BoofCV |   | | 显示 | 显示(图像、功能集、属性集) | BoofCV |   | | 显示 | 显示(图像、地理位置模型、属性集) | BoofCV |   | | 显示 | 显示(图像、结果集、属性集) | BoofCV |   |

表 14-2。

A selection of methods from the Image as Big Data Toolkit

| 方法名称 | 方法签名 | 输出类型 | 描述 | | --- | --- | --- | --- | | EJRCL | EJRCL(图像,属性集) | 计算结果 | 边缘、交汇点、区域、轮廓和线 | | 创建图像金字塔 | imagePyramid(图像特性集) | 图像金字塔 | 一个图像转换为图像金字塔,参数化 | | 项目贝叶斯 | 项目贝叶斯(图像集,贝叶斯模型,属性集) | BayesianResult 结果 | 将图像集投影到贝叶斯假设空间中 | | 计算统计数据 | 计算机统计(图像,属性集) | 计算结果 | 针对单个图像或图像集或图像金字塔计算的基本统计数据 | | deepLearn | deepLearn(图像集,学习者,属性集) | LearnerResult | 使用标准的分布式深度学习算法来处理图像集或金字塔 | | 多分类 | 多分类(图像集,分类模型,属性集) | 分类结果 | 使用多个分类器对图像集或图像金字塔进行分类 |

图像数据源处理器是负责数据采集、图像清理、格式转换和其他操作的组件,用于将数据“处理”成其他管道组件可接受的格式。

分析引擎组件可以是支持库,如 R 和 Weka。

中间数据源是初始分析计算的输出。

用户控制仪表板是一个事件处理程序、交互式组件。

控制和配置模块由 Drools 之类的规则组件或其他规则引擎或控制组件组成,并且可能包含用于诸如调度、数据过滤和细化以及整个系统控制和配置任务之类的任务的其他“助手”库。通常,动物园管理员和/或馆长可以用于协调和编排控制和配置任务。

分布式系统基础结构模块包含底层支持和“助手”库。

持久结果储存库可以是各种类型的数据接收器中的任何一种,包括关系型、图形型或 NoSQL 型数据库。如果合适,也可以使用内存中的键值数据存储。

报告模块通常由老式的分析结果的表格或图表表示组成。

用户交互、控制和反馈是由 IABDT 交互模块提供的,它包括用于常见用例的默认仪表板。

可视化模块由支持库组成,用于显示图像、叠加图、特征位置和其他可视化信息,使交互和理解数据集更加容易。

14.5 交互模块和仪表板

为分布式图像处理系统开发适当的显示器和仪表板的能力是对已完成实现的评估、测试、概念验证和优化的必要辅助。

IABDT 直接支持构建基本的用户界面和仪表板。一个简单的用户界面如图 14-8 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-8。

A simple user interface build with the IABDT

相同对象的统一视图、处理图像序列的图像显示和图像叠加功能都由 IABD 工具包提供。

仪表板、显示器和交互式界面——包括独立应用程序和基于网络的界面——可通过 IABDT 用户界面构建模块构建。原型 IABDT 支持标准类型的显示,包括覆盖和地理位置数据。

14.6 添加新的数据管道和分布式特征发现

使用 IABDT 设计新的分析数据流非常简单。来自算法的等式可以被转换成独立代码,以及从独立代码转换成 map/reduce 实现,利用为与 Hadoop/Spark 生态系统集成而提供的许多工具包,包括弗吉尼亚大学的 HIPI 系统(hipi.cs.virginia.edu),如下所述。

已经为基于 Spark 的系统明确开发了一些分布式图像处理功能,因此在这里可能需要稍微偏离一下 Apache Spark 与 Hadoop 的争论。最近在文献中有一些关于 Apache Spark 是否已经杀死了 map/reduce 范式以及“杀死”了 Hadoop 生态系统的有用性的争论(例如,Apache Mahout 库最初只支持 map/reduce,但后来发展到支持 Apache Spark 甚至 H20)。随着 IABDT 原型系统的发展和开发,我们改变了自己的观点(随着时间的推移,Apache Spark 越来越成为一股不可忽视的力量),并逐渐认识到 Hadoop 和 Spark 是密切互补的技术,根本不应该分开。因此,我们将 IABDT 工具包设计为一个模块化和极其灵活的系统,以便我们可以轻松地使用 Hadoop 生态系统组件和 Spark 组件,即使在“混合”数据流开发中同时使用 Hadoop 和 Spark 技术,其中来自 M/R 和内存(Hadoop 和 Spark)处理的组件合作提供最终结果。

14.7 示例:分布式特征发现算法

可以使用所谓的“Hu 矩”的概念来构建分布式特征发现算法

Hu 矩用于计算特征形状。

按照 Kulkani (1994)的说法,我们可以用下面的几个方程来表达这一数学问题。

标准几何矩可以计算如下:

)

其中 g(x,y)是图像 g 的二维索引。所谓的中心矩可以定义为

)

其中 x’ = m 10 /m 00 ,y’ = m 01 /m00

并且当针对比例不变性进行归一化时。

)

其中

)

旋转和缩放不变的中心矩可以刻画如下:胡:

)

)

)

)

)

)

)

Hadoop 中的 map/reduce 任务可以根据矩方程显式编码,首先用 java 进行实验,以测试程序逻辑并确保计算值符合预期,然后转换为适当的 map/reduce 结构。清单 14-1 中显示了 java 实现的草图。我们使用一个标准的 java 类 com . a press . prob da . core . computational result 来保存答案和“质心”(也是由我们的算法计算的):

public ComputationResult computeMoments(int numpoints, double[] xpts, double[] ypts)
    {
         int i;
           // array where the moments go
            double[] moments = new double[7];
         double xm.ym,x,y,xsq,ysq, factor;
         xm = ym = 0.0;
             for (i = 0; i<n; i++){
                        xm += xpts[i];
                        ym += ypts[i];
                }
        // now compute the centroid
        xm /= (double) n;
        ym /= (double) n;
        // compute the seven moments for the seven equations above
        for (i=0; i<7; i++){
        x =xpts[i]-xm;
        y = ypts[i]-ym;
        // now the seven moments
        moments[0] += (xsq=x*x); // mu 20
        moments[1] += x*y;       // mu 11
        moments[2] += (ysq = y * y); // mu 02
        moments[3] += xsq *x;        // mu 30
        moments[4] += xsq *y;        // mu 21
        moments[5] += x * ysq;       // mu 12
        moments[6] += y * ysq;       // mu 03
        }
// factor to normalize the size
        factor = 1.0 / ((double)n *(double)n);
        // second-order moment computation
        moments[0] *= factor;
        moments[1] *= factor;
        moments[2] *= factor;
        factor /= sqrt((double)n);
        // third order moment computation
        moments[3] *= factor;
        moments[4] *= factor;
        moments[5] *= factor;
        moments[6] *= factor;
        // a variety of constructors for ComputationalResult exist.
// this one constructs a result with centroid and
//moment array. ComputationResult instances are persistable.
        return new ComputationResult(xm, ym, moments);
    }
Listing 14-1.Moment computation in Java

从这个简单的 java 实现中,我们可以实现带有签名的 map、reduce 和 combine 方法,如清单 14-2 所示。

// Method signatures for the map() and reduce() methods for
// moment feature extraction module
public void map(HipiImageHeader header, FloatImage image, Context context) throws IOException,
      InterruptedException

public void reduce(IntWritable key, Iterable momentComponents, Context context)
      throws IOException, InterruptedException

Listing 14-2.HIPI map/reduce method signatures for moment feature extraction computation

让我们回忆一下第十一章的显微镜例子。在某些方面,这是一个非常典型的非结构化数据管道处理分析问题。正如您所记得的,图像序列最初是一个有序的图像列表,它们可以按时间戳或更复杂的方式排列,如地理位置、立体配对或重要性顺序。您可以想象在一个医疗应用程序中,可能有几十个同一患者的医学图像,那些有威胁生命的异常情况应该尽快出现在队列的前面。

其他图像操作可能是分布式处理的良好候选,例如清单 14-3 中用 BoofCV 编码的 Canny edge 操作。

package com.apress.iabdt.examples;

import java.awt.image.BufferedImage;

import java.util.List;

import com.kildane.iabdt.model.Camera;

import boofcv.alg.feature.detect.edge.CannyEdge;

import boofcv.alg.feature.detect.edge.EdgeContour;

import boofcv.alg.filter.binary.BinaryImageOps;

import boofcv.alg.filter.binary.Contour;

import boofcv.factory.feature.detect.edge.FactoryEdgeDetectors;

import boofcv.gui.ListDisplayPanel;

import boofcv.gui.binary.VisualizeBinaryData;

import boofcv.gui.image.ShowImages;

import boofcv.io.UtilIO;

import boofcv.io.image.ConvertBufferedImage;

import boofcv.io.image.UtilImageIO;

import boofcv.struct.ConnectRule;

import boofcv.struct.image.ImageSInt16;

import boofcv.struct.image.ImageUInt8;

public class CannyEdgeDetector {

        public static void main(String args[]) {
                BufferedImage image = UtilImageIO

                                .loadImage("/Users/kerryk/Downloads/groundtruth-drosophila-vnc/stack1/membranes/00.png");

                ImageUInt8 gray = ConvertBufferedImage.convertFrom(image, (ImageUInt8) null);
                ImageUInt8 edgeImage = gray.createSameShape();

                // Create a canny edge detector which will dynamically compute the
                // threshold based on maximum edge intensity
                // It has also been configured to save the trace as a graph. This is the
                // graph created while performing
                // hysteresis thresholding.
                CannyEdge<ImageUInt8, ImageSInt16> canny = FactoryEdgeDetectors.canny(2, true, true, ImageUInt8.class, ImageSInt16.class);
                // The edge image is actually an optional parameter. If you don't need
                // it just pass in null
                canny.process(gray, 0.1f, 0.3f, edgeImage);
                // First get the contour created by canny

                List<EdgeContour> edgeContours = canny.getContours();
                // The 'edgeContours' is a tree graph that can be difficult to process.
                // An alternative is to extract
                // the contours from the binary image, which will produce a single loop
                // for each connected cluster of pixels.
                // Note that you are only interested in external contours.
                List<Contour> contours = BinaryImageOps.contour(edgeImage, ConnectRule.EIGHT, null);
                // display the results
                BufferedImage visualBinary = VisualizeBinaryData.renderBinary(edgeImage, false, null);
                BufferedImage visualCannyContour = VisualizeBinaryData.renderContours(edgeContours, null, gray.width, gray.height, null);
                BufferedImage visualEdgeContour = new BufferedImage(gray.width, gray.height, BufferedImage.TYPE_INT_RGB);
                VisualizeBinaryData.renderExternal(contours, (int[]) null, visualEdgeContour);
                ListDisplayPanel panel = new ListDisplayPanel();
                panel.addImage(visualBinary, "Binary Edges");
                panel.addImage(visualCannyContour, "Canny GraphTrace");
                panel.addImage(visualEdgeContour, "Canny Binary Contours");
                ShowImages.showWindow(panel, "Image As Big Data Toolkit Canny Edge Extraction: ", true);
        }
}

Listing 14-3.Canny Edge Detection Using BoofCV, before parallelization

兴趣点是定义明确、稳定的图像空间位置,具有“特定的兴趣”例如,你可能会注意到图 14-9 中感兴趣的点出现在连接图像中其他结构的连接点处。角点、交叉点、轮廓和模板可以用来识别我们在图像中寻找的内容,并且可以对我们找到的结果进行统计分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-9。

Finding interest points in an image: the circled + signs are the interest points

IABDT 的典型输入过程如图 14-10 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-10。

Input process for IABD Toolkit, showing image preprocessing components

数据流管道可以以“批处理模式”或“流模式”处理数据源。数据源预处理器是。图像数据源预处理器可以执行以图像为中心的预处理,例如特征提取、区域识别、图像金字塔构建和其他任务,以使流水线的图像处理部分更容易。

14.8 IABD 工具包中的低级图像处理器

低级图像处理例程是 IABDT 的重要组成部分。大多数标准图像处理库,包括 JAI、OpenCV 和 BoofCV,都可以无缝地与 IABDT 一起使用,使用 Maven 对 IABDT pom.xml 文件的依赖性。IABDT 最初提供的一些标准低级图像处理包括傅立叶算子。傅立叶算子将图像数据映射到频率空间,如下式所示:

)

精明的边缘算子。Canny 算子可以通过高斯平滑、Sobel 算子——非最大抑制阶段、阈值处理(具有滞后——一种特殊的阈值处理)来连接边缘点的步骤来近似。提取的二维形状可以保存到 IABDT 数据源。

直线、圆和椭圆提取运算符。存在用于从二维图像数据中提取直线、圆和椭圆形状图元的特征提取算法。工具包中包含了几个示例实现。

14.9 术语

下面是与图像处理和“图像作为大数据”概念相关的一些术语的简要总结。

基于代理的系统:合作多代理系统,或代理,是设计和实现 IABD 系统的有效方法。各个代理节点进程在一个编程的网络拓扑中合作,以实现共同的目标。

贝叶斯图像处理:使用贝叶斯技术的基于阵列的图像处理通常涉及用贝叶斯网络进行构建和计算,贝叶斯网络是一个图,其中的节点被视为随机变量,图的边是条件依赖关系。随机变量和条件依赖是来自基本贝叶斯统计的标准贝叶斯概念。继奥珀和温瑟之后,我们可以将贝叶斯最优预测刻画为

)

目标假设、预测和传感器融合是贝叶斯图像处理的典型问题领域。

分类算法:IABDT 中的分布式分类算法包括大间隔和小间隔(间隔是分类的置信度)分类器。包括遗传算法、神经网络、增强和支持向量机(SVMs)在内的多种技术可用于分类。分布式分类算法,如标准 k-means 或模糊 k-means 技术,包含在标准支持库中,如 Apache Mahout。

深度学习(DL):机器学习的一个分支,基于基于学习的数据表示,以及对高级数据抽象进行建模的算法。深度学习使用多个复杂的处理级别和多个非线性转换。

分布式系统:基于网络硬件拓扑上的消息传递架构的软件系统。分布式系统可能部分由诸如 Apache Hadoop 和 Apache Spark 之类的软件框架实现。

图像作为大数据(IABD):IABD 概念要求在某些方面将信号、图像和视频视为任何其他“大数据”来源,包括“多样性、容量、速度和准确性”的 4V 概念基础。IABD 的特殊要求包括各种自动处理,如压缩、格式转换和特征提取。

机器学习(ML):机器学习技术可以用于各种图像处理任务,包括特征提取、场景分析、对象检测、假设生成、模型建立和模型实例化。

神经网络:神经网络是一种模拟人类高级推理的生物模型的数学模型。许多类型的分布式神经网络算法对于图像分析、特征提取以及从图像建立二维和三维模型是有用的。

本体驱动的建模:本体作为对模型中的实体以及这些实体之间的关系的描述,可以被开发来驱动和通知建模过程,其中模型精化、元数据、甚至新的本体形式和模式都作为建模过程的输出而发展。

传感器融合:将来自多个传感器或数据源的信息组合成一个集成的、一致的、同质的数据模型。传感器融合可以通过多种数学技术来完成,包括一些贝叶斯技术。

分类学:建立目录的分类和命名方案。通过利用分类法和相关的本体数据结构和处理技术,可以帮助定义、生成或建模对象的层次结构。

14.10 摘要

在本章中,我们讨论了“图像作为大数据”的概念,以及为什么它是大数据分析技术领域中的一个重要概念。描述了新的图像作为大数据工具包(IABDT)的当前架构、功能和用例。其中,Apache Hadoop 和 Apache Spark 的互补技术及其各自的生态系统和支持库已被统一起来,以提供低级图像处理操作,以及复杂的图像分析算法,可用于开发分布式、定制的图像处理管道。

在下一章中,我们将讨论如何使用我们在本书前几章中学到的许多技术和技术堆栈来构建一个通用的数据处理管道。

14.11 参考

阿克勒,塞利姆 G. (1989)。并行算法的设计与分析。新泽西州恩格尔伍德悬崖:普伦蒂斯霍尔。

j .阿洛伊莫诺斯和 d .舒尔曼(1989 年)。视觉模块的集成:Marr 范式的扩展。加利福尼亚州圣地亚哥:学术出版专业公司。

n . aya che(1991 年)。移动机器人的人工视觉:立体视觉和多感官知觉。麻省剑桥:麻省理工学院出版社。

巴乔博士、埃马米博士、埃斯科里瓦博士、马哈茂德博士、莱夫根博士、萨拉吉博士(2011 年)。通过实际的计算机视觉项目掌握 OpenCV。英国伯明翰:PACKT 出版公司。

巴尔博萨瓦尔米尔。(1996).分布式算法介绍。麻省剑桥:麻省理工学院出版社。

伯格,m .,昌,o .,克雷瓦尔德,V. M .,奥维马斯,m .(编辑。).(2008).算法与应用。柏林海德堡,德国:施普林格出版社。

贝兹德克,J. C .,帕尔,S. K. (1992 年)。(艾德。)模式识别的模糊模型:在数据中搜索结构的方法。纽约州纽约市:IEEE 出版社。

布莱克和尤耶。).(1992).主动视觉。麻省剑桥:麻省理工学院出版社。

布莱洛克,通用电气公司(1990 年)。数据并行计算的矢量模型。麻省剑桥:麻省理工学院出版社。

伯格,w .,&伯格,M. J。).(2016).数字图像处理:使用 Java 的算法介绍,第二版。英国伦敦:斯普林格出版社伦敦。

戴维斯,E.R .(编辑。).(2004).机器视觉:理论,算法,实用性。第三版。英国伦敦:摩根·考夫曼出版社。

福杰拉斯(1993 年)。三维计算机视觉:几何观点。麻省剑桥:麻省理工学院出版社。

弗里曼。) (1988).算法、架构和系统。马萨诸塞州波士顿:学术出版社。

贾科姆利,皮耶罗。(2013).阿帕奇看象人食谱。英国伯明翰:PACKT 出版公司。

格里姆森;t .洛扎诺-佩兹;Huttenlocher 博士(1990 年)。计算机识别物体:几何约束的作用。麻省剑桥:麻省理工学院出版社。

古普塔,阿希什。(2015).学习 Apache Mahout 分类。英国伯明翰:PACKT 出版公司。

Hare,j .,Samangooei,s .和 Dupplaw,D. P. (2011 年)。OpenIMAJ 和 ImageTerrier:用于可伸缩多媒体分析和图像索引的 Java 库和工具。第 19 届 ACM 多媒体国际会议论文集(MM '11)。美国纽约州纽约市 ACM,691-694。DOI = 10.1145/2072298.2072421http://doi.acm.org/10.1145/2072298.2072421

库尔卡尼(1994 年)。用于图像理解的人工神经网络。纽约州纽约市:范·诺斯特兰德·赖因霍尔德。

Kumar,v .,Gopalakrishnan,P.S .,Kanal,l .(编辑).(1990).机器智能和视觉的并行算法。纽约州纽约市:斯普林格出版社纽约公司。

Lud milla I . Kun cheva(2004 年)。组合模式分类器:方法和算法。美国新泽西州霍博肯:约翰·威利父子公司。

Laganiere,R. (2011 年)。OpenCV 2 计算机视觉应用编程食谱。英国伯明翰:PACKT 出版公司。

林德布拉德,t .金瑟,J.M。).(2005).使用脉冲耦合神经网络的图像处理,第二版,修订版。德国柏林海德堡,英国:施普林格出版社柏林海德堡。

Lux,M. (2015)。LIRE: Lucene 图像检索。2016 年 5 月 4 日检索自 http://www.lire-project.net/

Lux,M. (2015)。哈里发和埃米尔:MPEG-7 图像注释和检索 GUI 工具。哈里发-哈里发和埃米尔-基图布。第 17 届 ACM 多媒体国际会议论文集。美国计算机学会,2009 年。2016 年 5 月 4 日检索自 https://github.com/dermotte/CaliphEmir

Mallat,s .(编辑) (2009).一个小波信号处理之旅,稀疏方式。美国马萨诸塞州伯灵顿:爱思唯尔公司。

Mallot,H. A .,Allen,J.S .).(2000).计算视觉:感知和视觉行为中的信息处理,第二版。美国马萨诸塞州剑桥:麻省理工学院出版社。

t .马斯特斯(2015 年)。C++和 CUDA C 中的深度信念网第 1 卷:受限玻尔兹曼机器。作者发布:TimothyMasters.info

-c++和 CUDA C 中的深度信念网,第二卷:复数域中的自动编码。(2015).作者发布:TimothyMasters.info

尼克森硕士和阿瓜多硕士(2012)。计算机视觉的特征提取和图像处理,第三版。英国牛津:学术出版社爱思唯尔有限公司。

彭特兰,亚历克斯。(1986).从像素到谓词:计算和机器人视觉的最新进展。新泽西州诺伍德:Ablex 出版公司。

里夫,迈克(编辑。).(1989).并行处理和人工智能。英国奇切斯特:约翰·威利父子公司。

南安普顿大学 (2011-2015)。ImageTerrier 图像检索平台。2016 年 5 月 4 日检索自 http://www.imageterrier.org/

Tanimoto 和 and Kilnger(编辑).(1980).结构化计算机视觉:通过层次结构的机器感知。纽约:学术出版社。

乌尔曼,西蒙。(1996).高级视觉:物体识别和视觉认知。麻省剑桥:麻省理工学院出版社。

弗吉尼亚大学计算机图形实验室(2016)。HIPI-Hadoop 图像处理接口。2016 年 5 月 4 日检索自 http://hipi.cs.virginia.edu/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值