我是Hadoop和整体MapReduce范例的新手。我在网上搜索了很多关于覆盖Map类中的 setup()方法以访问配置对象的信息。但是根据我的阅读,似乎每次运行任务时都会调用 setup()方法。
那么为什么需要一个单独的方法来访问配置对象并初始化参数呢?为什么我们不能直接在 map()或 reduce()方法中做同样的事情?
虽然两种方法最终都会按要求提供输出,但在选择任何一种方法时是否会出现性能因素?提前谢谢。
答案 0 :(得分:0)
答案不在于Hadoop,而在于我认为的编程范式。 分离业务逻辑的不同部分总是好的,设置运行环境与运行映射本身不同。
想象一下,如果您有某些数据需要进行多次计算,在这种情况下,如果您有一个父类用于您的作业,您可以通过覆盖单独的方法来执行常见的设置阶段,这样做会更好
设计只是鼓励你选择这种行为。
答案 1 :(得分:0)
您必须检查map()
或reduce()
是否已初始化参数,以便通过划分初始化和实际地图来简化初始化过程逻辑阶段。
答案 2 :(得分:0)
我不确定我是否正确,但据我所知,map()
和reduce()
在分布式网络中的节点中执行,其中节点不了解整个系统。因此,您在map() reduce()
方法中访问的内容不是主节点中配置的内容。您无法访问节点中的整个配置,因为这意味着您需要始终连接到主节点。
答案 3 :(得分:0)
Re:“似乎每次运行任务时都会调用setup()方法。”
每当运行任务时,相应的Map或Reduce任务都会处理多少条记录。为每个正在处理的记录调用map()或reduce()方法。但是,每个任务运行一次setup()方法,通过初始化配置/资源(例如(数据库连接,读取参考文件等)),只需对该任务正在处理的所有记录执行一次,从而使您有机会优化工作流程。
同样,API提供了一个名为“cleanup”的回调,您可以在其中清理资源。当任务完成处理为该任务分配的记录时,将调用此方法。