基于Pig Latin语言的海量数据分析

时间:2022-09-12 06:47:14

基于Pig Latin语言的海量数据分析

摘要:随着互联网的飞速发展,分析海量数据的需求变得十分迫切。针对分布式数据库昂贵及Map-Reduce计算框架中代码难以维护、重用等问题,雅虎研发了自己的海量数据分析平台Pig。Pig平台基于Hadoop的Map-Reduce计算框架并提供类SQL的命令式查询语言pig latin,该平台为复杂的海量数据并行计算提供了简易的操作和编程接口。本文对Pig Latin语言四种数据模型、常用表达式及关键操作符进行介绍,并结合实例对Pig Latin脚本程序进行分析。

关键词:Pig平台 Pig Latin语言 海量数据 并行分析

中图分类号: 文献标识码:A文章编号:1007-9416(2010)05-0000-00

1 前言

步入网络时代后,企业内部各类数据急剧增长,如何高效的分析海量数据已成为一个亟待解决的问题,如从账单中分析潜在优质客户,从网站日志中分析用户关心的产品和服务。海量数据目前一般通过分布式系统进行存储和处理,如分布式数据库。分布式数据库一般对底层复杂的集群实现进行封装,并向外提供基于SQL的接口。分布式数据库一般需运行在专用服务器上,实施、维护成本高,普通用户将无法承担其高昂的费用。

当下流行的Map-Reduce[1]并行计算框架仅依赖廉价的PC集群便可提供高效、可靠的计算,适于处理海量数据。Hadoop[2]作为Map-Reduce的开源实现系统,正被越来越多的用户使用。由于Map-Reduce是一种通用处理模型,导致用户难以快速实现海量数据分析。首先,用户需为JOIN、GROUP等常用分析过程手动编写代码,这些代码往往不能确保正确且难以维护、重用。其次,海量数据分析任务难以直接分解为Map与Reduce两阶段的处理任务,导致普通开发人员难以编写Map-Reduce程序。再者,由于Map函数和Reduce函数间的界限并不是十分明显,导致系统难以优化。

雅虎于2006年着手研发的Pig[3、4]项目结合分布式数据库及Hadoop系统各自的优点为用户提供一个高效、实用的海量数据分析平台。作为Apache的开源项目,Pig平台基于Hadoop的Map-Reduce计算框架,提供类SQL的编程语言Pig Latin[5]。相比声明式语言SQL,命令式编程语言Pig Latin更符合用户的编程习惯。同时用户编写Pig程序时无需考虑效率问题,Pig平台会对Pig Latin代码自动进行优化。除此之外,Pig Latin支持以Java语言编写的用户自定义函数(UDF),该特性便于用户实现自定义功能。

2 Pig Latin语言

Pig Latin是在Map-Reduce并行计算框架上构建的类SQL高级查询语言。Pig Latin提供四种基本的数据模型,支持常用的表达式,提供类似SQL关键字功能的常用操作符,为用户以命令式编程的方式分析、处理海量数据提供便利。

Pig Latin数据模型包括以下四个部分:

(1)原子值:一个原子值是一个不能分割的值,例如字符串或数字。

(2)元组:一个元组是一组值的序列,这些值可是任意类型,如(‘Pig’,‘1’)。元组可自嵌套,如(‘1’,(‘Pig’,‘Sample’))。

(3)包:一个包是一些元组的集合。包内的元组可重复,如:{(‘1’),(‘1’),(‘2’,‘Sample’)}。

(4)映射:映射是数据项的集合,每一数据项都有相对应的键以用于查找。映射中的数据项可以是不同类型的,但为确保查询效率,关键字必须是原子值。例如在映射[‘key’  {(‘Pig’),(‘Sample’)},‘age’  20]中,键‘key’被映射到一个有两条元组的包,键‘age’被映射到一个原子值。

Pig Latin数据模型允许嵌套使用,用户可根据实际问题定义复杂的数据结构。

Pig Latin支持常用的数据类型及运算,如下所示:

