共计 2732 个字符,预计需要花费 7 分钟才能阅读完成。
HDFS
HDFS 是一个具有高度容错性的分布式文件系统,适合部署在廉价的机器上,它具有以下几个特点:
1)适合存储非常大的文件
2)适合流式数据读取,即适合“只写一次,读多次”的数据处理模式
3)适合部署在廉价的机器上
但 HDFS 不适合以下场景(任何东西都要分两面看,只有适合自己业务的技术才是真正的好技术):
1)不适合存储大量的小文件,因为受 Namenode 内存大小限制
2)不适合实时数据读取,高吞吐量和实时性是相悖的,HDFS 选择前者
3)不适合需要经常修改数据的场景
HDFS 的架构如上图所示,总体上采用了 Master/Slave 的架构,主要有以下 4 个部分组成:
1、Client
2、NameNode
整个 HDFS 集群只有一个 NameNode,它存储整个集群文件分别的元数据信息。这些信息以 fsimage 和 editlog 两个文件存储在本地磁盘,Client 通过这些元数据信息可以找到相应的文件。此外,NameNode 还负责监控 DataNode 的健康情况,一旦发现 DataNode 异常,就将其踢出,并拷贝其上数据至其它 DataNode。
3、Secondary NameNode
Secondary NameNode 负责定期合并 NameNode 的 fsimage 和 editlog。这里特别注意,它不是 NameNode 的热备,所以 NameNode 依然是 Single Point of Failure。它存在的主要目的是为了分担一部分 NameNode 的工作(特别是消耗内存的工作,因为内存资源对 NameNode 来说非常珍贵)。
4、DataNode
DataNode 负责数据的实际存储。当一个文件上传至 HDFS 集群时,它以 Block 为基本单位分布在各个 DataNode 中,同时,为了保证数据的可靠性,每个 Block 会同时写入多个 DataNode 中(默认为 3)
MapReduce
和 HDFS 一样,MapReduce 也是采用 Master/Slave 的架构,其架构图如下:
它主要有以下 4 个部分组成:
1)Client
2)JobTracker
JobTracke 负责资源监控和作业调度。JobTracker 监控所有 TaskTracker 与 job 的健康状况,一旦发现失败,就将相应的任务转移到其他节点;同时,JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在 Hadoop 中,任务调度器是一个可插拔的模块,用户可以根据自己的需要设计相应的调度器。
3)TaskTracker
TaskTracker 会周期性地通过 Heartbeat 将本节点上资源的使用情况和任务的运行进度汇报给 JobTracker,同时接收 JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker 使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(CPU、内存等)。一个 Task 获取到一个 slot 后才有机会运行,而 Hadoop 调度器的作用就是将各个 TaskTracker 上的空闲 slot 分配给 Task 使用。slot 分为 Map slot 和 Reduce slot 两种,分别供 MapTask 和 Reduce Task 使用。TaskTracker 通过 slot 数目(可配置参数)限定 Task 的并发度。
4)Task
Task 分为 Map Task 和 Reduce Task 两种,均由 TaskTracker 启动。HDFS 以固定大小的 block 为基本单位存储数据,而对于 MapReduce 而言,其处理单位是 split。split 是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。但需要注意的是,split 的多少决定了 Map Task 的数目,因为每个 split 只会交给一个 Map Task 处理。Split 和 Block 的关系如下图所示:
Map Task 执行过程如下图 所示。由该图可知,Map Task 先将对应的 split 迭代解析成一个个 key/value 对,依次调用用户自定义的 map() 函数进行处理,最终将临时结果存放到本地磁盘上,其中临时数据被分成若干个 partition,每个 partition 将被一个 Reduce Task 处理。
Reduce Task 执行过程下图所示。该过程分为三个阶段:
①从远程节点上读取 MapTask 中间结果(称为“Shuffle 阶段”);
②按照 key 对 key/value 对进行排序(称为“Sort 阶段”);
③依次读取 <key, value list>,调用用户自定义的 reduce() 函数处理,并将最终结果存到 HDFS 上(称为“Reduce 阶段”)。
————————————– 分割线 ————————————–
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
Hadoop 中 HDFS 和 MapReduce 节点基本简介 http://www.linuxidc.com/Linux/2013-09/89653.htm
《Hadoop 实战》中文版 + 英文文字版 + 源码【PDF】http://www.linuxidc.com/Linux/2012-10/71901.htm
Hadoop: The Definitive Guide【PDF 版】http://www.linuxidc.com/Linux/2012-01/51182.htm
————————————– 分割线 ————————————–
更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13