前言
研究生阶段将要接触大数据和深度学习的知识,在网上找的教程大多一上来就是一堆名词又解释不清楚,对新手相当不友好,在慕课网看到一个教程,利用博客记录下自己学习的过程。
hadoop介绍
关于hadoop 最好的介绍莫过于官网的文档,hadoop的官网如下,
我们一句一句来看看hadoop官网是怎么介绍的。
The Apache Hadoop® project develops open-source software for reliable, scalable, distributed computing.
这段话说hadoop是一个开源的软件,并且是可靠性的(reliable)、可扩展性的(scalable)、分布式计算的(distributed computing)软件。这三个特点我们后面会进行详细解释。
The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models. It is designed to scale up from single servers to thousands of machines, each offering local computation and storage. Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer, so delivering a highly-available service on top of a cluster of computers, each of which may be prone to failures.
这段话的意思是,hadoop是一个框架,用来干什么事呢?可以允许分布式处理大数据集(big data sets),而且这个数据集是横跨在集群的机器上的(clusters of computers)。也就是说数据可以分开地存储在集群中的每个机器(节点)上,并且可以跨节点进行处理计算,它使用的是一种简单的编程模型(using simple programming models)。他被设计成可以从单个服务器(single servers)扩展到数千台机器的的集群上,每台机器都提供本地的存储和计算服务。也就是说当数据量小的时候,可以使用少一点的机器的集群,而面对一个大量数据的情况时,现有的机器不足以支撑存储运算时,只需要再添加一些机器到集群中,就能解决问题。最后,hadoop并不是依赖硬件来提供高可用性,而是它自己被设计成可以检测和处理应用层的故障。在集群中每台机器上提供高可靠性服务,而这些机器可能会倾向于出现故障。
The project includes these modules:
- Hadoop Common: The common utilities that support the other Hadoop modules.
- Hadoop Distributed File System (HDFS): A distributed file system that provides high-throughput access to application data.
- Hadoop YARN: A framework for job scheduling and cluster resource management.
- Hadoop MapReduce: A YARN-based system for parallel processing of large data sets.
hadoop框架包含以下4个模块:
- 通用Hadoop模块:这是一些工具用来支撑其他的模块。
- 分布式文件系统(HDFS):用来提供高吞吐量对于应用数据的访问,负责数据的底层存储。
- YARN:一个框架用来提供调度服务和集群的资源管理。个人感觉有点像cpu在电脑中位置,只不过cpu调度的是单个电脑中的进程,而这里用来管理整个集群。
- MapReduce:一个基于YARN系统之上的可以并行处理大数据集的框架。
关于hadoop的概述就就看到这里。
hadoop能做什么
hadoop可以搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务。
- 搜索引擎:搜索出来东西的分析,可以用hadoop来完成,比如:Google、Yahoo等等。
- 日志分析:占大数据处理的很大比重,基于日志的数据分析和数据挖掘。
- 商业智能:可视化报表的产生等等。
- 数据挖掘:从大量的数据中挖掘出有价值的结论等等。比如淘宝可以从用户的购买数据中挖掘出,买了这样东西后更可能买其他的哪些东西,再把这些产品推荐给你,你就有可能会购买,这些都是对公司发展极为有利的应用。
分布式文件系统HDFS
我们现在的个人电脑的存储一般在1T左右,这存储一些我们日常使用的数据倒是没什么问题,可是如果数据量上去了,怎么存储这些数据便是个很头疼的问题,比如要存储淘宝一年的数据,或是腾讯亿级用户的数据,显然个人电脑中的存储系统是远远不够的,那么为了解决海量数据的存储问题,Google公司在2003年10月发布的一篇论文解决了这个问题,他提出了GFS的文件系统()。
但是它的系统并不是开源的,只是把技术成果发表出来了。那么我们想用这个技术怎么办?于是HDFS应运而生,HDFS相当于GFS的克隆版,是社区中的一些程序员按照GFS的技术做出的开源实现。
HDFS的全称是Hadoop Distributed File System,翻译过来就是分布式文件系统。
那么HDFS有什么样的特点呢?
- 扩展性:HDFS是可扩展的。扩展性其实非常好理解,前面也解释过,假设现在集群有100台电脑,当这些电脑的支撑不起更大的数据量时怎么办?很简单,再添加100台机器到这个集群中,如果还不满足那就继续加,直到能够处理为止。
- 容错性:HDFS是以多副本方式存储的。假设我们要往PC中存数据,然后不小心删了(假设回收站中也清了),那怎么办?数据就没有了,也找不回来了,而如果数据非常重要的话,那么系统就很有可能会出故障,这就是容错性低。那么怎么解决这个问题呢?很显然,将数据备份一下就好了,一份可能还不够,那就再多备几份,HDFS的多副本说白了就是将原始数据复制几份分别存到好几台机器中去,一台机器挂了?没事,其他机器上还有该数据的备份,完全不会影响整个系统的运行,这就是容错性高。当然如果机器全挂了,那就真的GG了。
- 适合海量数据存储:相对于单机的存储,由于HDFS是基于集群的,存储的数据要远远大于单机的存储量。
hadoop会将文件切分成指定大小的数据块并以多副本的方式存储在多个机器上。多副本我们知道了,文件切分的思想其实在操作系统中也有,一个1G的文件,一个1M的文件,怎样给他们分配内存空间,操作系统中采用的是分页的方法,将文件切分成大小相同的数据块(比如4M),也就是分页,然后分别放入内存的页框中。HDFS也是将文件切成固定大小,再分别备份放入不同的机器中存储,这个默认切分大小是128M,当然也可以在配置中设置这个值的大小。
说到这,有人可能会问,那么数据切分的工作需要我们做吗?当然不用,一个成熟的框架,肯定是用户怎么舒服怎么来,不然别人为什么要用你的框架。所以hadoop的数据切分,以及多副本、容错的操作都是对用户透明的,都是hadoop内部已经做好的,不需要用户做了。用户只需要像正常操作文件一样,比如创建文件、删除文件,跟windows下或linux下的操作方式是一样的。
下面这个图说明了hadoop的多副本存储机制:
这里写图片描述我们看对于上面的两个文件,HDFS是怎么存储的,filename是文件名, numReplicas是复制的份数, blockIds是文件被切分成数据块后,每个块的id。file1文件被切成2块,每块复制2份,file2文件被切成3块,每块复制3份。我们可以看到对于每个文件的每个块,其存储位置都是分散在各个节点上的。为什么说HDFS可靠,以1号块为例,如果1号节点上的1号块没了,可以再从3号节点中获取,仍然能获取到1号块的内容。至于为什么要给文件编号这个问题应该不用多说了吧,当然是为了能组合成一个完整的文件。
资源调度系统YARN
所谓YARN,它的全称是Yet Another Resource Negotiator,翻译过来就是另一种资源协调者,换句话说就是资源的管理调度者,YARN负责整个hadoop集群资源的管理和调度。举个例子,如果一个作业要执行,那么该占用多少CPU资源,占用多少内存空间,这都是由调度系统所完成的。
YARN的特点跟HDFS很相似:
- 扩展性:计算能力不够的话可以通过添加机器的方式增加计算能力。
- 容错性:作业在执行过程中如果出现异常的话,YARN会对这个任务进行一定次数的重试。
- 多框架资源统一调度:在YARN之上可以跑很多不同的作业和框架,YARN相当于一个中间层,对上层框架提供服务,如果没有YARN,那么多框架之间(比如Pig、Spark、Hive)该怎么协调统一就是很大的问题了。(hadoop各个框架的关系可以看文末的图)
分布式计算框架MapReduce
MapReduce框架源自于Google的MapReduce论文,发表于2014年12月。同HDFS一样,MapReduce也是Google的MapReduce的克隆版。
MapReduce的特点,扩展性和容错性跟前面的差不多,还有个特点就是海量数据的离线处理,它可以处理的数据量非常大,所谓离线处理,就是把海量的数据投到这个框架中去跑,由于同一批次处理海量的数据,自然延时性比较大,比较耗时。
对于MapReduce框架的理解可以以词频统计的例子来说明:
问题是这样的,给定一个文件,统计出这个文件中每个单词的出现次数。我们来看看MapReduce框架是如何处理这样的问题的。
- 拆分:我们说hadoop在处理文件时,会将文件切分成固定大小的数据块,在这个例子中,原始文件被切分成了3个数据块,这些数据块会分别复制写入集群中的不同机器中。有人要问了,图中的切分后每个块的大小也不是固定的啊,值得说明的是,MapReduce的输入拆分是基于输入数据的逻辑边界。例如,拆分大小可以基于文件中的记录数(如果数据是以记录的方式存在)或以字节为单位的实际大小。拆分的大小几乎总是小于HDFS块的大小,拆分数量对应于在映射阶段中使用的映射进程数。
- 映射:映射操作是根据空格将数据块中的单词分割出来,每读一个单词,就产生一条记录。这一步在不同的机器上是并行完成的,那么会在哪些机器上完成呢?前面我们说每个数据块都会被复制多份放在不同的节点上,MapReduce会尝试选择拥有此数据最空闲的节点。
- 合并:这个阶段是可选的,并没有画在图中,考虑第二个数据块的映射,产生了两条
(run,1)
的记录,如果在下一步之前做预缩减将两条(run,1)
记录合并成(run,2)
,显然会对后续工作提供一些便利。 - 派发:在上一步结束后,只是统计出在每个数据块中每个单词的出现次数,我们最终的目的是统计整个文件中的出现次数,因此要将不同数据块中相同单词的记录放在一起,这样才是该单词总共出现的次数。
- 缩减:缩减步骤很好理解,将前一步中每个单词在每个数据块中的出现次数相加,就得到单词在整个文件中的出现次数了。
最终将reduce后的结果输出到一个文件中就解决问题了。
整个MapReduce的流程我们已经通过一个例子了解了,其实我觉得MapReduce跟算法中的分治法非常相似,分治法有3个步骤:切分(divide)、解决(conquer)、合并(combine)。其中切分对应的Mapping,合并对应的Reducing。如果我们考虑人工去统计一篇文章中的词频,我们会怎么做?一个人完成整个步骤当然是没问题的,但如果想要提高效率,那很简单,多找几个人。按照分治的思想,先将大问题拆解成几个小问题,也就是每个人负责一两个段落;然后分别解决小问题,每个人把自己分到的段落的词频统计出来;最后合并,把每个人统计的结果合并起来就解决了整个问题,显然这要比一个人的效率高很多,MapReduce也是同样的思想。
hadoop的优势
我们来总结以下hadoop 比起其他的框架,它的优势主要体现在哪些方面:
- 高可靠性
- 数据存储:数据块多副本,由HDFS实现,防止数据丢失。
- 数据计算:重新调度作业计算,由YARN实现,作业发生异常并不会导致系统崩溃,会自动地重新进行调度计算。
- 高扩展性
- 存储/计算资源不够时,只需要横向地扩展机器数量即可。
- 在一个集群中可以包含数以千计万计的节点之上。
- 其他
- 存储在廉价机器上,降低成本。
- 成熟的生态圈,每个框架在社区十分活跃。
hadoop生态系统
提到hadoop,会有很多关键词,比如spark、Hbase、Hive、zookeeper等等,他们之间的关系是怎样的呢?可以参见下图:
这里写图片描述到这里我们可以说对hadoop已经有了一个初步的认识,后面我们会就HDFS、YARN进行详细的说明。
参考资料
- 慕课网《10小时入门大数据》
- 《写给大忙人看的Hadoop2》
网友评论