安装Apache Pig
下载Apache Pig软件后(http://mirror.bit.edu.cn/apache/pig/),按照以下步骤将其安装在Linux环境中。
步骤1
在安装了 Hadoop,Java和其他软件的安装目录的同一目录中创建一个名为Pig的目录。(在我们的教程中,我们在名为Hadoop的用户中创建了Pig目录)。
$ mkdir Pig
第2步
提取下载的tar文件,如下所示。
$ cd Downloads/ $ tar zxvf pig-0.15.0-src.tar.gz $ tar zxvf pig-0.15.0.tar.gz
步骤3
将 pig-0.16.0-src.tar.gz 文件的内容移动到之前创建的 Pig 目录,如下所示。
$ mv pig-0.16.0-src.tar.gz/* /home/Hadoop/Pig/
配置Apache Pig
安装Apache Pig后,我们必须配置它。要配置,我们需要编辑两个文件 - bashrc和pig.properties 。
.bashrc文件
在 .bashrc 文件中,设置以下变量
-
PIG_HOME 文件夹复制到Apache Pig的安装文件夹
-
PATH 环境变量复制到bin文件夹
-
PIG_CLASSPATH 环境变量复制到安装Hadoop的etc(配置)文件夹(包含core-site.xml,hdfs-site.xml和mapred-site.xml文件的目录)。
export PIG_HOME = /home/Hadoop/Pig export PATH = PATH:/home/Hadoop/pig/bin export PIG_CLASSPATH = $HADOOP_HOME/conf
pig.properties文件
在Pig的 conf 文件夹中,我们有一个名为 pig.properties 的文件。在pig.properties文件中,可以设置如下所示的各种参数。
pig -h properties
支持以下属性:
Logging: verbose = true|false; default is false. This property is the same as -v switch brief=true|false; default is false. This property is the same as -b switch debug=OFF|ERROR|WARN|INFO|DEBUG; default is INFO. This property is the same as -d switch aggregate.warning = true|false; default is true. If true, prints count of warnings of each type rather than logging each warning. Performance tuning: pig.cachedbag.memusage=<mem fraction>; default is 0.2 (20% of all memory). Note that this memory is shared across all large bags used by the application. pig.skewedjoin.reduce.memusagea=<mem fraction>; default is 0.3 (30% of all memory). Specifies the fraction of heap available for the reducer to perform the join. pig.exec.nocombiner = true|false; default is false. Only disable combiner as a temporary workaround for problems. opt.multiquery = true|false; multiquery is on by default. Only disable multiquery as a temporary workaround for problems. opt.fetch=true|false; fetch is on by default. Scripts containing Filter, Foreach, Limit, Stream, and Union can be dumped without MR jobs. pig.tmpfilecompression = true|false; compression is off by default. Determines whether output of intermediate jobs is compressed. pig.tmpfilecompression.codec = lzo|gzip; default is gzip. Used in conjunction with pig.tmpfilecompression. Defines compression type. pig.noSplitCombination = true|false. Split combination is on by default. Determines if multiple small files are combined into a single map. pig.exec.mapPartAgg = true|false. Default is false. Determines if partial aggregation is done within map phase, before records are sent to combiner. pig.exec.mapPartAgg.minReduction=<min aggregation factor>. Default is 10. If the in-map partial aggregation does not reduce the output num records by this factor, it gets disabled. Miscellaneous: exectype = mapreduce|tez|local; default is mapreduce. This property is the same as -x switch pig.additional.jars.uris=<comma seperated list of jars>. Used in place of register command. udf.import.list=<comma seperated list of imports>. Used to avoid package names in UDF. stop.on.failure = true|false; default is false. Set to true to terminate on the first error. pig.datetime.default.tz=<UTC time offset>. e.g. +08:00. Default is the default timezone of the host. Determines the timezone used to handle datetime datatype and UDFs. Additionally, any Hadoop property can be specified.
验证安装
通过键入version命令验证Apache Pig的安装。如果安装成功,你将获得Apache Pig的正式版本,如下所示。
$ pig –version Apache Pig version 0.16.0 (r1682971) compiled Jun 01 2015, 11:44:35
Apache Pig执行模式
你可以以两种模式运行Apache Pig,即Local(本地)模式和HDFS模式。
Local模式
在此模式下,所有文件都从本地主机和本地文件系统安装和运行,不需要Hadoop或HDFS。此模式通常用于测试目的。
MapReduce模式
MapReduce模式是我们使用Apache Pig加载或处理Hadoop文件系统(HDFS)中存在的数据的地方。在这种模式下,每当我们执行Pig Latin语句来处理数据时,会在后端调用一个MapReduce作业,以对HDFS中存在的数据执行特定的操作。
Apache Pig执行机制
Apache Pig脚本可以通过三种方式执行,即交互模式,批处理模式和嵌入式模式。
-
交互模式(Grunt shell) - 你可以使用Grunt shell以交互模式运行Apache Pig。在此shell中,你可以输入Pig Latin语句并获取输出(使用Dump运算符)。
-
批处理模式(脚本) - 你可以通过将Pig Latin脚本写入具有 .pig 扩展名的单个文件中,以批处理模式运行Apache Pig。
-
嵌入式模式(UDF) - Apache Pig允许在Java等编程语言中定义我们自己的函数(UDF用户定义函数),并在我们的脚本中使用它们。
调用Grunt Shell
你可以使用“-x"选项以所需的模式(local/MapReduce)调用Grunt shell,如下所示。
Local模式 | MapReduce模式 |
---|---|
Command(命令) - $ ./pig -x local | Command(命令)- $ ./pig -x mapreduce |
Output(输出) - ![]() | Output(输出)- ![]() |
这两个命令都给出了Grunt shell提示符,如下所示。
grunt>
你可以使用“ctrl+d"退出Grunt shell。
在调用Grunt shell之后,可以通过直接输入Pig中的Pig Latin语句来执行Pig脚本。
grunt> customers = LOAD 'customers.txt' USING PigStorage(',');
在批处理模式下执行Apache Pig
你可以在文件中编写整个Pig Latin脚本,并使用 -x command 执行它。我们假设在一个名为sample_script.pig 的文件中有一个Pig脚本,如下所示。
Sample_script.pig
student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING
PigStorage(',') as (id:int,name:chararray,city:chararray);
Dump student;
现在,你可以在上面的文件中执行脚本,如下所示。
Local模式 | MapReduce模式 |
---|---|
$ pig -x local Sample_script.pig | $ pig -x mapreduce Sample_script.pig |
注意:我们将详细讨论如何在批处理模式和嵌入模式中运行Pig脚本。
Apache Pig Grunt Shell
调用Grunt shell后,可以在shell中运行Pig脚本。除此之外,还有由Grunt shell提供的一些有用的shell和实用程序命令。本章讲解的是Grunt shell提供的shell和实用程序命令。
注意:在本章的某些部分中,使用了Load和Store等命令。请参阅相应章节以获取有关它们的详细信息。
Shell 命令
Apache Pig的Grunt shell主要用于编写Pig Latin脚本。在此之前,我们可以使用 sh 和 fs 来调用任何shell命令。
sh 命令
使用 sh 命令,我们可以从Grunt shell调用任何shell命令,但无法执行作为shell环境( ex - cd)一部分的命令。
语法
下面给出了 sh 命令的语法。
grunt> sh shell command parameters
示例
我们可以使用 sh 选项从Grunt shell中调用Linux shell的 ls 命令,如下所示。在此示例中,它列出了 /pig/bin/ 目录中的文件。
grunt> sh ls pig pig_1444799121955.log pig.cmd pig.py
fs命令
使用 fs 命令,我们可以从Grunt shell调用任何FsShell命令。
语法
下面给出了 fs 命令的语法。
grunt> sh File System command parameters
示例
我们可以使用fs命令从Grunt shell调用HDFS的ls命令。在以下示例中,它列出了HDFS根目录中的文件。
grunt> fs –ls Found 3 items drwxrwxrwx - Hadoop supergroup 0 2015-09-08 14:13 Hbase drwxr-xr-x - Hadoop supergroup 0 2015-09-09 14:52 seqgen_data drwxr-xr-x - Hadoop supergroup 0 2015-09-08 11:30 twitter_data
以同样的方式,我们可以使用 fs 命令从Grunt shell中调用所有其他文件系统的shell命令。
实用程序命令
Grunt shell提供了一组实用程序命令。这些包括诸如clear,help,history,quit和set等实用程序命令;以及Grunt shell中诸如 exec,kill和run等命令来控制Pig。下面给出了Grunt shell提供的实用命令的描述。
clear命令
clear 命令用于清除Grunt shell的屏幕。
语法
你可以使用 clear 命令清除grunt shell的屏幕,如下所示。
grunt> clear
help命令
help 命令提供了Pig命令或Pig属性的列表。
使用
你可以使用 help 命令获取Pig命令列表,如下所示。
grunt> help Commands: <pig latin statement>; - See the PigLatin manual for details: http://hadoop.apache.org/pig File system commands:fs <fs arguments> - Equivalent to Hadoop dfs command: http://hadoop.apache.org/common/docs/current/hdfs_shell.html Diagnostic Commands:describe <alias>[::<alias] - Show the schema for the alias. Inner aliases can be described as A::B. explain [-script <pigscript>] [-out <path>] [-brief] [-dot|-xml] [-param <param_name>=<pCram_value>] [-param_file <file_name>] [<alias>] - Show the execution plan to compute the alias or for entire script. -script - Explain the entire script. -out - Store the output into directory rather than print to stdout. -brief - Don't expand nested plans (presenting a smaller graph for overview). -dot - Generate the output in .dot format. Default is text format. -xml - Generate the output in .xml format. Default is text format. -param <param_name - See parameter substitution for details. -param_file <file_name> - See parameter substitution for details. alias - Alias to explain. dump <alias> - Compute the alias and writes the results to stdout. Utility Commands: exec [-param <param_name>=param_value] [-param_file <file_name>] <script> - Execute the script with access to grunt environment including aliases. -param <param_name - See parameter substitution for details. -param_file <file_name> - See parameter substitution for details. script - Script to be executed. run [-param <param_name>=param_value] [-param_file <file_name>] <script> - Execute the script with access to grunt environment. -param <param_name - See parameter substitution for details. -param_file <file_name> - See parameter substitution for details. script - Script to be executed. sh <shell command> - Invoke a shell command. kill <job_id> - Kill the hadoop job specified by the hadoop job id. set <key> <value> - Provide execution parameters to Pig. Keys and values are case sensitive. The following keys are supported: default_parallel - Script-level reduce parallelism. Basic input size heuristics used by default. debug - Set debug on or off. Default is off. job.name - Single-quoted name for jobs. Default is PigLatin:<script name> job.priority - Priority for jobs. Values: very_low, low, normal, high, very_high. Default is normal stream.skippath - String that contains the path. This is used by streaming any hadoop property. help - Display this message. history [-n] - Display the list statements in cache. -n Hide line numbers. quit - Quit the grunt shell.
history命令
此命令显示自Grunt shell被调用以来执行/使用的语句的列表。
使用
假设我们自打开Grunt shell之后执行了三个语句。
grunt> customers = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(','); grunt> orders = LOAD 'hdfs://localhost:9000/pig_data/orders.txt' USING PigStorage(','); grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING PigStorage(',');
然后,使用 history 命令将产生以下输出。
grunt> history customers = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(','); orders = LOAD 'hdfs://localhost:9000/pig_data/orders.txt' USING PigStorage(','); student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING PigStorage(',');
set命令
set 命令用于向Pig中使用的key显示/分配值。
使用
使用此命令,可以将值设置到以下key。
Key | 说明和值 |
---|---|
default_parallel | 通过将任何整数作为值传递给此key来设置映射作业的reducer数。 |
debug | 关闭或打开Pig中的调试功能通过传递on/off到这个key。 |
job.name | 通过将字符串值传递给此key来将作业名称设置为所需的作业。 |
job.priority | 通过将以下值之一传递给此key来设置作业的优先级:
|
stream.skippath | 对于流式传输,可以通过将所需的路径以字符串形式传递到此key,来设置不传输数据的路径。 |
quit命令
你可以使用此命令从Grunt shell退出。
使用
从Grunt shell中退出,如下所示。
grunt> quit
现在让我们看看从Grunt shell控制Apache Pig的命令。
exec命令
使用 exec 命令,我们可以从Grunt shell执行Pig脚本。
语法
下面给出了实用程序命令 exec 的语法。
grunt> exec [–param param_name = param_value] [–param_file file_name] [script]
示例
我们假设在HDFS的 /pig_data/ 目录中有一个名为 student.txt 的文件,其中包含以下内容。
Student.txt
001,Rajiv,Hyderabad 002,siddarth,Kolkata 003,Rajesh,Delhi
并且,假设我们在HDFS的 /pig_data/ 目录中有一个名为 sample_script.pig 的脚本文件,并具有以下内容。
Sample_script.pig
student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING PigStorage(',') as (id:int,name:chararray,city:chararray); Dump student;
现在,让我们使用 exec 命令从Grunt shell中执行上面的脚本,如下所示。
grunt> exec /sample_script.pig
输出
exec 命令执行 sample_script.pig 中的脚本。按照脚本中的指示,它会将 student.txt 文件加载到Pig中,并显示Dump操作符的结果,显示以下内容。
(1,Rajiv,Hyderabad) (2,siddarth,Kolkata) (3,Rajesh,Delhi)
kill命令
你可以使用此命令从Grunt shell中终止一个作业。
语法
下面给出了 kill 命令的语法。
grunt> kill JobId
示例
假设有一个具有id Id_0055 的正在运行的Pig作业,使用 kill 命令从Grunt shell中终止它,如下所示。
grunt> kill Id_0055
run命令
你可以使用run命令从Grunt shell运行Pig脚本
语法
下面给出了 run 命令的语法。
grunt> run [–param param_name = param_value] [–param_file file_name] script
示例
假设在HDFS的 /pig_data/ 目录中有一个名为 student.txt 的文件,其中包含以下内容。
Student.txt
001,Rajiv,Hyderabad 002,siddarth,Kolkata 003,Rajesh,Delhi
并且,假设我们在本地文件系统中有一个名为 sample_script.pig 的脚本文件,并具有以下内容。
Sample_script.pig
student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING PigStorage(',') as (id:int,name:chararray,city:chararray);
现在,让我们使用run命令从Grunt shell运行上面的脚本,如下所示。
grunt> run /sample_script.pig
你可以使用Dump操作符查看脚本的输出,如下所示。
grunt> Dump; (1,Rajiv,Hyderabad) (2,siddarth,Kolkata) (3,Rajesh,Delhi)
注意: exec 和 run 命令之间的区别是,如果使用run,则脚本中的语句在history命令中可用。
Pig脚本中的注释
在将脚本写入文件时,我们可以在其中包含注释,如下所示。
多行注释
我们将用'/*'开始多行注释,以'*/'结束。
/* These are the multi-line comments
In the pig script */
单行注释
我们将用“--"开始单行注释。
--we can write single line comments like this.
在批处理模式下执行Pig脚本
在以批处理方式执行Apache Pig语句时,请按照以下步骤操作。
步骤1
将所有需要的Pig Latin语句写在单个文件中。我们可以将所有Pig Latin语句和命令写入单个文件,并将其另存为.pig 文件。
步骤2
执行Apache Pig脚本。你可以从shell(Linux)执行Pig脚本,如下所示。
Local模式 | MapReduce模式 |
---|---|
$ pig -x local Sample_script.pig | $ pig -x mapreduce Sample_script.pig |
你可以使用exec命令从Grunt shell执行它,如下所示。
grunt> exec /sample_script.pig
从HDFS执行Pig脚本
我们还可以执行驻留在HDFS中的Pig脚本。假设在名为 /pig_data/ 的HDFS目录中有名为 Sample_script.pig 的Pig脚本。我们可以执行它如下所示。
$ pig -x mapreduce hdfs://localhost:9000/pig_data/Sample_script.pig
例
假设在HDFS中有一个具有以下内容的文件 student_details.txt 。
student_details.txt
001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi
004,Preethi,Agarwal,21,9848022330,Pune
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar
006,Archana,Mishra,23,9848022335,Chennai
007,Komal,Nayak,24,9848022334,trivendram
008,Bharathi,Nambiayar,24,9848022333,Chennai
我们还在同一个HDFS目录中有一个名为 sample_script.pig 的示例脚本。此文件包含对student关系执行操作和转换的语句,如下所示。
student = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
as (id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray);
student_order = ORDER student BY age DESC;
student_limit = LIMIT student_order 4;
Dump student_limit;
-
脚本的第一个语句会将名为 student_details.txt 的文件中的数据加载为名为student的关系。
-
脚本的第二个语句将根据年龄以降序排列关系的元组,并将其存储为 student_order 。
-
脚本的第三个语句会将 student_order 的前4个元组存储为 student_limit 。
-
最后,第四个语句将转储关系 student_limit 的内容。
现在,执行 sample_script.pig ,如下所示。
$./pig -x mapreduce hdfs://localhost:9000/pig_data/sample_script.pig
Apache Pig被执行,并提供具有以下内容的输出。
(7,Komal,Nayak,24,9848022334,trivendram)
(8,Bharathi,Nambiayar,24,9848022333,Chennai)
(5,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar)
(6,Archana,Mishra,23,9848022335,Chennai)
2015-10-19 10:31:27,446 [main] INFO org.apache.pig.Main - Pig script completed in 12
minutes, 32 seconds and 751 milliseconds (752751 ms)