为什么Hadoop映射器和reducer采用类名而不是对象?

时间:2015-09-16 07:03:24

标签: java hadoop

我刚刚开始使用Hadoop,我看到在设置映射器,缩减器和job.set*()中的任何其他内容时,它总是要求一个类名。为什么不是那个类的对象?

我确信这一定是有原因的。有人会提到原因吗?

2 个答案:

答案 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实时跟踪问题:

  1. 文件大小是多少? Number of Mappers基于此信息。
  2. 有多少输入拆分(某些对象基于此)?
  3. INPUT和OUTPUT有多少个键/值对(此处还有一些对象)?
  4. 映射器/减速器/等。 (其他X.class输入和相关对象)
  5. 我们不知道

    How many(total number) Objects are needed?

    When(execution time in program) they are needed?

    我们需要依赖像反射这样的高端API来在运行时处理它们。

    Reflection API used by HADOOP负责根据小时的需要为输入OBJECT提供CLASS

    希望这澄清一下。