首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 MapReduce 和 InfoSphere BigInsights 对各种文档类型进行处理和内容分析(1)

使用 MapReduce 和 InfoSphere BigInsights 对各种文档类型进行处理和内容分析(1)

本文将介绍如何使用 IBM InfoSphere BigInsights                                分析各种类型的大量文档。对于接收不同格式的数据(例如法律文档、电子邮件和科学文章)的行业,InfoSphere BigInsights                                可提供复杂的文本分析功能来帮助进行情绪预测、欺诈检测和其他高级数据分析。
学习如何集成 Apache Tika(一种可以提取文档的文本内容的开源库)与 InfoSphere BigInsights(构建于 Hadoop                                平台之上,可扩展到数千个节点来分析数十亿个文档)。通常,Hadoop 用于处理大型文件,所以本文将介绍如何在大量小文档上高效地运行作业。您可以使用这里的步骤在 Jaql                                创建一个模块来实现该集成。Jaql 是 Hadoop 中的一种处理数据的灵活语言。基本上讲,Jaql 是 MapReduce 上的一层,支持轻松地分析和操作                                Hadoop 中的数据。将 Jaql 模块与 Tika 相结合,使得在一个步骤中读取各种文档和使用 InfoSphere BigInsights                                的分析功能(比如文本分析和数据挖掘)变得很容易,无需深厚的编程经验。
本文假设您对 Java™ 编程语言、 有一定的理解。有关这些技术的详细信息不属于本文的讨论范围,本文只重点介绍必须更新来容纳自定义代码的代码节。文中使用的示例数据。
概述:InfoSphere BigInsights、Tika、Jaql 和 MapReduce                                类InfoSphere BigInsights 构建于 Apache Hadoop 之上,并通过企业特性、分析功能和管理特性对 Apache Hadoop                                进行了增强。Apache Hadoop 是一个开源项目,它使用商用服务器集群来实现对大量数据的处理。它可以从一个节点扩展到数千个节点,而且具有容错功能。Hadoop                                可被视为一个笼统的词汇。它包含两个主要组件:
  • 分布式文件系统 (HDFS) 存储数据
  • MapReduce 框架处理数据
MapReduce 是一种编程范例,支持跨整个 Hadoop 集群的并行处理和大规模扩展能力。Hadoop                                中的数据首先被分解为更小的部分,比如数据块,并分布在集群之上。然后,MapReduce 能够以并行方式分析这些数据块。
Apache Tika工具包是一个免费的开源项目,用于从各种类型的数字文档(比如 Word                                文档、PDF 文件或富文本格式的文件)读取和提取文本和其他元数据。要查看 API 工作原理的基本示例,可以了解创建 Tika                                类的一个实例并使用该实例打开一个流。
清单 1. Tika                                示例
1
2
3
4
5
6
7
8
9
import org.apache.tika.Tika;
...
private String read()
{
    Tika tika = new Tika();
    FileInputStream stream = new FileInputStream("/path_to_input_file.PDF");
    String output = tika.parseToString(stream);
    return output;
}




如果您的文档格式不受 Tika 支持(例如 Outlook PST 文件就不受支持),那么您可以在前面的代码清单中将它替换为一个不同的 Java 库。Tika                                提供了提取元数据的能力,但这不属于本文的讨论范围。向代码中添加该功能相对比较简单。
JaqlJaql 主要是一种 JSON 查询语言,但它支持的不仅仅是 JSON。它支持您处理结构化和非传统的数据。使用 Jaql,您可以采用一种类似混合使用 Pig 和 Hive                                的方式,选择、联结、分组和过滤 HDFS 中存储的数据。Jaql 查询语言的灵感来源于许多编程和查询语言,包括 Lisp、SQL、XQuery 和 Pig。Jaql                                是一个函数式的声明性查询语言,专为处理大型数据集而设计。在并行性方面,Jaql 会在适当的时候将高级查询重写为包含 Java MapReduce                                作业的低级查询。本文将演示如何在 Apache Tika 之上创建一个 Jaql I/O 适配器,以便读取各种文档格式,并在这一种语言中分析和转换它们。
用于分析小文件的 MapReduce 类通常,MapReduce 将会处理存储在 HDFS 上的大型文件。在写入 HDFS 时,会根据 Hadoop                                集群的配置将文件分解成较小的部分(数据块)。这些数据块位于这个分布式文件系统上。但是,如果需要使用 Hadoop 高效地处理大量小文件(具体地讲,是                                PDF 或 RTF 文件等二进制文件),应该怎么办?
有多种途径可供选择。在许多情况下,可以通过创建一个序列文件 将小文件合并到一个大文件中,序列文件是针对 Hadoop                                的原生存储格式。但是,在一个线程中创建序列文件可能会遇到瓶颈,您会面临着丢失原始文件的风险。本文提供了一种操作 MapReduce 中使用的一些 Java                                类的不同方法。传统的类要求每个文件都有一个专用的映射器。但在有许多小文件时,这个过程会导致效率低下。
InfoSphere BigInsights Quick Start EditionInfoSphere BigInsights Quick Start Edition 是一个免费的、可下载的 InfoSphere BigInsights                                        版本,是 IBM 基于 Hadoop 的产品。使用 Quick Start Edition,您可以尝试 IBM 为了提高开源 Hadoop                                        的价值而构建的特性,比如 Big SQL、文本分析和 BigSheets。为了让您的体验尽可能顺利,我们提供了引导式学习,包括分步的自学教程和视频,帮助您开始让                                        Hadoop 为您工作。没有时间或数据的限制,您可以自己选择时间使用大量数据进行实验。

