I am new to hadoop and learning about streaming jobs. Can anybody guide me regarding how to run Streaming Jobs through Java code? Thanks in Advance.
2 に答える
ストリーミング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コードのみを実行する場合は、Hadoopストリーミングを使用する代わりに通常のJava APIを使用することをお勧めします。これは、はるかに柔軟性があります。
あなたの質問が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-streamingjarを追加して、次のように呼び出すことでも同じことができます。
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);
Have a look at using ToolRunner to run your Hadoop Streaming code if you are looking to invoke it in Java. It will allow you the flexibility of invoking hadoop streaming from a non-hadoop node.
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);
The files specified by the -file arguments (e.g. mappers and reducers), as well as the hadoop streaming runtime classes, will be packaged in a jar and sent through to the jobtracker. This has the advantage of zero-deployment to the hadoop node before running the job.
EDIT: I just realised this is very similar to the example Charles posted in another thread a couple of weeks ago :)