2014-09-03 80 views
3

我一直在阅读关于Hadoop Map/Reduce的一些文章,而一般的主题似乎是:Hadoop Jobs是I/O密集型的(例如:使用Map/Reduce排序)。为什么Hadoop被认为是I/O密集型的?

什么使得这些工作I/O密集型(鉴于Hadoop推动计算到数据的事实)? 示例:为什么在Hadoop I/O密集型中排序?

我的直觉:似乎在映射阶段之后,中间对被发送给reducer。这是否导致了巨大的I/O?

+0

是的,数据写入磁盘。 – 2014-09-03 20:21:00

+0

有计算密集的情况吗?传统的排序算法在一般意义上需要大量的计算。 – 2014-09-03 20:24:59

+0

是的,当你没有从磁盘读取(很多)的东西;-) – 2014-09-03 20:25:58

回答

5

Hadoop用于对大量数据执行计算。您的工作可能受到IO(资源密集型,称为I/O密集型),CPU和网络资源的限制。在使用Hadoop的经典案例中,您正在对大量输入数据执行本地计算,同时返回相对较小的结果集,这使得您的任务比CPU和网络密集型更具IO密集度,但它非常依赖于作业本身。以下是一些示例:

  1. IO强化作业。你在地图上读了很多数据,但你的地图任务的结果并不那么大。一个例子是计算输入文本中的行数,计算来自RCfile的某列的总和,通过具有相对较小基数的列的组获得Hive查询的结果。这意味着你的工作所做的事情主要是读取数据并对其进行一些简单的处理。
  2. CPU密集作业。当你需要在地图上执行一些复杂的计算或减少方面。例如,你正在做一些类似标记化的NLP(自然语言处理),部分语言标记,词干等等。另外,如果以高压缩率格式存储数据,数据解压缩可能会成为该流程的瓶颈(这里是他们在寻找CPU和IO之间平衡的example from Facebook)。通常情况下,如果您在群集上看到高网络利用率,则意味着有人错过了这一点,并实现了通过网络传输大量数据的作业。在wordcount的例子中,想象一下在这个工作中输入数据的1PB只用mapper和reducer处理,不需要组合器。这样,在map和reduce任务之间移动的数据量将比输入数据集更大,并且所有这些都将通过网络发送。另外,这可能意味着您不使用中间数据压缩(mapred.compress.map.output和mapred.map.output.compression.codec),并且通过网络发送原始地图输出。

您可以参考this guide为集群 的初始调整,为什么排序是IO密集型的?首先,您从磁盘读取数据。接下来,在排序映射器生成的数据量与读取的数据量相同时,意味着它很可能不适合内存,并且应该传播到磁盘。然后它被转移到reducer并再次溢出到磁盘。然后它被减速器处理并再次冲刷到磁盘。而排序所需的CPU相对较小,特别是如果排序关键字是数字并且可以从输入数据轻松解析。

相关问题