Pig实战
在开发和运行Pig应用程序时,知道一些实用技术是非常有帮助的。本小节将介绍 一些这样的技术。
并行处理
运行在MapReduce模式时,需要告诉Pig每个作业要用多少个reducer。这需要在 reduce阶段的操作中使用PARALLEL子句。在reduce阶段使用的操作包括所有的 “分组” (grouping)和 “连接” (joining)操作(GROUP,COGROUP, JOIN, CROSS) 以及DISCTINCT和ORDER。默认情况下,reducer的个数为1(和在MapReduce中 相同)。因此,在大规模数据集上运行时,设置并行度就变得尤为重要。下面这行 代码将GROUP的reducer个数设为30:
grouped_records = GROUP records BY year PARALLEL 30;
设置reduce任务个数的一种比较好的方式是把该参数设为稍小于集群中的reduce 任务槽数。对于这个问题的详细讨论,可参见第195页的补充内容“选择reducer 的个数”。
map任务的个数由输入的大小决定(每个HDFS块一个map),不受PARALLEL子 句的影响。
参数替换
如果有定期运行的Pig脚本,你可能希望让这个脚本能够在不同参数设置下运行。 例如,一个每天运行一次的脚本可能要根据日期来决定它要处理哪些输入文件。 Pig支持“参数替换”(parameter substitution),即用运行时提供的值替换脚本中的 参数。参数由前缀为$字符的标识符来表示。例如,在以下脚本中,$input和 $output用来指定输入和输出路径:
--max_temp_param.pigrecords = LOAD ,$input, AS (year:chararray, temperature:int, quality:int); filtered_records = FILTER records BY temperature != 9999 AND(quality == 0 OR quality == 1 OR quality == 4 OR quality == 5 OR quality == 9); grouped_records = GROUP filtered_records BY year; max_temp = FOREACH grouped_records GENERATE group, MAX(filtered_records.temperature);STORE max_temp into ,$output';
参数值可以在启动Pig时使用-param选项指定,每个参数一个:
% pig -param input=/user/tom/input/ncdc/micro-tab/sample.txt \>-param output=/tmp/out \>chll/src/main/pig/max_temp_param.pig
也可以把参数值放在文件中,通过-param_file选项把参数传递给Pig。例如,我 们把参数定义放在文件中,也可以获得相同的结果:
#Input fileinput=/user/tom/input/ncdc/micro-tab/sample.txt#Output file output=/tmp/out
对Pig的调用相应如下调整:
% pig -param_file chll/src/main/pig/max_temp_param.param \>chll/src/main/pig/max_temp_param.pig
可以重复使用-param_file来指定多个参数文件。还可以同时使用-param和-param_file选项。如果同一个参数在参数文件和命令行中都有定义,那么命令行 中最后出现的参数值优先级最髙。
动态参数
针对使用-param选项来提供的参数,很容易使其值变成动态的,运行命令或脚本 即可变为动态的。很多Unix shell都用反引号引用的命令来替换实际值。我们可以 使用这一功能实现根据日期来确定输出目录:
% pig -param input=/user/tom/input/ncdc/micro-tab/sample.txt \> -param output=/tmp/'date "+%Y-%m-%d" '/out \> chll/src/main/pig/max_temp_param.pig
Pig也支持在参数文件中的反引号,在shell中执行用反引号引用的命令,并使用 shell的输出结果作为替换值。如果命令或脚本返回一个非零的退出状态并退出, Pig会报告错误消息并终止执行。在参数文件中使用反引号是一种很有用的特性: 它意味着可以使用完全相同的方法在文件中或命令行中定义参数。
参数代换处理
参数代换是脚本运行前的一个预处理步骤。可以使用-dryrun 选项运行Pig来査看 预处理器所进行的代换。在-dryrun模式下,Pig对参数进行替换,并生成一个使 用了替换值的原来脚本的副本,但并不执行该脚本。在普通模式下,可以在运行之 前査看生成的脚本,检査参数替换是否合理(例如,在动态生成替换的情况下)。