您的位置:首页 > 运维架构

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

2015-08-12 18:12 447 查看
最近是用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息