hadoop的MR如何实现动态替换算法包

最近是用hadoop遇到些需求,要想抽离出reduce里面的某个算法包,从而能够动态改动算法


(1)如何动态调用抽离出的算法包Jar

这里就涉及到URLClassLoader的东西

loader = new URLClassLoader(new URL[]{
						new URL(jarFile)
				}, Thread.currentThread().getContextClassLoader());
				Class myClass = (Class) 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



你可能感兴趣的:(大数据和分布式)