使用Java Apis在hadoop中运行Streaming作业

时间:2013-01-22 16:21:15

标签: java hadoop hadoop-streaming

我是hadoop的新手并且正在学习流媒体工作。 任何人都可以指导我如何通过Java代码运行Streaming Jobs吗? 在此先感谢。

2 个答案:

答案 0 :(得分:4)

如果要使用流API运行Java代码,可以直接将类名称作为映射器和/或reducer传递。像这样:

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

但是,如果您只想运行Java代码,我建议您使用常规Java 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);

答案 1 :(得分: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参数指定的文件(例如mappers和reducers)以及hadoop流运行时类将打包在jar中并发送到jobtracker。这具有在运行作业之前对hadoop节点进行零部署的优势。

编辑:我刚刚意识到这与几周前另一个线程中的例子Charles posted非常相似:)