最近是用hadoop遇到些需求,要想抽离出reduce里面的某个算法包,从而能够动态改动算法
(1)如何动态调用抽离出的算法包Jar
这里就涉及到URLClassLoader的东西
loader = new URLClassLoader(new URL[]{
new URL(jarFile)
}, Thread.currentThread().getContextClassLoader());
Class<? extends Commander> myClass = (Class<? extends Commander>) loader.loadClass("com.out.CommanderImpl");
cmd = myClass.newInstance();
当然这里有个前提,就是要让算法包和调用者都是用同一个接口来实现实例化和调用。
(2)如何在hadoop的MR上实现
MR要读取文件,当然是放在hdfs集群上,所以需要调用hdfs://xxxx的路径。
因为URL解析需要protocol,而原始的Java是没有hdfs解析协议的,所以需要加上一句
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
这个就放在static{}语句块里执行就好了
(3)如何告诉MR我的算法包url位置
现在url如果写死在程序,是可以直接调用的,但是如果想要动态存入,就需要传入参数。
想要在 Job和Mapper/Reducer之间传递参数,需要用到Conf.set() Conf.get()
OK,万事具备,MR写好,动态更新算法包就可以了。
附上几个有用的链接:
http://blog.csdn.net/wawmg/article/details/17961815
http://blog.csdn.net/wisgood/article/details/17080207