Hadoop

使用场景:
  • 适合大规模数据
  • 流式数据(写一次,读多次)
  • 商用硬件(一般硬件)

对于低延时的数据访问,大量的小文件,频繁修改的文件(基本就是写一次)的场景并不适用。

Hadoop1.x的架构
起源于Nutch(搜索引擎),有两个部分:存储大量的网页索引数据、高效的检索。
存储部分使用的是分布式文件存储系统(HDFS),计算部分使用的是MapReduce.

Hadoop架构


HDFS(Hadoop Distributed File System):分布式文件系统存储


HDFS是用来存储数据的,其使用的分布式开发中主从架构(master/slave),master节点只有一个,称之为nameNode;slave节点可以有多个,称之为DataNode。(节点并不一定是指一个单独的物理机器,更准确的说,节点指的是一个进程。如果你在一台机器上,启动了多个slave,我们也称之为多个slave节点

Block数据块:

可以理解为文件系统中的簇概念。最小的存储单位,如果一个文件占用空间小于簇的大小,那么其占用空间就是1个簇。如果文件过大,就会占用多个簇。合理的簇大小的设置,会提高磁盘的检索效率。很明显,在磁盘扫描的时候,如果一个文件存储在多个簇中,那么将会增加扫描的时间,如果分配在一个簇中,那么可能磁盘转动一次就扫描到了。有的读者可能会想,那么簇是不是设置的越大越好呢?答案是不行的,因为簇是最小的存储单位,假设你设置簇大小是10M,那么意味着即使一个1KB的文件,也需要占用10M的存储空间。总结下来就是,簇设置的过小,会增加文件检索的时间;簇设置的过大,会造成磁盘空间的浪费。
  • 基本存储单位,一般大小为64M。原因是:大块减少搜寻时间,一般硬盘的传输速率比寻道时间要快,大的块可以减少寻道时间;减少管理块的数据开销,每个块都需要在NameNode上有对应的记录;对数据块进行读写,减少建立网络的连接成本。
  • 一个大文件会被拆分一个个的块,然后存储于不同的机器。如果一个文件小于Block块的大小,那么实际占用的空间为其文件的大小。
  • 基本的读写单位,类似于磁盘的页,每次都是读写一个块。
  • 每个块都被复制到多台机器,默认复制3份。

NameNode:

负责接收用户的操作请求;维护文件系统目录结构;管理文件与block之间的关系,block与datanode之间的关系
  • 存储文件的metadata,运行时所有数据都保存到内存,整个HDFS可存储的文件数受限于NameNode的大小。
  • 一个Block在NameNode中对应一条记录(一般一个block占用150个字节),如果是大量的小文件,会消耗大量的内存,同时map task的数量是由splits来决定的,所以用MapReduce处理大量的小文件时,就会产生过多的map task,线程管理开销将会增加作业时间。处理大量小文件的速度远远小于处理同等大小的大文件的速度。因此Hadoop建议存储大文件。
  • 数据会定时保存到本地磁盘,但不保存block的位置信息,而是由DataNode注册时上报和运行时维护(NameNode中与DataNode相关的信息并不保存到NameNode的文件系统中,而是NameNode每次重启后,动态重建
  • NameNode失效则整个HDFS都失效了,所以要保证NameNode的可用性

Secondary NameNode:

  • 定时与NameNode进行同步(定期合并文件系统镜像和编辑日志,然后把合并后的传给NameNode,替换其镜像,并清空编辑日志,类似于CheckPoint机制),但NameNode失效后仍需要手工将其设置成主机

DataNode:

负责存储文件;文件被分成block存储到磁盘上;为保证数据安全,文件会有多个副本。
  • 保存具体的block数据
  • 负责数据的读写操作和复制操作
  • DataNode启动时会向NameNode报告当前存储的数据块信息,后续也会定时报告修改信息
  • DataNode之间会进行通信,复制数据块,保证数据的冗余性

YARN:分布式资源管理

MapReduce:分布式计算

用于分布式计算的框架,遵循主从架构,主节点:JobTracker(只有一个)  从节点:TaskTracker(可以有多个)
JobTracker负责接收用户提交的任务,分割之后交由TaskTracker处理。可能某个TaskTracker当前正在执行其他的运算任务,因此JobTracker需要负责将任务分配给相对空闲的TaskTracker,而不是随机分配。
此外,如果某个TaskTracker在运行任务的时候如果失败了(例如宕机),JobTracker还需要将分配给这个TaskTracker的任务重新分配给其他的TaskTracker。
JobTracker负责: 接收客户提交的计算任务;把计算任务分给TaskTrackers执行;监控TaskTracker的执行情况 
TaskTrackers负责:执行JobTracker分配的计算任务

Others:利用YARN的资源管理功能实现其他的数据处理方式

内部各个节点都采用Masher-Worker架构

Hadoop集群的物理分布

11.png

Switch是交换机(路由器)Rack代表机房里的一个机柜,每个机柜里都有很多台服务器,称之为节点。

单点物理结构

22.png
Hadoop中的主从节点的区别,是根据服务器上运行的程序来进行划分的。
  • 如果服务器上运行的NameNodeJobtracker,那么这个节点就是主节点。
  • 如果服务器上运行的是TaskTrackerdatanode,那么这个节点就是从节点。
NameNodeJobTracker,Secondary NameNode一般都是部署在不同的机器上。