我是hadoop的新手并且正在学习流媒体工作。 任何人都可以指导我如何通过Java代码运行Streaming Jobs吗? 在此先感谢。
答案 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非常相似:)