【发布时间】:2015-09-16 05:47:55
【问题描述】:
包含我的 Mapper/Reducer 类的 jar 文件是否需要部署在运行 Hadoop 的所有节点上?还是只在主节点(Name Node)上?
【问题讨论】:
包含我的 Mapper/Reducer 类的 jar 文件是否需要部署在运行 Hadoop 的所有节点上?还是只在主节点(Name Node)上?
【问题讨论】:
简短回答:否。
node/gateway 机器是您开始 MapReduce 作业的地方。您需要将主 MapReduce Driver jar 放在本地文件系统中,所有依赖 jar 都可以放在 local file system 或 HDFS 路径中。因此,当您开始作业时,您将使用 -libjars 参数传递依赖库 jar 路径。 HDFS jar 将包含 hdfs:// 前缀到它们在 HDFS 中的路径。本地系统需要主 MapReduce jar 来启动 mapreduce 作业,该作业实质上是联系 Resource Manager (Hadoop-2) 为作业分配特定于应用程序的 Application Master。
Hadoop 是使用 数据局部性 概念设计的。在现实世界中,数据的大小远远大于需要在数据上执行的代码的大小。可执行的 jars 被传输到本地包含数据块的节点。这样可以最大限度地减少网络传输时间。
【讨论】:
这是一个棘手的问题。
您的 jar 需要位于所有节点中,这些节点将执行您的作业的至少一项任务(Map 和/或 reducer)(不是所有节点)。 但是您不需要自己分发 jar。这就是 hadoop 基于它的 ResourceManager 和它的 MapReduce 框架知道如何做的事情。hadoop jar 命令是启动该过程的人。如果您的 MapReduce 应用程序需要外部依赖项(其他 jars),那么您需要将它们提供给 hadoop 并指定它们以分布在节点之间。
【讨论】: