我们是hadoop新手,我们意识到hadoop是用来处理大数据的,而笛卡尔的产品是多么的昂贵。然而,我们正在进行一些实验,其中我们运行的笛卡尔积作业与mapreduce design patterns一书中的作业类似,只是使用了一个reducer来计算所有中间结果的平均值(只包括ab的上半部分,所以total是ab/2)。我们的设置:3节点集群,块大小=64m,我们测试了从5000点(130kb)到10000点(260kb)的不同数据集大小。
观察:
1-所有Map任务都在一个节点上运行,有时在主计算机上运行,有时在一个从计算机上运行,但它从未在多台计算机上处理过。有没有办法强制hadoop在多台计算机之间分配拆分从而Map任务?hadoop根据什么因素决定哪台机器来处理map任务(在我们的例子中,hadoop决定了主任务,而在另一个例子中,hadoop决定了从任务)。
2-在所有情况下,如果我们在不同的数据大小上测试同一个作业,我们将得到4个map任务。数字4从何而来?既然我们的数据大小小于块大小,为什么我们有4个拆分而不是1。
3-是否有方法查看有关正在运行作业的精确拆分的更多信息。
提前谢谢
1条答案
按热度按时间kxeu7u2r1#
你用的是什么版本的hadoop?我将假设使用Yarn的更高版本。
1) hadoop应该在集群中自动分配map任务,而不喜欢任何特定的节点。它将把一个map任务放置在尽可能靠近数据的位置,即它将选择一个节点管理器,该节点管理器与一个数据块所在的datanode位于同一主机上。如果这样的节点管理器不可用,那么它只会选择一个节点来运行您的任务。这意味着您应该在启动作业时看到所有从属节点都在运行任务。可能还有其他因素阻止hadoop使用节点,比如nodemanager关闭,或者没有足够的内存来启动特定节点上的jvm。
2) 您的文件大小是否略高于64mb?即使是67108864字节上的一个字节也会产生两个分裂。cartesianinputformat首先计算数据集中所有块的叉积。拥有两个块的文件将创建四个分割——a1xb1、a1xb2、a2xb1、a2xb2。尝试一个较小的文件,看看你是否仍然得到四个分裂。
3) 您可以在resourcemanager的ui中看到正在运行的作业。https://:8088将打开主页(jobtracker)-host:50030 for mrv1),您可以从那里导航到正在运行的作业,这将使您看到正在运行的单个任务。如果您想更详细地了解输入格式正在做什么,请向cartesianinputformat的getsplits方法添加一些日志语句,然后重新运行代码以查看发生了什么。