在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 依赖项?