我开始玩hadoop(但是无法访问群集,所以只能在独立游戏中玩)。我的问题是,一旦它在集群设置中,如何分配任务并将代码库转移到新节点?
理想情况下,我想运行大批量作业,如果我需要更多容量,请向群集添加新节点,但我不确定是否必须复制本地运行的相同代码或执行特殊操作批处理作业正在运行我可以添加容量。我以为我可以将我的代码库存储在HDFS上,并在每次需要时将其拉到本地运行,但这仍然意味着我需要在服务器上运行某种初始脚本,并且需要先手动运行它。
如果可能的话,任何建议或建议都会很棒!
谢谢。
答案 0 :(得分:7)
使用hadoop jar
命令安排mapreduce作业时,jobtracker将确定执行作业所需的映射器数量。这通常取决于输入文件中的块数,并且无论您拥有多少个工作节点,此数字都是固定的。然后它将招募一个或多个任务执行者来执行您的工作。
应用程序jar(以及使用-libjars
参数指定的任何其他jar)将自动复制到运行用于执行jar的tasktrackers的所有计算机。所有这些都由Hadoop基础架构处理。
添加额外的tasktrackers将增加作业的并行性假设存在尚未安排的地图任务。它不会做的是自动重新分区输入以在其他地图容量之间并行化。因此,如果您的地图容量为24(假设每个4个数据节点上有6个映射器),并且您有100个映射任务,前24个执行,并且您添加了另一个数据节点,则会获得一些额外的速度。如果您只有12个地图任务,添加机器将无法帮助您。
最后,您需要了解数据引用位置。由于理想情况下应该在最初存储数据的同一台机器上处理数据,因此添加新的任务跟踪器不一定会增加比例处理速度,因为这些数据最初不是本地数据,而是需要通过网络复制。 / p>
答案 1 :(得分:1)
我不完全赞同丹尼尔的回答。 主要是因为如果“在开始工作时,jar代码将被复制到集群知道的所有节点”是真的,那么即使您使用100个映射器并且有1000个节点,所有作业的代码也将始终复制到所有节点。没有意义。
相反,Chris Shain的回答更有意义的是,只要JobTracker上的JobScheduler选择要执行的作业并确定要由特定数据节点执行的任务,那么此时它会以某种方式传达任务跟踪器从何处复制代码库。最初(在mapreduce作业开始之前),代码库被复制到mapred.submit.replication参数定义的多个位置。因此,tasktracker可以从几个位置复制代码库,其中一个列表可以由jobtracker发送给它。
答案 2 :(得分:0)
在尝试构建Hadoop集群之前,我建议使用Amazon's Elastic MapReduce来使用Hadoop。
关于您要解决的问题,我不确定Hadoop是否合适。 Hadoop对于简单的可并行化批处理作业很有用:解析thousonds(或更多)文档,排序,重新分组数据)。 Hadoop Streaming将允许您使用您喜欢的任何语言创建映射器和缩减器,但输入和输出必须采用固定格式。有许多用途,但在我看来,过程控制不是设计目标之一。
[编辑]或许ZooKeeper更接近您所寻找的目标。
答案 3 :(得分:0)
如果需要,您可以为批处理作业添加容量,但需要在代码库中将其显示为可能。例如,如果您有一个包含一组输入的映射器,您希望分配多个节点以承受压力。所有这些都可以完成,但不能使用默认的Hadoop安装。
我目前正在开发一个嵌套的Map-Reduce框架,它扩展了Hadoop代码库,并允许您根据mapper或reducer获得的输入生成更多节点。如果你有兴趣请给我一行,我会解释更多。
此外,当涉及-libjars
选项时,这仅适用于由您编写的作业指示的jobtracker分配的节点。因此,如果指定10个映射器,-libjar将在那里复制您的代码。如果你想从10开始,但是按照自己的方式工作,你添加的节点将没有代码。
绕过此方法的最简单方法是将jar添加到hadoop-env.sh
脚本的类路径中。这将始终在将jar传递给集群知道的所有节点的作业副本时。