为什么hadoop被认为是i/o密集型的?

vmdwslir  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(618)

我一直在阅读一些关于hadoopmap/reduce的文献,其中一个主题似乎是:hadoop作业是i/o密集型的(例如:使用map/reduce排序)。
是什么使得这些作业i/o密集(考虑到hadoop将计算推到数据上的事实)?示例:为什么hadoopi/o中的排序是密集型的?
我的直觉:似乎在map阶段之后,中间对被送到了减速器。这是造成巨大i/o的原因吗?

a11xaf1n

a11xaf1n1#

hadoop用于对大量数据执行计算。您的作业可能受到io(您称之为i/o密集型)、cpu和网络资源的限制。在hadoop使用的经典案例中,您对大量的输入数据执行本地计算,同时返回相对较小的结果集,这使得您的任务比cpu和网络密集型任务更加io密集,但这在很大程度上取决于作业本身。以下是一些示例:
io密集型工作。你在Map上读了很多数据,但是Map任务的结果并不是很大。例如,计算输入文本中的行数,计算rcfile中某一列的总和,通过一个基数相对较小的列对单个表进行分组,得到配置单元查询的结果。这意味着你的工作主要是读取数据并对其进行简单的处理。
cpu密集型作业。当你需要在Map或缩小面上执行一些复杂的计算时。例如,您正在执行某种nlp(自然语言处理),比如标记化、部分语音标记、词干分析等等。此外,如果您以高压缩率的格式存储数据,数据解压缩可能会成为该过程的瓶颈(这里有一个来自facebook的例子,他们在facebook上寻找cpu和io之间的平衡)
网络密集型。通常,如果您看到集群上的网络利用率很高,这意味着有人没有抓住重点,执行了通过网络传输大量数据的作业。在使用wordcount的示例中,假设只使用mapper和reducer而不使用combiner来处理此作业中1pb的输入数据。这样,在map和reduce任务之间移动的数据量将比输入数据集还要大,所有这些都将通过网络发送。另外,这可能意味着您不使用中间数据压缩(mapred.compress.map.output和mapred.map.output.compression.codec),原始Map输出通过网络发送。
关于集群的初始调优,您可以参考本指南,那么为什么排序是io密集型的呢?首先,从磁盘读取数据。其次,在排序时,Map程序生成的数据量与读取的数据量相同,这意味着它很可能不适合内存,应该溢出到磁盘。然后它被转移到异径管,并再次溢出到磁盘。然后它被减速器处理,再次被刷新到磁盘上。而排序所需的cpu相对较小,特别是排序键是数字并且可以很容易地从输入数据中解析出来时。

相关问题