我正在使用 Pig 0.12.0 和 Hadoop 2.2.0。我已经在本地和 map reduce 模式下成功地从 grunt shell 和 pig 批处理脚本运行 pig。现在我正在尝试从 Java 中的嵌入式 pig 运行 pig。
话虽如此,我也成功地在本地模式下运行了嵌入式 pig 。但是,我在 map reduce 模式下运行 embedded pig 时遇到了问题。
问题是:成功编译类后,运行时没有任何反应
java -cp <classpath> PigMapRedMode
后来我看到有人说我应该在类路径中包含 pig.properties。比如
fs.default.name=hdfs://<namenode-hostname>:<port>
mapred.job.tracker=<jobtracker-hostname>:<port>
但是,在 Hadoop 2.2.0 中,JobTracker 不再存在。有什么想法该怎么办?
我附上了 PigMapRedMode 的 Java 代码,以防这里出现问题。
import java.io.IOException;
import org.apache.pig.PigServer;
public class PigMapRedMode {
public static void main(String[] arg){
try {
PigServer pigServer = new PigServer("map reduce, (need to add properties file)");
runIdQuery(pigServer, "5pts.txt");
} catch (Exception e){
}
}
public static void runIdQuery(PigServer pigServer, String inputFile) throws IOException {
pigServer.registerQuery("A = load '" + inputFile + "' using PigStorage(',');");
pigServer.registerQuery("B = foreach A generate $0 as id;");
pigServer.store("B", "id.out");
}
}
更新:
已找到解决方案!实际上,不需要在类路径中提供 Properties 对象或使用 pig.properties,您所要做的就是在类路径中包含 Hadoop 配置目录:(对于我的 Hadoop 2.2.0,它是/etc/hadoop)和可以从那个地方检索 df.default.address 和 yarn.resourcemanager.address。
我在下面附上了修改后的java代码:
/**
* Created by allenlin on 2/19/14.
*/
import java.io.IOException;
import java.util.Properties;
import org.apache.pig.ExecType;
import org.apache.pig.PigServer;
public class PigMapRedMode {
public static void main(String[] arg){
try {
PigServer pigServer = new PigServer(ExecType.MAPREDUCE);
runIdQuery(pigServer, "<hdfs input address>");
} catch (Exception e){
}
}
public static void runIdQuery(PigServer pigServer, String inputFile) throws IOException {
pigServer.registerQuery("A = load '" + inputFile + "' using PigStorage(',');");
pigServer.registerQuery("B = foreach A generate $0 as id;");
pigServer.store("B", "<hdfs output address>");
}
}
我用来运行 java 类的 Unix 命令。请注意您需要包括的依赖项:
java -cp ".:$PIG_HOME/build/pig-0.12.1-SNAPSHOT.jar:$HADOOP_HOME/share/hadoop/common/lib/*:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/mapreduce/*:antlr-runtime-3.4.jar:$HADOOP_HOME/share/hadoop/yarn/*:$HADOOP_HOME/share/hadoop/hdfs/*:$PIG_HOME/build/ivy/lib/Pig/*:$HADOOP_CONF_DIR" PigMapRedMode
感谢@zsxwing 的帮助!
最佳答案
这是我运行 Embedded Pig 的方式
public class test1 {
public static void main(String[] args) {
try {
PigServer pigServer = new PigServer(ExecType.MAPREDUCE);
runQuery(pigServer);
Properties props = new Properties();
props.setProperty("fs.default.name", "hdfs://localhost:9000");
}catch(Exception e) {
e.printStackTrace();
}
}
public static void runQuery(PigServer pigServer) {
try {
pigServer.registerQuery("input1 = LOAD '/input.data' as (line:chararray);");
pigServer.registerQuery("words = foreach input1 generate FLATTEN(TOKENIZE(line)) as word;");
pigServer.registerQuery("word_groups = group words by word;");
pigServer.registerQuery("word_count = foreach word_groups generate group, COUNT(words);");
pigServer.registerQuery("ordered_word_count = order word_count by group desc;");
pigServer.registerQuery("store ordered_word_count into '/wct';");
} catch(Exception e) {
e.printStackTrace();
}
}
}
在eclipse中设置HADOOP_HOME
Run Configurations-->ClassPath-->User Entries-->Advanced-->Add ClassPath Variables-->New-->Name(HADOOP_HOME)-->Path(You Hadoop directory path)
我添加的 Maven 依赖项
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<version>0.15.0</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr-runtime</artifactId>
<version>3.4</version>
</dependency>
</dependencies>
如果没有正确设置HADOOP_HOME,会出现如下错误
hadoop20.PigJobControl: falling back to default JobControl (not using hadoop 0.20 ?)
关于hadoop - 无法在 MapReduce 模式下使用 Java 运行 Embedded Pig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21896864/