《Pig编程指南》一2.2 运行Pig

简介:

本节书摘来异步社区《Pig编程指南》一书中的第1章,第2.2节,作者: 【美】Alan Gates 译者: 曹坤,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 运行Pig

用户可以在本地运行Pig也可以在集群系统上运行Pig,还可以将Pig作为Amazon的弹性MapReduce服务系统的一个组成部分运行。

2.2.1 本地单机运行Pig

本地单机运行Pig按Pig的定义说法是以local模式运行。Local模式对于样机研究和调试用户所写的Pig Latin脚本是非常有用的。有些人在处理小文件的时候也采用这种模式,尽快处理流程和处理大数据量是相同的——这样可以保证无论处理什么数量级别的数据时都采用一致的数据流,但是他们不希望集群为处理小的文件和小的任务而浪费资源。

在0.6版本和更早的版本中,Pig自身是以local本地模式执行脚本的。从版本0.7开始,它开始使用Hadoop的类 LocalJobRunnr,这个类可以读取本地文件系统并且可以在本地执行MapReduce任务。这样执行的优点是在本地运行Pig任务和在集群中执行是相同的,同时它们都是以相同的流程执行,从而使得调试更加方便。缺点是太慢,启动一个本地的Hadoop实例需要将近20秒的时间,即使是非常小的任务也需要耗时这么久。1

下面我们以local本地模式运行一个Pig Latin脚本。查看前言的“本书中的代码样例”部分获得如何下载本例中所需要的数据和Pig Latin代码样例脚本源码。例2-1所示是个简单的例子,其加载了文件NYSE_dividends,并按股票交易码进行分组,然后计算每个交易码对应的平均股息。

例2-1 以本地模式运行Pig

-- average_dividend.pig
-- 从NYSE_dividends中加载数据,并声明其有4个字段
dividends = load 'NYSE_dividends' as (exchange, symbol, date, dividend);
-- 按照股票交易号对行进行分组
grouped  = group dividends by symbol;

-- 计算每个股票交易号对应的平均股息
avg      = foreach grouped generate group, AVG(dividends.dividend);

-- 将结果存储到文件average_dividend中
store  avg into 'average_dividend';

如果用户使用 head -5 这个shell命令来查看NYSE_dividends文件,那么将会看到:

NYSE CPO  2009-12-30  0.14
NYSE CPO  2009-09-28  0.14
NYSE CPO  2009-06-26  0.14
NYSE CPO  2009-03-27  0.14
NYSE CPO  2009-01-06  0.14

这与我们在Pig Latin脚本中所声明的结构是一致的。第1个字段是这支股票所属的交易所的名称,第2个字段是股票交易码,第3个字段是所支付股息的日期,第4个字段是股息的大小。

提示
记住,在运行Pig前用户需要设置JAVA_HOME环境变量。

这个值等于用户使用的Java发行版所在的目录路径。
切换到NYSE_dividends文件所在的目录,然后用户就可以通过如下方式以本地模式的方式运行Pig了:

pig_path/bin/pig –x local average_dividend.pig

其中pig_path是指用户本地机器Pig安装所在的目录。

执行上述命令后用户应该能看到屏幕上有很多输出。大部分输出是MapReduce的LocalJobRunner所生成的日志,但其中也有一些是Pig告诉用户它将如何执行这个脚本,以及执行过程中的状态信息等。在输出的最底端用户应该能看到一个简短的提示信息 Success!。这意味着一切进展顺利。该脚本将输出存储到average_dividend文件中,因此也许用户期望能在自己的本地目录下发现一个名字为average_dividend的文件。事实上用户会发现一个这个名字的目录,该目录下有一个名字为part-r-00000的文件。这是因为Hadoop是一个分布式系统,一般是以并行的方式处理数据的,当它将输出数据存放到一个“文件”中的时候,它就会使用这个“文件”的名称创建一个目录,每一个写处理过程就会在这个文件夹中生成一个独立的文件片段。在这个例子中我们只有一个写处理过程,因此我们只得到了一个文件片段。用户可以通过如下命令查看这个结果文件中的内容:

cat average_dividend/part-r-00000 | head -5

结果是:

CA  0.04
CB  0.35
CE  0.04
CF  0.1
CI  0.04

2.2.2 在Hadoop集群上运行Pig

大部分的时间用户将在Hadoop集群上运行Pig。正如我们在2.1节“下载和安装Pig”中所描述的那样,Pig可以在用户个人机器或者网关机上以local本地模式运行。所有的语法解析、执行校验以及制定执行计划都是在本地完成的。Pig然后才会在集群上执行MapReduce任务。

