Python 映射任务数和拆分大小 我想做什么

Python 映射任务数和拆分大小 我想做什么,python,hadoop,Python,Hadoop,我是hadoop新手,我尝试使用不同数量的映射器和还原器多次执行MapReduce,并比较执行时间。文件大小大约为1GB,我没有指定拆分大小,所以应该是64MB。我用的是一台4芯的机器 我所做的 映射器和还原器是用python编写的。所以,我使用hadoop流媒体。我使用“-D mapred.map.tasks=1-D mapred.reduce.tasks=1”指定了映射任务和reduce任务的数量 问题 因为我指定使用1个映射任务和1个reduce任务,所以我只希望看到一次尝试,但实际上我有

我是hadoop新手,我尝试使用不同数量的映射器和还原器多次执行MapReduce,并比较执行时间。文件大小大约为1GB,我没有指定拆分大小,所以应该是64MB。我用的是一台4芯的机器

我所做的 映射器和还原器是用python编写的。所以,我使用hadoop流媒体。我使用“-D mapred.map.tasks=1-D mapred.reduce.tasks=1”指定了映射任务和reduce任务的数量

问题 因为我指定使用1个映射任务和1个reduce任务,所以我只希望看到一次尝试,但实际上我有38次映射尝试和1个reduce任务。我阅读了一些教程和类似于这个问题的问题,有些人说默认的地图任务是2,但我得到了38个地图任务。我还了解到mapred.map.tasks仅表示数量,而map任务的数量是分割大小的数量。然而,1GB除以64MB大约是17,所以我仍然不明白为什么要创建38个映射任务

1) 如果我只想使用1个映射任务,是否必须将输入拆分大小设置为1GB


2) 假设我成功地指定只使用2个映射任务,它是否使用2个核心?每个核心有一个映射任务???

映射者的数量实际上由您使用的InputFormat控制。尽管如此,根据您正在处理的数据类型,InputFormat可能会有所不同。通常,对于以HDFS FileInputFormat或子类格式存储为文件的数据,使用MR split=HDFS块的原理。然而,这并不总是正确的。假设您正在处理一个平面二进制文件。在这种情况下,没有分隔符(\n或其他内容)来表示分割边界。在这种情况下你会怎么做?因此,上述原则并不总是有效的

考虑另一个场景,其中您正在处理存储在DB中而不是HDFS中的数据。当我们谈论DBs时,在没有64MB块大小的概念的情况下会发生什么

框架尽最大努力以尽可能高效的方式执行计算,这可能涉及按照您的指定/预期创建更少/更多数量的映射器。因此,为了查看映射器是如何创建的,您需要查看您在工作中使用的输入格式getSplits()方法要精确

  • 如果我只想使用1个映射任务,是否必须将输入拆分大小设置为1GB

    您可以覆盖InputFormat的isSplitable(FileSystem,Path)方法,以确保输入文件不会被分割,而是由单个映射器作为一个整体进行处理

  • 假设我成功地指定只使用2个映射任务,它是否使用2个核心?每个核心有一个地图任务

    这取决于可用性。映射器可以同时在多个核心上运行。单个核心可以按顺序运行多个映射器


  • 问题2的一些附加内容:在节点上运行map/reduce任务的并行性是可控的。可以通过
    mapreduce.tasktracker.map.tasks.maximum
    mapreduce.tasktracker.reduce.tasks.maximum
    设置tasktracker同时运行的map/reduce任务的最大数量。是2。对于4核节点
    mapreduce.tasktracker.map.tasks.maximum
    应增加到至少4个,即使用每个核心。2对于最大减少任务,预期是可以的。顺便说一句,找出max map/reduce任务的最佳值并非易事,因为它取决于集群上作业的并行度,作业的映射器/约简器是io密集型还是计算密集型,等等