在java中运行pig而不嵌入pig脚本

Posted

技术标签:

【中文标题】在java中运行pig而不嵌入pig脚本【英文标题】:Run pig in java without embedding pig script 【发布时间】:2012-06-22 07:41:15 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

执行pig脚本时如何获取日志?如何知道作业执行成功与否?【参考方案2】:

我不确定我是否理解您的要求。您想知道如何从 Java 程序运行 Pig 脚本吗?

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

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

它的 Javadoc 声明:

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

但是根据我的经验,Pig 并不是真的打算以这种方式使用(至少在 0.8 版中)。我们遇到了一些问题,例如打开的文件流和未删除的临时文件。

【讨论】:

【参考方案3】:

由于其他人已经通过在 java 中嵌入相同的方式很好地解释了 pig 执行,所以让我简单地补充一下如何在没有 java 的情况下运行参数化 pig。

在这种情况下,您所需要的只是将猪代码行保存为猪文件,例如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 文件

输出“部分”文件将出现在目录中

【讨论】:

以上是关于在java中运行pig而不嵌入pig脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 CDH4 集群上运行 Pig 时无法进入 mapreduce 模式(Hadoop 2 + MapReduce v1)

运行 Apache Pig 脚本时如何查找 jar 依赖项?

在 Amazon AWS 上并行运行 Pig 脚本

运行 Pig 脚本时出现异常

使用 hacatalog 在 tez 模式下运行 pig 脚本时出错

从 pig 脚本运行时,PIG 未从 hdfs 读取文件