0

我是 hadoop 新手,正在学习流媒体作业。有人可以指导我如何通过 Java 代码运行 Streaming Jobs 吗?提前致谢。

4

2 回答 2

4

如果您想使用流式 API 运行 Java 代码,您可以直接将类名作为映射器和/或化简器传递。像这样的东西:

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
-input myInputDirs \
-output myOutputDir \
-mapper com.something.MyMapper \
-reducer com.something.MyReducer

但是,如果您只想运行 Java 代码,我建议您通过常规 J​​ava API 而不是使用 Hadoop 流,它更加灵活。

我不清楚您的问题是关于在流中运行 Java 代码,还是您想通过从 Java 调用流代码来启动流代码。我假设你想运行上面的 Java 代码,但如果它是另一个选项,你可以从 Java 启动一个子进程来运行命令行实用程序,例如:

String cmd = "/usr/bin/hadoop  jar /path/to/hadoop-streaming.jar -input myinput -output myoutput -mapper mymapper.sh -reducer myreducer.sh";
String[] cmdSplit = cmd.split(" ");
ProcessBuilder pb = new ProcessBuilder(cmdSplit);
pb.start();

您也可以通过在类路径中添加 hadoop-streaming jar 并调用:

String cmd = "/usr/bin/hadoop  jar /path/to/hadoop-streaming.jar -input myinput -output myoutput -mapper mymapper.sh -reducer myreducer.sh";
String[] cmdSplit = cmd.split(" ");
HadoopStreaming.main(cmdSplit);
于 2013-01-22T16:52:07.040 回答
1

如果您希望在 Java 中调用它,请查看使用 ToolRunner 来运行您的 Hadoop Streaming 代码。它将允许您灵活地从非 hadoop 节点调用 hadoop 流。

JobConf conf = new JobConf();
conf.set("fs.default.name", "hdfs://hadoop-worker-node:54310");
conf.set("mapred.job.tracker", "hadoop-worker-node:54311");

StreamJob sj = new StreamJob();

String cmdArgs = "-file mymapper.sh -file myreducer.sh -input myinput -output myoutput -mapper mymapper.sh -reducer myreducer.sh";
String[] cmdArgsSplit = cmdArgs.split(" ");

int jobReturnCode = ToolRunner.run(conf, sj, cmdArgsSplit);

由-file 参数指定的文件(例如映射器和reducers),以及hadoop 流运行时类,将打包在一个jar 中并发送到jobtracker。这具有在运行作业之前对 hadoop 节点进行零部署的优势。

编辑:我刚刚意识到这与查尔斯几周前在另一个线程中发布的示例非常相似:)

于 2013-01-24T17:21:23.530 回答