为什么hadoop mapper和reducer采用类名而不是对象?

nbnkbykc  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(286)

我刚刚开始使用hadoop,在设置mapper、reducer和其他任何东西时,我看到了这一点 job.set*() 它总是要求一个类名。为什么不是那个类的对象?
我相信这一定是有原因的。有人愿意提一下原因吗?

6ljaweal

6ljaweal1#

根据你的问题,我推测你在寻找一个你看不见的物体。
在本例中,您正在寻找 MAPPER object 但你没有发现 NEW 关键字在程序中的任何位置。
总而言之。怎样 A.class 正在转换为 A a = new A(); ? 以及 WHY? 简单地说,如果没有java或hadoop中的对象,就不能做任何事情。
因此,将为所述类创建幕后对象以执行程序。在高层,我们可以说这个机制内置于hadoop中,用于根据需要创建对象。
在更高的层次上他们使用 JAVA Reflection API 在引擎盖下进行无缝操作。
为什么需要这样做?-- THE REASONS 因为我们不知道以下问题的答案:
文件大小是多少? Number of Mappers 基于这些信息。
有多少个输入拆分(一些对象基于此)?
输入和输出有多少个键/值对(这里还有一些对象)?
mapper/reducer/etc.(其他x.class输入和相关对象)
因为我们不知道 How many(total number) Objects are needed? 以及 When(execution time in program) they are needed? 我们需要依赖一个更高端的api,比如反射来在运行时处理它们。
那个 Reflection API used by HADOOP 负责提供 OBJECT 对于输入 CLASS 根据时间的需要。
希望这能澄清。

8gsdolmq

8gsdolmq2#

正如您可能已经观察到的,hadoop中的作业是由map reduce框架以分布式方式执行的。
因此,实际作业将通过将工作划分为多个Map器和约简器来执行,其中每个Map/约简作业实际上是一个java进程,将由集群中许多随机节点上的任务容器来执行。
我们在作业配置中提到的设置只是有关作业的规范。根据此设置,将在随机jvm任务容器上创建所需的mapper/reducer示例。
将示例化的map/reduce对象从job config传递到每个分布式节点的任务容器(实际的map/reduce任务将在其中执行)是没有效率的,而是可以根据作业设置在容器上按需创建这样的示例。
希望这有帮助。

相关问题