gra*_*hez 5 java hadoop mapreduce
我试图在Hadoop中做一些简单的事情,并发现当编写映射器和reducer时,到处定义为静态.我的任务将被分解为几个map部分和一个最终部分reduce.如果我想在其他工作中重复使用我的一个映射器怎么办?如果我将mapper类定义为内部类,static我可以在其他工作中使用它吗?此外,非平凡的问题可能需要更多更复杂的映射器,因此将它们全部放在一个巨大的文件中会在维护时变得非常糟糕.
有没有办法让mappers和reducer作为常规类(可能甚至在单独的jar中)而不是作业本身?
你的问题是这个类必须是静态的,可能是静态的,还是内在的,或者应该是内在的?
Hadoop本身需要能够实例化你的Mapper或Reducer通过反射,给定你的类参考/名称Job.如果它是一个非静态内部类,则会失败,因为只能在一些其他类的上下文中创建一个实例,这可能是Hadoop一无所知.(我想,除非内部类扩展其封闭类.)
所以回答第一个问题:它不应该是非静态的,因为这几乎肯定会使它无法使用.回答第二个和第三个:它可以是静态(内部)类.
对我而言,Mapper或者Reducer显然是一个顶级概念,值得一流的课程.有些人喜欢让它们内部静态,以便将它们与"Runner"类配对.我不喜欢这个,因为它实际上是什么子包.你注意到另一个设计理由要避免这种情况 对于第四个问题:不,我相信内部阶级不是好习惯.
最后一个问题:是Mapper和,Reducer类可以在一个单独的JAR文件中.你告诉Hadoop哪些JAR文件包含所有这些代码,那就是它将发送给工作者的代码.工人们不需要你的Job.然而,他们需要在同一个JAR中依赖Mapper和Reducer依赖的任何东西.