和Hadoop1一样,YARN也支持可插入式的调度方式。本文将介绍如何在源码的基础上修改调度策略,并将其应用至Hadoop2上,以修改CapacityScheduler为例,其原理和过程如下。
原理
Hadoop2编译好后的各组件生成的jar包会放在$HADOOP_HOME/share/hadoop目录,Hadoop运行过程中也会调用该文件夹下相应的jar包。因此修改源码后,将相应的组件导出为jar包并覆盖该文件夹的子目录相应的jar包即可。
如果是调度器的话, 将hadoop-2.3.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java包导出并覆盖到HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-server-resourcemanager-2.3.0.jar即可。
步骤
step1.源码编译,并导入Eclipse
ubuntu下hadoop-2.2.0的源码编译,参照:http://mmicky.blog.163.com/blog/static/15029015420136224315566/。注意,编译前一定要装好第三方库,编译源码前,还需修改一个bug:修改文件$hadoop-2.3.0-src/hadoop-common-project/hadoop-auth/pom.xml中的
<dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-util</artifactId> <scope>test</scope> </dependency> | 为 | <dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty</artifactId> <scope>test</scope> </dependency> |
---|
编译好后,即可将其导入到eclipse。导入后,会出现很多类或者方法找不到JAR包,为了解决这个问题,需要将第三方JAR包导入工程中。方法如下:右击Project名称,在弹出的快捷菜单中选择“Properties”命令,将会弹出一个界面,然后在该界面中一次选择“Java Build Path”——>“Libraries”——>“Add External JARS...”,将$hadoop-2.3.0-src/hadoop-dist/target/hadoop-2.3.0.tar.gz解压后生成的目录中share/hadoop目录下各个子目录中lib文件夹下的JAR包导入工程。
step2.修改源码
修改包“org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity”即可
step3.覆盖
将/hadoop-2.3.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java包导出并覆盖到$HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-server-resourcemanager-2.3.0.jar即可。