2012-06-22 59 views
3

我是猪脚本,Hadoop,Hbase的新手。这是我需要知道的。我想运行猪脚本,我不想将猪脚本嵌入到我的java程序中,并希望通过任何Pig执行方法来运行它,传递必要的猪脚本和参数(可能是参数文件)。核心猪库或任何其他图书馆是否提供执行猪脚本的方式?我已经尝试过使用java运行时exec方法,我使用空格分隔的字符串传递一些参数,因此我通过运行时exec方法调用了pig grunt命令,因为它不是执行pig命令的正确方法。在java中运行没有嵌入猪脚本的猪

回答

8

您可以使用org.apache.pig.PigServer从Java程序运行猪脚本。

PigServer pigServer = new PigServer(ExecType.MAPREDUCE); 
pigServer.registerScript("scripts/test.pig"); 

需要类路径中的'pig.properties'。

fs.default.name=hdfs://<namenode-hostname>:<port> 
mapred.job.tracker=<jobtracker-hostname>:<port> 

或者将一个java.util.Properties的实例传递给PigServer构造函数。

Properties props = new Properties(); 
props.setProperty("fs.default.name", "hdfs://<namenode-hostname>:<port>"); 
props.setProperty("mapred.job.tracker", "<jobtracker-hostname>:<port>"); 
PigServer pigServer = new PigServer(ExecType.MAPREDUCE, props); 
+0

如何执行猪脚时获取日志?如何知道作业是否成功执行? – Kumar

1

我不知道我明白你在问什么。你想知道如何从Java程序运行Pig脚本吗?

如果是这样,我们使用类org.apache.pig.PigRunner为此。

PigStats pigStats = PigRunner.run(args, null); 

它的Javadoc指出:

的实用程序,以帮助在Java程序中运行的PIG脚本。

但是从我的经验来看,猪并不是真的打算以这种方式使用(至少在0.8版本中)。我们遇到了问题,例如保持打开的FileStreams以及未被删除的临时文件。

0

因为其他人深受embeding在java中相同的解释猪的执行,让我补充如何在未Java运行parametrised猪。

在这个场景中,你所需要的只是将猪的代码行保存为猪档案,如myFirstPigScript.pig

接下来你需要的是内部的参数。那么这里有三种输入参数来运行你的myFirstPigScript.pig

pig -p in1=file1.txt -p in2=file2.txt -p outdirectory=outdirectory myFirstPigScript.pig 

你的猪脚本会像

A = load '$in1' USING PigStorage(',') AS (id_one:chararray,file1field1:chararray); 
B = load '$in2' USING PigStorage(',') AS (id_two:chararray,file2field1:chararray); 
C = join A by id_one, B by id_two; 
store D into '$outdirectory' USING PigStorage(',') ; 

样品输入文件将是一个两列的csv文件

输出“部分”文件将存在于outdirectory