Hadoop中setJarByClass方法的两个疑问
嗨,我来帮你理清这两个关于setJarByClass的疑问哈!
疑问1:不设置setJarByClass时,Hadoop会自动处理吗?
你的猜测完全正确!很多场景下Hadoop确实会自动帮你搞定Jar包的定位。
setJarByClass的核心作用是给Job提供一个「锚点类」,让它能找到包含Mapper、Reducer等所有相关业务类的Jar包路径。但如果你没手动调用这个方法,Hadoop会尝试从当前运行的主类(也就是你启动的WordCount2)的类加载上下文里自动推断Jar的位置——比如你在本地IDE里运行,或者所有相关类都打包在同一个Jar里时,Hadoop能顺利定位到Jar文件,所以你的程序照样能正常跑起来。
不过要提醒一句:在复杂的集群部署场景中,还是建议手动设置setJarByClass,避免出现类找不到的异常哦。
疑问2:指定其他类的setJarByClass,为什么还是运行当前类的代码?
这是因为setJarByClass根本不是用来指定要执行哪个业务类的~它的职责只是告诉Hadoop:「去这个类所在的Jar包里找我需要的所有类文件」。
你在代码里已经明确指定了Mapper和Reducer是WordCount2中的实现(比如通过job.setMapperClass(WordCount2.MyMapper.class)、job.setReducerClass(WordCount2.MyReducer.class)),而且你启动的主类本身就是WordCount2,所以Job自然会按照你定义的业务逻辑来执行。只要WordCount和WordCount2在同一个Jar包里,或者你指定的WordCount.class所在的Jar包含WordCount2的类,Hadoop就能加载到正确的类,执行你写的WordCount2的逻辑。
简单总结:setJarByClass管的是「去哪里找类」,而不是「用哪个类」~
备注:内容来源于stack exchange,提问作者seungbok3240

