由于某项工作需要预测MapReduce Job最终执行结果,预测方法需要有Job提交时系统的一些特征,所以需要修改Hadoop源码,获取系统特征,重点修改了JobSubmitter.java。
(1)获取系统中正在运行的Job数量,及Task数量
JobStatus jobStatus[] =cluster.getAllJobStatuses();
for(int i=0;i<jobStatus.length;i++){
if (jobStatus[i].getState()== JobStatus.State.RUNNING){
Job tmpJob = cluster.getJob(jobStatus[i].getJobID());
int tmpReduce = tmpJob.getTaskReports(TaskType.MAP).length;
int tmpMap = tmpJob.getTaskReports(TaskType.REDUCE).length;
numoftasks = numoftasks + tmpMap + tmpReduce;
numofjobs++;
}
}
(2)获取Job配置信息
int numOfMap = conf.getInt(MRJobConfig.NUM_MAPS,1);
int numOfReducer = conf.getInt(MRJobConfig.NUM_REDUCES,1);
将获取的的特征值,通过Restful服务传给服务器端进行预测。
(3)批量打包Hadoop Jar文件
以WordCount为例:
cd WordCountJar//wordcount.java所在路径
num=11 //需要打包的wordcount.java个数
name=WordCount
tmp=hadoop-2.6.0/share/hadoop //本机hadoop的安装路径
for((a=1;a<num;a++))
do
rm "$name".java
cp "$a".java "$name".java
javac -classpath "$tmp"/common/hadoop-common-2.6.0.jar:"$tmp"/common/lib/commons-cli-1.2.jar:"$tmp"/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar:./WordCountJar "$name".java
jar -cvf "$a".jar ./"$name".class
done
注意:如果某个Job中含有多个java文件,则需要在编译器中首先编译成class文件,然后将class文件放入主类所在目录下(即WordCountJar)。然后将class文件添加到jar语句的后面即可。jar -cvf "$a".jar ./"$name".class ./WordCountMap.class ./WordCountReduce.class
(4)并行运行多个Hadoop Jar 文件
只需在命令后面添加&转到后台运行即可
bin/hadoop jar ../jar/TopNJar/1.jar TopN /input/topn/[1-9] /output/topn/1 &
bin/hadoop jar ../jar/TopNJar/2.jar TopN /input/topn/[1-9] /output/topn/2 &