简介
Hadoop是用于海量数据处理和分析的分布式平台。实际上Hadoop除了最初的HDFS和MapReduce两个组件,现在已经发展到六十多个组件,覆盖了从数据存储、执行引擎到数据访问框架等各个层面。“Hadoop”有时被人们用来指代一个更大的、多个项目组成(多指分布式计算和大规模数据处理范畴)的生态系统,而不仅仅是HDFS和MapReduce。
特点
- 适合大规模的数据处理
- 适合少量的大容量文件,而不适合大量的小文件
- 适合处理流式数据,一般一次写入,多次读取
- 只需要求商用硬件(一般硬件)集群
- 延迟较高,不适合低延迟数据访问(想要低延迟用HBase)
- 高吞吐量、高容错、高可靠性、高扩展性
Hadoop架构
HDFS:Hadoop自带的分布式文件系统
YARN:Hadoop的集群资源管理系统
MapReduce:Hadoop用于数据处理的编程模型
Others:Hadoop利用YARN资源管理系统的便捷功能而存在的不同与MapReduce的其他数据处理方式
HDFS
DHFS即Hadoop Distributed File System,是Hadoop自带的分布式文件系统,其架构可以直观地由下图展示出来。
HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上,适合于一次写入、多次读取的访问模式。但HDFS是为高数据吞吐量应用优化的,因此会以提高延迟为代价。
下面是HDFS的一些相关概念:
- DataBlock
数据块,基本存储单位,一般大小默认为128MB。数据块这么大主要的好处有:1)减少检索定位时间,一般硬盘传输速率比寻道时间要快,大的块可以减少寻道时间;2)减少管理块的数据开销,每个块都需要在NameNode上有对应的记录;3)对数据块进行读写,减少建立网络的连接成本。
一个大文件会被拆分成一个个的块,然后存储于不同的机器。如果一个文件小于DataBlock大小,那么实际占用的空间为其文件的大小。
是基本的读写单位,类似于磁盘的页,每次都是读写一个块。每个块都会被复制到多台机器,默认复制3份。
DataBlock的抽象使得文件并不需要存储在同一个磁盘上,充分发挥“分布式”的优势;另外可以简化存储管理,简化了存储子系统的设计;不仅如此,DataBlock非常适用于数据备份,从而提供数据容错能力,提高可用性。
HDFS集群的两种节点模式为NameNode、DataNode:
- NameNode
管理着HDFS文件系统的命名空间。它以树的结构管理者整个文件系统的所有文件目录,具体的来说即所有文件的metadata。
HDFS运行时,NameNode将系统文件信息维护在内存当中,因此整个HDFS可存储的文件数量受限于NameNode的内存大小。
一个DataBlock在NameNode中对应一条记录,一般占用150B,因此如果HDFS存储着大量的小容量文件,那么产生的大量的DataBlock记录则会消耗了NameNode的大量内存。这是Hadoop建议存储大容量文件的原因之一。
。数据会定时保存到本地磁盘,但不保存block的位置信息,而是由DataNode注册时上报和运行时维护(NameNode中与DataNode相关的信息并不保存到NameNode的文件系统中,而是NameNode每次重启后,动态重建)。
NameNode失效将会导致HDFS上的文件全部丢失,因此保证NameNode的可用性是非常重要的。 - Secondary NameNode
采用类似于CheckPoint机制,定期与NameNode进行同步,合并文件系统镜像和编辑日志。但NameNode失效后仍然需要人工操作将Secondary NameNode设为NameNode - DataNode
是集群的工作节点。保存着具体的block数据,并且负责数据的读写操作和复制操作。
DataNode启动时会向NameNode报告当前存储的数据块信息,后续也会定时报告修改信息。
DataNode之间会进行通信,复制数据块,保证数据的冗余性
YARN
YARN是Hadoop2.0版本引入的资源调度框架。
由于1.0版本的Hadoop采取的是JobTracker+TaskTracker的架构。JobTracker负责资源管理,跟踪资源消耗和可用性,作业生命周期管理(调度作业任务,跟踪进度,为任务提供容错),而TaskTracker负责加载或关闭任务,定时报告状态。如下图所示:
可以看出JobTracker是MapReduce的集中处理点,r完成了太多的任务,造成了过多的资源消耗,当MapReduce job 非常多的时候,会造成很大的内存开销。这也是业界普遍总结出老Hadoop的MapReduce只能支持4000 节点主机的上限。
另外,在TaskTracker端,以map/reduce task的数目作为资源的表示过于简单,没有考虑到cpu/ 内存的占用情况,如果两个大内存消耗的task被调度到了一块,内存不足的情况;如果把资源强制划分为map task slot和reduce task slot, 如果当系统中只有map task或者只有reduce task的时候,会造成资源的浪费。
这就是1.0版本Hadoop存在的单点问题和集群资源利用率的问题。
针对这两个问题,2.0的版本引入了YARN架构:
YARN就是将JobTracker的职责进行拆分,将资源管理和任务调度监控拆分成独立的进程:一个全局的资源管理和一个每个作业的管理(ApplicationMaster)ResourceManager和NodeManager提供了计算资源的分配和管理,而ApplicationMaster则完成应用程序的运行
ResourceManager:全局资源管理和任务调度
NodeManager:单个节点的资源管理和监控
ApplicationMaster:单个作业的资源管理和任务监控
Container:资源申请的单位和任务运行的容器
将节点和作业的资源监控放到各个Slave Node上,Master Node只需要通过ResourceManager进行全局的资源管理和任务调度。这样,YARN架构下形成了一个通用的资源管理平台和一个通用的应用计算平台,避免了旧架构的单点问题和资源利用率问题。同时也让在其上运行的应用不再局限于MapReduce形式。
MapReduce
MapReduce是Hadoop进行数据处理的编程模式。具体地来说,即指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,通过Shuffle过程指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
推荐一个博主Lust-Ring写的《Hadoop MapReduce原理及实例》,里面详细地描述了MapReduce的过程、原理以及实例。
推荐一些阅读材料:
- pennywong的gitbooks:https://pennywong.gitbooks.io/hadoop-notebook/content/index.html
W3C上的Hadoop教程也是根据这个写的,简明扼要介绍了Hadoop的设计实现,并且提及了测试安装监控配置等内容。 - 《Hadoop权威指南.大数据的存储与分析.第4版.修订版&升级版》这个比较详细,想要熟练掌握Hadoop集群及其各个组件,建议细读。
- 博主Lust-Ring的《深入理解HDFS:Hadoop分布式文件系统》:https://blog.csdn.net/bingduanlbd/article/details/51914550#t26
他是总结了上面那本书,写得挺好。 - Hadoop关方文档:
https://hadoop.apache.org/docs/r1.0.4/cn/index.html