提示
当我提到“用户的网关机”的时候,我的意思是那台用户可以提交Pig任务的机器。通常情况是一台或多台可以访问Hadoop集群的机器。然后,看用户机器的配置了,它也可以是用户的本地机器。

为了能在用户的机器中使用Pig,只需要告诉Pig两个信息:集群的Namenode和JobTracker所在的位置。NameNode是HDFS的控制者,JobTracker协调MapReduce任务。在Hadoop 0.18和更早版本中,这些位置用户可以在配置文件hadoop-site.xml中找到。在Hadoop 0.20版本和之后版本中,它们在不同的配置文件中:core-site.xml、hdfs-site.xml和mapred-site.xml。

如果用户已经通过MapReduce或者其他工具在用户的网关机上运行了Hadoop任务,那么用户很有可能已经看到这些文件了。如果没有,那么最好的办法是从集群节点机器中复制一份相同的配置文件到用户的网关机上。这样可以保证得到的是正确的地址和其他一些相关的配置信息。

如果不管是什么原因,无法从集群中复制这些文件,那么用户可以自行创建一个hadoop-site.xml文件。文件内容如下所示:

< configuration>
< property>
  < name>fs.default.name< /name>
  < value>_namenode_hostname:port_< /value>
< /property>

< property>
  < name>mapred.job.tracker < /name>
  < value>jobtracker_hostname:port< /value>
< /property>
< /configuration>

用户需要从他的集群管理员那里获得NameNode和JobTracker对应的服务器名和端口名。

一但用户找到了,复制了或者自己创建了这些配置文件,之后需要告诉Pig这些配置文件在哪个目录下,用户需要设置PIG_CLASSPATH这个环境变量到那个目录下。需要注意的是需要指向的是那些XML配置文件所在的目录,而不是这些配置文件本身。Pig会自动加载读取那个目录下的所有XML和properties类型的文件。

让我们再重新运行下这个之前在本地模式运行过的例子(例2-1)。如果用户是第一次使用这个集群,那么最好创建一个根目录。这个过程可以通过Pig来完成:

PIG_CLASSPATH=hadoop_conf_dir pig_path/bin/pig –e fs –mkdir /user/ username

其中hadoop_conf_dir是包含hadoop-site.xm或者core-site.xml、hdfs-site.xml和mared-site.xml文件的那个目录;pig_path是指用户的网关机上Pig所在的路径;usename是用户在网关机上的用户名。如果用户使用的0.5或者更早的版本,那么需要将命令语句中的“fs –mkdir”改为“mkdir”。

提示
记住,在执行任何Pig命令前,都需要设置好 JAVA_HOME环境变量。详细信息请查看2.1.1小节“从Apache下载Pig软件包”。

为了可以在用户集群中执行这个例子,需要将数据文件复制到集群中:

PIG_CLASSPATH=hadoop_conf_dir pig_path/bin/pig –e fs –copyFromLocal NYSE_dividends NYSE_dividends

如果用户使用的是Pig 0.5版本或者更早的版本,需要将上述命令中的“fs–copyFromLocal”换成“copyFromLocal”。

现在已经准备好执行这个Pig Latin脚本了:

PIG_CLASSPATH=hadoop_conf_dir pig_path/bin/pig average_dividend.pig

输出的前几行告诉用户Pig是如何连接到集群中的。这个信息之后会描述执行该脚本的进度信息。用户需要通过检查Pig报告的信息和集群的信息是否一致来确定Pig连接到了正确的文件系统和JobTracker,这点很重要。如果文件系统是以file:///开头或者JobTracker显示的是 localhost,那么表示Pig并没有连接到集群中。如果这样,用户需要检查配置文件中是否正确地设置了值,还有设置的PIG_CLASSPATH指向的目录是否包含了那些配置文件。

在靠近输出信息的最后面,应该有一行输出信息为Success!。这意味着脚本成功执行了。之后用户可以通过如下命令查看结果:

PIG_CLASSPATH=hadoop_conf_dir pig_path/bin/pig –e cat average_dividend

执行上述这条命令应该给用户相同的连接信息,最终会输出所有的股票交易码和它们的平均股息值。

用户可能注意到在例子2-1中我曾指出average_dividend是一个文件夹,因此用户需要使用cat查看这个文件夹下的片段文件。然而在这个例子中,我直接使用命令cat来查看average_dividend这个目录。如果用户使用list命令查看average_dividend这个目录,可以发现这和之前一样确实是个文件夹,但是在Pig中,命令cat是可以操作文件夹的。在第3章中会对此进行讨论。