作为传统类的替代方案,可以在 Hadoop 中处理小文件,创建一组自定义类来告知任务,这些文件很小,可以采用与传统方法不同的方式来对待它们。
在映射阶段,定义了称为碎片 (split)                                的逻辑容器,而且在每个碎片上放置了一个映射处理任务。可以使用自定义类定义一个固定大小的碎片,在其中填入它可以容纳的任意多个小文件。碎片装满后,作业会创建一个新碎片并进行填充,直到该碎片被装满。然后,每个碎片会被分配给一个映射器。
读取文件的 MapReduce 类在一个 MapReduce 作业期间,可以使用 3 个主要的 MapReduce Java                                        类来定义碎片并读取数据:InputSplit、InputFormat 和                                        RecordReader。
将文件从一个本地文件系统传输到 HDFS 时,该文件会被转换为 128 MB 大小的数据块。(可以在 InfoSphere BigInsights                                中更改这个默认值。)设想一个大到可占用 10 个数据块的文件。从 HDFS 读取该文件作为 MapReduce                                作业的输入时,这些数据块通常会逐个映射到碎片。在这种情况下,该文件被拆分为 10 个碎片(这意味着有 10                                个任务)来处理。默认情况下,数据块大小和碎片大小相同,但这些大小取决于 InputSplit 类的配置设置。
从 Java 编程角度讲,负责此转换的类称为 InputFormat,它是从 HDFS 读取数据的主要入口点。根据文件的数据块,它创建了一个                                        InputSplits 列表。对于每个碎片,都会创建一个映射器。然后,使用 RecordReader                                类将每个 InputSplit 分解为记录。每个记录表示一个键-值对。
对比 FileInputFormat 与                                        CombineFileInputFormat在运行 MapReduce 作业之前,可以指定要使用的 InputFormat 类。要实现                                        FileInputFormat,则需要您创建 RecordReader                                        的一个实例,而且前面已经提到过,RecordReader 会为映射器创建键-值对。
FileInputFormat 是一个抽象类,它是 InputFormat                                的大多数实现的基础。它包含输入文件的位置,以及从这些文件生成碎片的过程的实现。将碎片转换为键-值对的方式是在子类中定义的。它的子类的一些示例包括                                        TextInputFormat、KeyValueTextInputFormat 和                                        CombineFileInputFormat。
Hadoop 处理大文件(占用多于一个 数据块的文件)的效率更高。FileInputFormat                                        将每个大文件都转换为碎片,而且创建的每个碎片都包含一个文件的一部分。前面已经提到过,会为每个碎片生成一个映射器。图 1                                描绘了如何在映射阶段如何使用 FileInputFormat 和 RecordReader 处理文件。
图 1. 使用 FileInputFormat 处理大文件但是,当输入文件小于默认的数据块大小时,会创建许多碎片(从而会创建许多映射器)。这种安排会降低作业的效率。 图 2                                显示了在为许多小文件使用 FileInputFormat 时,会创建太多的映射器。
图 2. 使用 FileInputFormat 处理许多小文件为了避免出现这种情形,我们引入了 CombineFileInputFormat。这个 InputFormat                                能够很好地处理小文件,因为它将许多文件打包到一个碎片中,所以映射器更少,而且每个映射器有更多的数据要处理。不同于                                        FileInputFormat 的其他子类,CombineFileInputFormat                                是一个抽象类,在使用它之前需要执行额外的更改。除了这些更改之外,您必须确保已阻止对输入进行拆分。 图 3 显示了                                        CombineFileInputFormat 如何处理小文件,以便创建更少的映射器。
图 3. 使用 CombineFileInputFormat                                        处理许多小文件用于写入文件的 MapReduce 类需要将文档的文本内容保存在容易在 Hadoop                                中处理的文件中。可以使用序列文件,但在本例中,创建了分隔的文本文件,在每条记录中包含了一个文件的内容。此方法使内容很容易读取,很容易在下游的 MapReduce                                作业中使用。用于在 MapReduce 中写入文件的 Java 类是 OutputFormat 和                                        RecordWriter。这些类类似于 InputFormat 和                                        RecordReader,但它们用于输出。FileOutputFormat 实现了                                        OutputFormat。它包含输出文件和目录的路径,而且包含必须如何运行写入作业的指令。
RecordWriter 在 OutputFormat                                类中创建,定义从映射器传递的每条记录写入到输出路径中的方式。
返回列表