Pig Latin常用关系操作符包括“LOAD”、“FOREACH”、“FILTER”、“JOIN”、“ORDER”、“COGROUP”、“STORE”等,如表2所示。“LOAD”操作符确定要加载的文件,并利用反序列化函数将文件中数据转换为特定结构的元组,最终返回包的句柄。“LOAD”并不立刻加载文件,仅当用户保存结果的时候才加载。“FOREACH”操作符对包内每个元组进行处理,常用来进行初始化或数据转换等工作,最终返回经处理后包的句柄。“FILTER”操作符过滤不符合条件的元组。“JOIN”操作符返回两个或多个包的笛卡尔乘积。“ORDER”操作符根据元组中一个或多个域进行排序。“COGROUP”操作符对两个或多个相关的包进行分组。“GROUP”操作符对一个包进行分组,是“COGROUP”的特例。“STORE”操作符把查询结果保存到文件中,并触发“LOAD”操作符正式加载文件。

2.1 Pig应用举例

假如我们有用户信息(包括用户名和用户年龄)以及用户浏览网站记录(包括用户名和访问网站的url),如图1所示。

这些海量数据存放在Hadoop分布式文件系统上,如果要查询“在18岁到30岁使用者查看的前100网站”,可用Pig Latin编写以下简单脚本解决:

1 Users = LOAD ‘users.in’ AS (name, age);

2 Pages = LOAD ‘pages.in’ AS (user, url);

3 MyUsr = FILTER Users BY age >= 18 and age

4 UsrUrl = JOIN MyUsr BY name, Pages BY user;

5 UrlGrp = GROUP UsrUrl BY url;

6 UrlView = FOREACH UrlGrp GENERATE group, COUNT(UsrUrl) as views;

7 SortV = ORDER UrlView BY views;

8 Top100 = LIMIT SortV 100;

9 STORE Top100 INTO ‘top100sites.out’;

各行执行结果见图2。脚本程序前两行通过“LOAD”操作符确定加载文件,并对文件以系统默认的方式反序列化生成元组。第3行查找年龄在18岁和30岁之间的用户。第4行将两张表的数据按照用户名进行笛卡尔积操作。第5行对上述结果按url进行分组。第6行生成各url点击数量。第7、8行对url进行排序,得到点击前100的url。第9行将结果保存到文件“top100sites.out”中。Pig只需在Map-Reduce模式下执行该脚本就可得到查询结果。

3 结语

本文介绍海量数据处理平台Pig及其语言Pig Latin。Pig平台吸收声明式SQL查询语言及Map-Reduce计算框架的优点,为用户提供实用、高效的海量数据处理平台。Pig Latin语言定义四种基本数据模型,支持常用表达式,提供Java语言编写的UDF,提供大量类SQL语法的操作符,受到越来越多海量数据分析用户的关注。同时,由于Pig平台还处于起步阶段,存在很多不足或待进一步优化,如查询优化、非Java语言的UDF支持、Pig的SQL接口、歪斜处理等,这些问题将在Pig后续版本中逐步得到解决。

参考文献

[1]J. Dean, S. Ghemawat. Mapreduce: Simplified data processing on large clusters. In Proc. of the 6th conference on Symposium on Operating Systems Design & Implementation, USENIX Association, 2004.

[2] hadoop.省略/.

[3] hadoop.省略/pig/.

[4] A. Gates, O. Natkovich etc. Building a high-level dataflow system on top of Map-Reduce: The Pig experience. In Proc. of VLDB, 2009:1414-1425.

[5] C. Olston, B. Reed, U. Srivastava, R. Kumar and A. Tomkins. Pig Latin: A not-so-foreign language for data processing. In Proc. of ACM SIGMOD, 2008.

作者简介:胡黎玮,男,高级工程师,主要从事计算机软件开发与研究工作。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

上一篇:激光\红外无线收听音频信号装置的研制及效果分... 下一篇:UG―CAM高速加工工艺探导