2.2.3 在云服务上运行Pig

云计算2伴随着软件即服务(SaaS)模式的出现已经好几年了。像Hadoop这样的硬件密集型的应用的出现是偶然的。搭建和维护一个Hadoop集群是一个需要在硬件获取、设备成本以及维护和管理等方面进行昂贵投入的命题。很多用户发现如果通过租硬件的方式会比较便宜一些。

无论用户或者用户的组织决定是使用云端的Hadoop和Pig还是使用自己拥有和操作的机器,在用户所使用的集群上运行Pig的使用说明都是一样的,具体操作请查看2.2.2小节“在Hadoop集群上运行Pig”。

然而,Amazon的弹性MapReduce(EMR)云服务提供的方式有所不同。EMR允许用户租借虚拟Hadoop集群,而不是允许用户租借机器用于任何类型的处理(像Amazon的弹性云计算[EC2]服务和其他云服务)。这些集群从Amazon的简单存储服务(S3)读取和存储数据到S3。这意味着用户甚至不用自己去建立他们自己的Hadoop集群,而如果使用EC2或其他类似服务时他们需要自己去建立Hadoop集群。

EMR用户可以通过他们的浏览器,SSH或者一个Web服务API访问他们租借的Hadoop集群。想获得关于EMR的更多信息,请访问网址:http://aws.amazon.com/elasticmapreduce。不过,我建议从这个不错的向导开始,向用户介绍该服务的一些相关信息。

2.2.4 命令行使用以及配置选项介绍

Pig具有许多用户可以使用的命令行选项。用户可以通过输入 pig -h命令查看完整的选项列表。大部分的命令行选项我们稍后会在使用了这些选项功能的那些章节中讨论。在本小节中我们将讨论如下几个不同的命令行选项:
**
-e 或者 –execute**

在Pig中单独执行一条命令。例如:pig-e fs–ls 将会列举出用户根目录下的文件。

-h 或者 –help

列举出可用的命令行选项。

-h properties

列举出Pig将要使用的属性值,如果用户设置了这些属性值。

-P 或者 –propertyFile

指定一个Pig应该读取的属性值配置文件。

-version

打印出Pig的版本信息

Pig同样会使用很多的Java属性值。属性值信息的完整列表可以通过执行pig –hproperties命令打印出来。在之后使用到相关属性值的章节中再讨论如何指定哪些属性值。

Hadoop同样具有许多用于决定其行为的Java属性。例如,用户可以通过设置属性mapred.child、java.opts来对运行map和reduce任务的JVM传送一些属性值。在Pig 0.8版本和之后版本中,这些Java属性也可以传送给Pig,Pig然后会在调用到Hadoop的时候再将这些参数传送给Hadoop。对于0.8版本之前的其他版本,这些属性值必须要在hadoop-site.xml配置文件中配置才可以,这样Hadoop客户端会自己加载这些配置信息。

这些属性值可以通过命令行选项–D 传送给Pig,传送的格式和普通的Java属性一样。例如,bin/pig –D exectype=local。当使用命令行的方式加载这些属性的时候,必须要在Pig专有的命令行选项(例如,-x local)前定义这些属性。用户也可以在用户所使用的Pig发行版目录下的conf/pig.properties这个文件中定义用户的属性值。最后,用户还可以通过 –P命令指定另一个不同的配置文件。如果同时使用了命令行的方式和属性文件的方式设置属性值,优先以命令行设置的值为准。

2.2.5 返回码

Pig使用如表2-1所示的返回码来传达是成功还是失败。


b1

1 本地模式下同样切换使用MapReduce过程的另一个原因是,Pig每一个新增的功能都更多地使用到MapReduce的特性,这些特性在本地模式下非常困难或者几乎不可能复制下来。因此本地模式和MapReduce模式具有不同的功能集合。

2 作为当前最火的技术,术语“云计算”已被用来描述所有使用多台计算机而不仅仅只使用一台计算机的应用。而本章中所说的云计算是指使用计算机集群并部署特定的软件进行运算的活动。

相关文章
|
9月前
|
SQL 机器学习/深度学习 存储
Hadoop生态系统中的数据查询与分析技术:Hive和Pig的比较与应用场景
Hadoop生态系统中的数据查询与分析技术:Hive和Pig的比较与应用场景
|
SQL 存储 分布式计算
Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别(三)
Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别(三)
179 0
Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别(三)
|
SQL JSON 分布式计算
Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别(二)
Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别(二)
248 0
|
SQL 存储 分布式计算
Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别(一)
Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别(一)
323 0
|
SQL 分布式计算 关系型数据库