前言
Pig最早是雅虎公司的一个基于Hadoop的并行处理架构,后来Yahoo将Pig捐献给Apache的一个项目,由Apache来负责维护,Pig是一个基于 Hadoop的大规模数据分析平台。
Pig为复杂的海量数据并行计算提供了一个简 易的操作和编程接口,这一点和FaceBook开源的Hive一样简洁,清晰,易上手!
一、Pig概述
Pig包括 两部分
1:用于描述数据流的语言,称为 Pig Latin (拉丁猪,个人翻译)
2:用于运行PigLatin程序的 执行环境 。一个是 本地 的单JVM执行环境,一个就是在 hadoop集群上 的分布式执行环境。
Pig Latin程序是由一系列的" 操作"(operation)或"变换"(transformation)组成 。每个操作或变换对输入进行 数据处理 ,然后产生 输出的结果 。这些操作整体上描述了一个 数据流 ,Pig执行的环境把数据流翻译为可执行的内部表示,并运行它。在Pig的内部,这些变换和操作被转换成一系列的MapReducer,但是我们一般情况下并不知道这些转换是怎么进行的, 我们的主要的精力就花在数据上,而不是执行的细节上面。
1-2 作用
那么雅虎公司主要使用Pig来干什么呢?
1)吸收和分析用户的行为日志数据(点击流分析、搜索内容分析等),改进匹配和排名算法,以提高检索和广告业务的质量。
2)构建和更新search index。对于web-crawler抓取了的内容是一个流数据的形式,这包括去冗余、链接分析、内容分类、基于点击次数的受欢迎程度计算(PageRank)、最后建立倒排表。
3)处理半结构化数据订阅(data seeds)服务。包括:deduplcaitin(去冗余),geographic location resolution,以及 named entity recognition.
1-3 优势与不足
MapReducer能够让我们自己定义 连续执行的map和reduce函数 ,但是数据处理往往需要很多的MapReducer过程才能实现,所以将数据处理要求改写成MapReducer模式是很 复杂的 。和MapReducer相比,Pig提供了更加 丰富的数据结构 ,一般都是 多值 和 嵌套 的数据结构。Pig还提供了一套更强大的 数据交换操作 ,包括了MapReducer中被忽视的" join "操作
使用Pig来操作hadoop处理海量数据,是非常简单的,如果没有Pig,我们就得手写MapReduce代码,这可是一件非常繁琐的事,因为MapReduce的任务职责非常明确,清洗数据得一个job,处理得一个job,过滤得一个job,统计得一个job,排序得一个job,每次只要改动很小的一个地方,就得重新编译整个job,然后打成jar提交到Hadoop集群上运行,是非常繁琐的,调试还很困难。
但是,Pig并不适合处理所有的“数据处理”任务。和MapReducer一样,它是为数据 批处理 而设计的,如果想执行的查询只涉及一个大型数据集的一小部分数据,Pig的实现不是很好, 因为它要扫描整个数据集或其中的很大一部分。
二、Pig与Hive 谁才是未来?
2-1 背景
SQL
结构化查询语言(SQL)是程序员的最佳伴侣,主要用于处理和提取数据。大数据改变了数据处理和可视化的方式。但是SQL严格的关系数据库模式和声明特性依然是数据分析的标杆。尽管SQL市场广阔,但是大数据也对SQL的功能和性能提出了挑战。
Pig
Apache Pig适合有SQL背景的程序员学习,其有以下两个特点:
1.放宽了对数据存储的要求
2.可以操作大型数据集
除了上述特点,它还有很好的可扩展性和性能优化。 Apache Pig允许开发人员跟踪多个查询方法,从而降低了数据的重复检索。它支持复合数据类型(Map、Tuple、Bag),支持常见的数据操作,例如筛选、排序和Join。Apache Pig的这些特性得到了世界各地用户的认可。
Hive
尽管Apache Pig性能优异,但是它要求程序员要掌握SQL之外的知识。Hive和SQL非常相似,虽然Hive查询语言(HQL)有一定的局限性,但它仍然是非常好用的。Hive为MapReduce提供了很好的开源实现。它在分布式处理数据方面表现很好,不像SQL需要严格遵守模式。
数据的提取、处理和分析没有一个万全之策,需要综合多种因素来选择,例如数据存储方法,编程语言结构以及预期的结果。下面我们就来对比一下Pig、Hive和SQL,看看它们各自都适合什么样的场景。
2-2 Pig工作原理
Apache PIG提供一套高级语言平台,用于对结构化与非结构化数据集进行操作与分析。这种语言被称为Pig Latin,其属于一种脚本形式,可直接立足于PIG shell执行或者通过Pig Server进行触发。用户所创建的脚本会在初始阶段由Pig Latin处理引擎进行语义有效性解析,而后被转换为包含整体执行初始逻辑的定向非循环图(简称DAG)。
另外,这套处理引擎亦可接受DAG并在内部执行计划优化——具体优化方式包括PIG程序方法以及惰性计算。
为了理解这一优化机制的原理,我们假定用户编写了一套脚本,该脚本对两套数据集进行一项连接操作,而后是一条过滤标准。PIG优化器能够验证过滤操作是否能够在连接之前进行,从而保证连接负载最小化。如果可以,则其将据此进行逻辑规划设计。如此一来,用户即可专注于最终结果,而非将精力分散在性能保障身上。
只有在经过完全优化的逻辑规划准备就绪之后,编译才会生效。其负责生成物理规划,即为最终驻留于HDFS中的数据分配与之交互的执行引擎。
2-3 Hive工作原理
Apache Hive在本质上属于一套数据仓储平台,用于同存储在HDFS或者HBase内的大规模结构化数据集进行交互。Hive查询语言在这一点上类似于SQL,二者都能够与Hadoop实现良好集成。而Pig则不同,其执行流程为纯声明性,因此适合供数据科学家用于实现数据呈现与分析。
在与Hive进行交互时,用户可以直接通过Hive命令行界面直接接入,或者与Hiveserver交互。任何提交查询都会首先由该驱动程序占用,而后由编译器进行语法及语义验证。另外,Hive metastore负责保存全部与Hive相关数据的模式/映射关系,其在验证查询中信息语义方面扮演着重要角色。
该驱动立足于语义之上执行优化,同时负责准备执行规划并将其提交至HQL查询引擎。这套引擎依赖于实际执行引擎(例如MapReduce与Spark等)。任何对模式的成功修改都会通过HQL处理引擎被更新至metastore当中。
2-4 总结
Hive更适合于数据仓库的任务,Hive主要用于静态的结构以及需要经常分析的工作。Hive与SQL相似促使 其成为Hadoop与其他BI工具结合的理想交集。而且很多企业都需要对历史数据进行分析,Hive就是一款分析历史数据的利器。但是Hive只有在结构化数据的情况下才能大显神威。Hive的软肋是实时分析,如果想要进行实时分析,可以采用HBase。
Pig赋予开发人员在大数据集领域更多的灵活性,并允许开发简洁的脚本用于转换数据流以便嵌入到较大的 应用程序。并且Apache Pig适用于非结构化的数据集,可以充分利用SQL。Pig无需构建MapReduce任务,如果你有SQL学习的背景,那么入门会非常快。
Pig相比Hive相对轻量,它主要的优势是相比于直接使用Hadoop Java APIs可大幅削减代码量。正因为如此,Pig仍然是吸引大量的软件开发人员。
所以二者皆提供出色的灵活性以及可扩展性,用于实现各类定制化功能。另外,二者也拥有自己的明确角色定位,因此其具体优劣完全取决于您在项目当中的实际要求。