本文针对 IBM 最新开发的数据分析平台进行概要介绍并对其应用进行指导说明。随着信息技术应用范围的不断扩展,对数据进行挖掘分析的需求日益增加,但是信息量的不断增大及其应用构建的复杂性日益却成为了传统数据分析的一个瓶颈。IBM 构建的数据分析平台针对上述问题,基于 Hadoop 技术,对数据查询语言,数据分析软件,数据库,作业调度模块进行了有效整合,实现了对数据的有效、高效处理,保证了高度的扩展性和兼容性。
数据分析背景及其传统数据分析平台的问题起源
在当今信息爆炸的时代,企业需要对越来越多的数据进行访问和处理。除了传统的在线交易处理系统和管理信息系统外,半结构化和无结构化的数据呈现出了更快速的增长趋势,例如企业内部的 email 归档,call center 对话记录,客户反馈记录,企业内部网络应用,合作管理系统以及,企业的外部门户网站点击记录,基于 Feed 的市场信息等等。
如何更加有效的低成本的处理这些大量的数据(数据量从几个 Tera 字节到 Peta 字节)从而和商业智能相结合以挖掘出对企业有益的信息并帮助用户作出更准确的决策是一个急需解决的问题。
目前传统的数据分析平台(ETI 引擎,数据仓库和集市等技术)主要是针对结构化的数据进行在线数据分析应用,这种数据处理模式面临着对大量数据和半结构化的数据处理能力不足和不能承受服务器扩展的的复杂性的问题,为此,Google 实现了一个能够有效利用大量成本低廉的 PC 机和服务器的 Mapred 编程模型和框架并于 2004 年发表了相应的论文,此框架提供自动容错和恢复功能并且能够保证整个系统的高度可扩展性,而 Hadoop 作为 Mapred 的 Open source 的实现已经被越来越多的企业特别是 Internet 公司采用作为基本的分析和查询的基础架构,比如百度,Facebook, Yahoo !等。
IBM 对于 Hadoop 的研究开始于 2-3 年前,截止到目前,研究成果涉及到作业调度,查询语言等多个方面。在这些研究的基础上,IBM 启动了 BigInsights 项目并于 2011 年 5 月发布了 Basic Edition 和 Enterprise Edition 并且还将集成更多 IBM 的产品与组件,其系统结构图如图 1 所示。
![BigInsights](https://i-blog.csdnimg.cn/blog_migrate/2c4297758a892b113a60c19c006b7c03.jpeg)
从上面的 BigInsights 产品战略示意图中可以看到,平台的最低层依赖于由多台普通 PC 或者服务器组成的集群 , 也就是说用户并不需要通过不断的购买或者升级目前的大型服务器的性能来实现更大数据量的处理,而只需要利用一些闲置的普通机器对目前的集群进行扩展 (scale-up 方式 )。
另外,此平台除了支持 Hadoop 应用程序主要基于的 HDFS 存储系统外,还将对 IBM 最新推出的 GPFS SNC (Shared Nothing Cluster) 平台进行支持以更好的利用其强大的灾难恢复,高可靠性,高扩展性的优势,其实现依赖于 Hadoop 本身提供的抽象 API 接口。为了对这些存储系统的数据能够进行有效地分析,BigInsights 平台集成了 IBM 最新推出的大数据量处理分析系统 BigSheets, 用来方便的抓取转瞬即逝的信息并进行保存分析,除此之外,为了使用户自己能够方便的定制自己的查询功能,BigInsights 还提供了能够直接对存储系统的数据进行读取及其他操作的查询语言 Jaql, 这些也是 Biginsight 发布的重点特性,也是本文进行介绍的重点。在 BigSheets,Jaql 和底层的存储系统之间,BigInsights 使用了任务调度器来调度多个作业的同时运行。
此外,从上图中可以看到 ,BigInsights 不但考虑到了单独对数据进行处理的能力,还考虑到了和传统数据库软件、传统数据分析软件集成的能力,另外也提供了对系统进行管理监控等功能。下面的章节将集中在 BigInsights 的应用模块 (Jaql,biggSheets, Jaql 和 DB2 的集成 ) 进行阐述。
BigInsights 平台的查询语言和对传统数据库的支持
1. Jaql--BigInsights 平台提供的查询语言
作为一个优秀的并行计算平台,Hadoop 虽然已经被广泛验证,但是在 Hadoop 上开发 MapReduce 程序需要较长的开发周期,开发人员需要充分理解 MapReduce 计算框架和 HDFS 文件系统的原理和实现才能编写出性能较好的 MapReduce 程序。作为下一代数据分析平台的重要基础,人们也一直在探讨是否可以提供一种类 SQL 的描述性语言来屏蔽 MapReduce 的实现细节,从而让开发人员可以能够更加关注业务逻辑本身而不是计算机程序的实现,目前应用的比较广泛的有 Pig 和 Hive。Pig 提供了一种基于 PigLatin 的描述性语言,Hive 则提供了一种类 SQL 的描述性语言,而 IBM BigInsights 则集成了另外一种描述性语言,JAQL(Json Analysis Query Language)。JAQL 以 Json 数据类型为基础,采用一种在 Linux 系统中广泛应用的 Pipeline 模式来定义数据流的走向,如下例所示:
read(hdfs('foo'))->transform $.id ->write(hdfs('ids'));
上例中,我们先从 HDFS 文件 foo 中读出所有的数据,然后取得每个记录的 id 属性,把它们组成一个数组写到 HDFS 文件 ids 中。因为读操作的对象是一个 HDFS 文件 ( 可能会非常大,由很多个 HDFS 的 block 单元组成 ),JAQL 会根据 HDFS 支持并发读取的特点,将该操作重构为一个 MapReduce 过程,transform 方法被实现为一个 map 任务,分布到整个集群中来执行。
每个 map 任务分别读取 foo 的一个 block 单元,然后生成一个 ids 的 block 单元。最后从用户的角度来看,生成的 ids 不是一个文件,而是一个目录,里面包含了分散在各个 datanode 上的 block 单元。根据 HDFS 的定义,该文件夹可以被当成一个整体来操作。
JAQL 提供了一系列类似的方法,允许用户读写 HDFS,HBase,数据库,本地文件系统等各种各样的数据格式,提供了诸如 Transform, Group, Join 等各种常用的方法,允许用户来完成基本的数据操作。除了这些内建的操作外,用户也可以通过自己编写 Java UDF 来扩展 JAQL 的功能。对于一套比较完整的操作集合,也可以定义模块来实现代码的重用。
采用 JAQL,包括 Pig 和 Hive,作为与 Hadoop 的交互语言大大降低了 MapReduce 开发人员的技术门槛,这种语言的另外一个潜在优势在于,随着这些语言的不断成熟和算法的不断优化,可能不需要编程人员了解具体的实现细节而获得优异的性能,就像人们在传统数据库中为优化 SQL 所做的一样。
2. Jaql 与 DB2 的集成 --BigInsights 平台对数据库的支持
作为企业级的应用平台,IBM BigInsights 不仅推出了这种全新的数据分析框架,也提供了与传统数据库,数据仓库集成的机制,从而允许用户能够无缝的处理新旧平台中的数据。这种集成体现在以下两个方面,JAQL 本身提供了一种访问数据库的机制,允许用户在 JAQL Query 中编写 SQL 语句,通过 JDBC 访问数据库中的数据,另一方面,IBM BigInsights 也提供了一个模块,允许用户在 SQL 语句中编写 JAQL 语句。
第一种方向的集成相对简单,是对 JAQL Io 层的一个简单扩展,后一种集成方向的实现则相对复杂,图 2 描述了这种集成的一个逻辑示意图。
图 2. Jaql 和 DB2 的集成示意图
![BigInsights](https://i-blog.csdnimg.cn/blog_migrate/d7f983e899c91510374e5fbdf732dcaa.jpeg)
整个解决方案的主体由两部分组成:JAQL Server 是对 JAQL 的一个扩展,它提供了一组 RESTful 的操作,允许用户通过 HTTP 的方式提交,查询或者终止一个 JAQL 查询。JaqlSubmit 是 DB2 的一个 scalar UDF,它允许用户在 DB2 的 SQL 语言中提交一个 JAQL 查询,HdfsRead 是 DB2 的一个 table UDF, 它允许用户通过 DB2 访问存储在 HDFS 中的数据。这种设计框架的一个主要优点是在保证互联互通的同时,可以最大限度的使得各个模块的之间保持松散耦合。结合 DB2 的 partition 技术,该方案还可以实现文件的并发读取,最大限度的获得 Hadoop 计算集群的性能优势。
下面是使用 jaql-db2 集成的功能的一个例子,这个例子中我们选取出版年份为 1930,1997,1998 年的数据的信息。清单 1 中是所有书籍的信息,以 json 格式存储在文件中。 要使用 Jaql 和 DB2 集成的功能,我们必须执行一下步骤:
1、注册两个 jar 包,并且为 DB2 创建两个 UDF, 这些步骤在 BigInsights 安装后都在 jaql-db2/scripts 目录下,我们可以通过清单 2 中描述的脚本来运行。
2、启动 JaqlServer,此服务使 Jaql 能够接受以 HTTP 消息传递过来的 Jaql 指令。
3、使用 UDF 对数据进行分析查询,本例中的查询语句和结果如清单 3 所示。
清单 1. 使用 DB2 来查询 HDFS 上的数据
$ cat books.json
[
{publisher: 'Scholastic',
author: 'J. K. Rowling',
title: 'Deathly Hallows',
year: 2007},
{publisher: 'Scholastic',
author: 'J. K. Rowling',
title: 'Chamber of Secrets',
year: 1999,
reviews: [
{rating: 10, user: 'joe', review: 'The best ...'},
{rating: 6, user: 'mary', review: 'Average ...'}]},
{publisher: 'Scholastic',
author: 'J. K. Rowling',
title: 'Sorcerers Stone',
year: 1998},
{publisher: 'Scholastic',
author: 'R. L. Stine',
title: 'Monster Blood IV',
year: 1997,
reviews: [
{rating: 8, user: 'rob', review: 'High on my list...'},
{rating: 2, user: 'mike', review: 'Not worth the paper ...',
discussion:
[{user: 'ben', text: 'This is too harsh...'},
{user: 'jill', text: 'I agree ...'}]}]},
{publisher: 'Grosset',
author: 'Carolyn Keene',
title: 'The Secret of Kane',
year: 1930}
]
清单 2. 注册 UDF 及其 Jar 包
sh install.sh
db2 -tvf createJaqlSubmitFunc.clp
db2 -tvf createModuleFunc.clp
清单 3. 使用 DB2 来查询 HDFS 上的数据
$ db2 -tvf simpleTest1.clp
select a.* from table(hdfs_read(jaql_submit('read(file(''/opt/ibm/biginsights/jaql-db2
/test/books.json''))->filter $.year in $yearlist_TMP-> transform {
$.publisher, $.author
, $.title, $.year }-> write(del($out_location$,{ schema: schema
{ publisher:string,
author:string, title:string, year:long }}));','<parameters>
<parameter name="yearlist"
type="number-array">1930,1997,1998</parameter></parameters>',
'localhost','8200','600000'
))) as a
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12
---------------------------------------------------------------- --------------------
---------------------- ------------- ------ ----- --- ---- -------- ------ ------
"Scholastic" "J. K. Rowling" "Sorcerers Stone""Scholastic" "J. K. Rowling" "Sorcerers
Stone" 1998 - - - - - - - - "Scholastic" "R. L. Stine" "Monster Blood IV" "Scholastic"
"R. L. Stine" "Monster Blood IV" 1997 - - - - - - - - "Grosset" "Carolyn Keene" "The
Secret of Kane" 1930 - - - - - - - -
3 record(s) selected.
BigSheets--BigInsights 平台提供的强大数据分析功能
BigInsights 不仅提供了数据查询的语言,与数据库系统的集成,另外还提供了一个重要的产品模块— Big Sheets。它允许用户利用浏览器抓取自己感兴趣的网页信息,这对于获得那些并不是一直存在的网页信息来讲尤其具有重要的意义。除此以外,它还可以支持不同格式的文件信息的导入,并且可以用来对这些信息进行注解和具体分析。BigSheets 应用到了几种开源项目如 Hadoop、Nutch、Pig 来实现公众可阅览的私用云计算,目前该技术已经应用到大英图书馆中。 BigSheets 的整个应用可以分为以下几个步骤:
1、抓取信息或导入信息,用户可以制定需要抓取信息的 web 地址,可以选择多种格式的文件如本地或远程的 Json, CSV, RSS 格式文件,也可以利用 bigsheets 提供的 API 来书写自己的文件阅读模块。
2、对信息进行处理,BigSheets 提供了类似 Excel 表的很多对数据进行处理的功能,比如对数据列进行排序,利用关键字进行筛选等功能。
3、导出经过分析后的数据存储到特定位置。
此外,BigSheets 的所有操作,比如 import, filter, macro 都是以插件的方式进行实现,也就是说用户完全可以使用 BigSheets 为不同功能提供的不同接口来实现功能的自定义,然后安装自己编写好的插件即可。 下面给出了利用 BigSheets 进行数据分析的实例图,其中图 3 展示了使用 BigSheets 来对本机的网页进行抓取,在此图中可以看到用户可以对 BigSheets 进行相应的抓取设置,比如抓取网页地址,抓取粒度,是否需抓取固定链接的数据等。图 4 给出了 BigSheets 中对数据进行筛选操作的示例,此例中是对已存在数据的第一列进行时间上面的筛选。
图 3. BigSheets 进行网页信息抓取实例图
![BigInsights](https://i-blog.csdnimg.cn/blog_migrate/2d85ca9ad23ea2a0203a3e8dc733c778.jpeg)
图 4. BigSheets 进行信息筛选实例图
![BigInsights](https://i-blog.csdnimg.cn/blog_migrate/5a4bc5cd2e4a405f19da8540efc9ef53.jpeg)
总结
IBM 构建了 BigInsights 平台来为用户提供从大量的信息中提取有用信息进行分析决策的解决方案,它被用来解决在当前信息分析中亟待解决的几大问题:极大数据量的处理,数据来源的多样性,数据分析的敏捷性,数据分析的持久性。随着 BigInsights 的不断发展,我们将支持更多的基于 Hadoop 的开源项目,根据用户的特定需求提供更多更好的解决方案。
更多大数据与分析相关行业资讯、解决方案、案例、教程等请点击查看>>>