python - map task 数量和拆分大小

标签 python hadoop

我想做什么

我是 hadoop 的新手,我尝试使用不同数量的映射器和缩减器多次执行 MapReduce,并比较执行时间。文件大小约为 1GB,我没有指定拆分大小,因此它应该是 64MB。我正在使用一台有 4 个内核的机器。

我做了什么

mapper 和reducer 是用python 写的。所以,我正在使用 hadoop 流媒体。我通过使用 '-D mapred.map.tasks=1 -D mapred.reduce.tasks=1' 指定了 map 任务和 reduce 任务的数量

问题

因为我指定使用 1 个 map 任务和 1 个 reduce 任务,我预计只会看到一次尝试,但实际上我有 38 次 map 尝试和 1 个 reduce 任务。我阅读了与此问题类似的教程和 SO 问题,有人说默认 map task 是 2,但我得到了 38 个 map task 。我还读到 mapred.map.tasks 只建议数量, map task 的数量是分割大小的数量。但是1GB除以64MB大约是17,所以还是不明白为什么要创建38个map任务。

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

2) 假设我成功指定我只想使用 2 个 map task ,它是否使用 2 个核心?而且每个核心都有1个map任务??

最佳答案

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

考虑另一种情况,您正在处理存储在数据库中而不是 HDFS 中的数据。当我们谈论数据库时,如果没有 64MB block 大小的概念,会发生什么情况?

框架会尽力以尽可能高效的方式执行计算,这可能涉及创建您指定/期望的更少/更多映射器。因此,为了了解映射器是如何创建的,您需要查看您在工作中使用的 InputFormat。准确地说是 getSplits() 方法。

  1. 如果我只想使用 1 个 map task ,是否必须将输入拆分大小设置为 1GB?

    您可以重写 InputFormat 的 isSplitable(FileSystem, Path) 方法,以确保输入文件不会被拆分,并由单个映射器作为一个整体进行处理。

  2. 假设我成功指定我只想使用 2 个 map task ,它是否使用 2 个核心?而且每个核心都有1个map任务??

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

关于python - map task 数量和拆分大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20248521/

相关文章:

hadoop - 如何在 Apache NiFi 中动态地将值从 executeSQL 传递到 SelectHiveQL

python - 使用 Python 操作 XML

python - 如何在aiohttp服务器应用程序中实现current_request

Hadoop 从属文件配置

shell - BigQuery命令无法从Oozie工作流程运行

hadoop - yarn - 为什么应用程序尝试两次?

python - 为什么Basemap南极立体 map 投影坐标与同一投影下的数据集坐标不一致?

python - 如何在不指定簇数的情况下对列表中的项目进行聚类

python - while 语句和表达式

java - 在 hadoop 中连接到 HDFS 时出现 EOFException