我刚刚开始使用Hadoop,我看到在设置映射器,缩减器和job.set*()
中的任何其他内容时,它总是要求一个类名。为什么不是那个类的对象?
我确信这一定是有原因的。有人会提到原因吗?
答案 0 :(得分:3)
正如您可能已经观察到的那样,Hadoop中的作业由map-reduce框架以分布式方式执行。
因此,实际工作将通过将工作分成多个映射器和缩减器来执行,其中每个map / reduce作业实际上是一个Java进程,它将由集群中许多随机节点上的任务容器执行。
我们在作业配置中提到的设置仅是有关作业的规范。根据此设置,将在随机JVM任务容器上创建所需的Mapper / Reducer实例。
将实例化的map / reduce对象从作业配置传送到每个将执行实际map / reduce任务的分布式节点的任务容器是不高效的,而是可以在容器上创建这样的实例根据工作设置按需提供。
希望这有帮助。
答案 1 :(得分:2)
根据您的问题,我认为您正在寻找一个您不可见的物体。
在示例中,您正在寻找MAPPER object
,但您未在程序中的任何位置找到NEW
关键字。
总结一下。 A.class
如何转换为A a = new A();
?并WHY?
用简单的话来说,如果没有java或hadoop中的对象,就不能做任何事情。
因此,幕后创建的对象是为程序执行提到的类。在高级别我们可以说这个机制是在hadoop中内置的,以便在需要的基础上处理对象创建。
在更高的级别,他们使用JAVA Reflection API
无缝地执行此操作。
为什么需要这个? - THE REASONS
因为我们不知道ANSWERS实时跟踪问题:
Number of Mappers
基于此信息。我们不知道
How many(total number) Objects are needed?
和
When(execution time in program) they are needed?
我们需要依赖像反射这样的高端API来在运行时处理它们。
Reflection API used by HADOOP
负责根据小时的需要为输入OBJECT
提供CLASS
。
希望这澄清一下。