Hadoop与MapReduce学习笔记

一、Hadoop简介

Hadoop最早只是单纯的值分布式计算系统,但随着时代的发展,目前hadoop已成了一个完整的技术家族。从底层的分布式文件系统(HDFS)到顶层的数据解析运行工具(Hive, Pig),再到分布式协调服务(Zookeeper),以及流行的分布式数据库(HBase),都属于Hadoop家族,几乎涵盖了大部分大数据应用场景。在Spark没流行之前,hadoop一直是大数据应用中的绝对主流,即使是现在,依旧有大量的中小型公司,还是依靠Hadoop搭建大数据系统。

虽然如今Hadoop家族庞大,但早年Hadoop结构非常简单,几乎只有两块:一个是分布式文件系统,一个是MapReduce算法。

在这里插入图片描述
大数据时代,数据动辄以TB,PB计算。那么海量的数据,用常规的方法非常困难,因为即使是O(n)的算法,将所有数据都遍历一遍,所消耗的时间也是以小时计,这显然是不能接受的。不仅如此,像MySQL这样的数据库对于数据规模也是有限制的,一旦数据规模巨大,超过了数据库的承载能力,那几乎是系统级的噩梦。

在这里插入图片描述
既然我们把数据全部存储在一起,会导致系统问题,那么我们可不可以把数据分成很多份,在分别存储;当我们需要处理这些数据的时候,我们对这些分成许多小份的数据分别处理,最后再合并再一起?

答案当然是可行的,Hadoop文件系统正式基于这个思路。

在HDFS中,将数据分割成一个个小份,每个小份叫做一个数据块,每个存储块为64MB。这样一个巨大的文件会被打散存储在许多存储块中。当我们需要操作这些数据的时候,Hadoop会同时启动许多个执行器(executor)来并发执行这些存储块。理论上来说,执行器的数量越多,执行的速度也越快。只要我们有足够多的执行器,就可以在短时间内完成海量数据的计算工作。

原因也很简单,因为数据存储在磁盘上,当我们查找数据的时候,CPU其实是不知道数据究竟存放在什么地方的。需要有一个专门的程序去查找数据的位置,这个过程被称为寻址。寻址的时候回伴随硬盘的高速旋转。硬盘的旋转速度是有限的,所以我们查找文件的速度也存在瓶颈。如果存储块太小,那么存储块的数量就会很多,我们寻址的时间就会变长。

在这里插入图片描述
如果存储块设置的大一些行不行?也不行,因为我们在执行的时候,需要把存储块的数据copy到执行器的内存里执行,这个copy是伴随着读写和网络传输操作,传输数据同样耗时不少。存储块过大,会导致读写的时间过长,目前网络带宽最多可嘴鸥到100MB/s,根据计算,每个块大约在100MB左右最佳,也许程序员为了凑整,所以选了64MB这个大小。

那么,Hadoop怎样做并发计算的呢?这就该MapReduce出场了。

二、MapReduce

严格说,MapReduce不是一种算法,而是一种计算思想。他有map和reduce两个阶段组成。

在这里插入图片描述
先说Map,MapReduce中的Map和Java语言的map不同,他表示的意思是映射,负责执行map操作的机器(称为mapper),从HDFS中拿到数据后,会对这些数据进行处理,从其中提出我们需要用到的字段或者数据,将他组织成key->value的结构,进行返回。

为什么要返回key->value的结构呢?直接返回value不行吗?

不行,因为在map和reduce中介,Hadoop会根据key值进行排序,将key值相同的数据归并到一起之后,再发送reduce执行。也就是说,key值相同的数据会被同一个reducer也就是同一台机器处理,并且key相同的数据连续排列。reducer做的就是通过mapper拿到的数据,生成我们最终需要的结果。

为什么一开始的时候,要处理成key->value结构呢?为什么又要将key值相同的数据放入一个reducer中呢?这有什么意义?

这里举例说明:
MapReduce有一个景点问题,叫做wordCount,就是给定一堆文本,最后计算出文本中每个单词分别出现的次数。Map阶段很简单,我们遍历出文本当中的单词,没遇到一个单词,就输出单词和数字1.

这样当然还是不够的,我们还需要把相同的单词聚合起来,清点一下看究竟出现了多少次,这时就要用到reducer了。reducer也很简单,我们读入的是Map输出的结果。由于key相同的数据都会进入到同一个reducer当中,所以我们不需要担心遗漏,只需要直接统计就行。

如果map结果不是key->value结构,那么Hadoop久没办法根据key进行排序,并将Key相同的数据归并在起义。那么我们reduce的时候,同一个单词就可能出现在不同的reducer当中,这样的结果显然是不正确的。

当然,如果我们只做一些简单的操作,也可以舍弃reduce阶段,只保留Map的结果。

现在看MapReduce的思想并不复杂,但当年大数据还未兴起的时候,MapReduce横空出世,既提升了计算性能,又保证结果准确。一举解决了大规模数据并行计算的问题。虽然如今技术更新,尤其是Spark的流行,抢走了Hadoop的许多荣光,但Mapreduce思想依旧在许多领域广泛使用,比如Python就支持MapReduce操作,允许用户自定义map和reduce函数,对数据进行并行处理。

不过,MapReduce也有短板,比如像数据库表join操作通过MapReduce就很难实现。而且相比后来的Hive赫尔Spark SQL来说,MapReduce的编码复杂度要更大一些。

猜你喜欢

转载自blog.csdn.net/shijinghan1126/article/details/109314781