使用JavaAPI在hadoop中运行流作业

使用JavaAPI在hadoop中运行流作业,java,hadoop,hadoop-streaming,Java,Hadoop,Hadoop Streaming,我是hadoop新手,正在学习流媒体工作。 有人能指导我如何通过Java代码运行流式作业吗? 提前感谢。如果您想使用流式API运行Java代码,可以直接将类名作为映射器和/或缩减器传递。大概是这样的: $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper com.something.MyMapper \ -reducer

我是hadoop新手,正在学习流媒体工作。 有人能指导我如何通过Java代码运行流式作业吗?
提前感谢。

如果您想使用流式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代码,我建议您使用常规的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);

如果希望使用流式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代码,我建议您使用常规的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);

如果您希望在Java中调用Hadoop流代码,请查看使用ToolRunner运行Hadoop流代码。它将允许您灵活地从非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参数(例如映射器和还原器)指定的文件以及hadoop流运行时类将打包在一个jar中,并发送到jobtracker。这样做的优点是,在运行作业之前,可以零部署到hadoop节点


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

如果您希望在Java中调用Hadoop流代码,请查看使用ToolRunner来运行Hadoop流代码。它将允许您灵活地从非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参数(例如映射器和还原器)指定的文件以及hadoop流运行时类将打包在一个jar中,并发送到jobtracker。这样做的优点是,在运行作业之前,可以零部署到hadoop节点


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

非常感谢Charles!:)我想通过从Java调用流代码来调用流代码。抱歉,如果我不清楚的话。嗨,查尔斯,我们也有类似HadoopStreaming的东西来运行pig作业脚本吗?@Ajn有类似于
PigServer
PigRunner
的东西,但你可能应该为此提出另一个问题,因为这是一个完全不同的问题,我可以给你一个更详细的想法。非常感谢查尔斯!:)我想通过从Java调用流代码来调用流代码。抱歉,如果我不清楚的话。嗨,查尔斯,我们也有类似HadoopStreaming的东西来运行pig作业脚本吗?@Ajn有类似于
PigServer
PigRunner
的东西,但你可能应该为此提出另一个问题,因为这是一个完全不同的问题,我可以给你一个更详细的想法。谢谢你!我会试试的。谢谢你!我试试看。