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");

}

}