14.6.2 MapReduce模式
这一节我们将结合上面给出的实例具体讲解如何在Pig的MapReduce模式下对数据进行操作。同时,我们同样对Pig在MapReduce模式下的三种运行方式进行详细介绍。
1.Grunt Shell
MapReduce模式下,Pig的使用其实是Pig Local模式和Hadoop操作的结合。因为要运行MapReduce程序我们需要在Hadoop的HDFS文件系统下对文件进行操作,但是在Linux系统下我们是看不到HDFS文件系统下的文件的,所以就不能使用常规的操作来“搬运”文件。这里,我们就需要使用与HDFS相关的命令在HDFS文件系统下执行Pig的命令。
首先,从终端进入Pig的MapReduce模式,然后使用copyFromLocal命令将文件从本地复制到HDFS文件系统中,如下所示:
grunt>>copyFromLocal srcpath/Student dstpath;
通过ls命令,我们可以查看是否成功将文件复制到相应的HDFS文件系统中了。操作完成后,我们就可以像在Local模式下一样对文件进行操作了。这里,Pig会自动地将我们的命令分散到分布式系统中去执行,然后返回给用户。
2.脚本文件
参考Local模式下脚本文件的执行。
3.嵌入式程序
参考Local模式下脚本文件的执行,这里我们给出MapReduce模式下程序的代码,可以看到,除了指定相应的模式之外,MapReduce模式下程序代码和Local模式没有什么不同。这是因为,所有的分布式操作将由Pig系统自动执行,而不需要用户在MapReduce的编程框架下设计程序,这就大大地减轻了用户的负担,也使得用户能更容易掌握Pig嵌入式程序,见代码清单14-3。
代码清单14-3 MapReduce模式下的Pig脚本
package cn.edu.ruc.cloudcomputing.book.chapter14;
import java.io.IOException;
import org.apache.pig.PigServer;
public class tst_mapreduce{
public static void main(String[]args){
try{
PigServer pigServer=new PigServer("mapreduce");//MapReduce模式
runIdQuery(pigServer,"/path/Student");//调用函数
}
catch(Exception e){}
}
public static void runIdQuery(PigServer pigServer, String inputFile)throws
IOException{
pigServer.registerQuery("A=load'"+inputFile+"'using PigStorage(':')as
(Sno:chararray, Sname:chararray, Ssex:chararray, Sage:int, Sdept:chararray);");
pigServer.registerQuery("B=foreach A generate Sname, Sage;");
pigServer.store("B","/path/tstJavaMapReduce.out");
}
}