`

hadoop命令加载包的顺序

 
阅读更多

这几天在搞hadoop的一个基础包,过程中搞的很头大,明明用-libjars传了,在job提交前总是提示出错,新修改的函数执行出错。不过最后还是解决了,这要从hadoop本身加载包里函数的顺序说起。

hadoop命令执行时,本地执行时(没有提交到jobtracker之前)要从CLASSPATH里加载jar包,并调用从CLASSPATH里jar包中的函数。在runjob之前,提交job的gateway上的代码就是从CLASSPATH的jar包里取的函数(提交之后,是在各个map/reduce节点上找jar包里对应的函数。)

这时就有个问题,如果多个包中有相同的函数(当然包括package也相同),那么hadoop程序会执行哪个?答案是:顺序执行。hadoop(应该是java)会拿第一个匹配到的函数来用,这样当有两个jar包里的package名相同,而且函数名相同时,就会用第一个。

-libjars只是把你用到的第3方包传到M/R的节点上(hadoop目录lib下的包不会上传,如果有自己的第3方包的话,要显式的用-libjars上传),从hadoop的源码里可以看出,当前目录的包是放在lib之后加载的,所以调试的时候,如果这个包之前在lib下的话,会一直用lib下的jar,导致新的函数无法使用。

用sh -x hadoop xxxx 可以看到hadoop的详细运行过程,通过查看CLASSPATH能看到jar包的装载顺序。

所以,如果什么时候发现自己的新jar里的函数在runjob前出错,就看hadoop中定义的CLASSPATH里是否有jar和你的package名和函数名重了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics