简述hadoop相关知识点

    写在前面:最近花了点时间了解了hadoop的运行机制,于是在此做个笔记,由于水平有限,有错请指出,谢谢!


1. 安装hadoop

    对于工程类的东西,本人小白一个,从安装虚拟机到配置jdk、安装hadoop前后花了三四天的时间,在踩过无数坑之后,终于把wordcount 小例子正确执行,这里对于第一次搭建hadoop环境的同学,给一些我的建议。

(1)参考网上的安装教程时,一定要注意操作系统的版本、hadoop版本是否一致,不同版本可能情况不太一样;

(2)遇到问题不要烦躁,一个个解决。

(3)不错的参考教程:hadoop2.6.5集群安装及mapreduce测试运行 、Hadoop安装教程_单机/伪分布式配置_CentOS6.4/Hadoop2.6.0

(4)踩过的一些坑:修改Hadoop的默认日志级别 、hadoop提交jar包卡住不会往下执行的解决方案 


2. HDFS

    HDFS作为hadoop的基石,是一种分布式文件系统。下面从HDFS的设计理念、架构、容错等简要说明。

2.1 设计理念

(1)适合存储超大文件;

(2)运行于廉价硬件之上;

(3)流式数据访问。


2.2 架构

    一个典型的HDFS集群中,有一个NameNode,一个SecondaryNode和至少一个DataNode,HDFS客户端数量没有限制,所有数据均存放在运行DataNode进程的节点的块里。

块(block):HDFS存储处理的最小单元,默认为64MB。

NameNode:HDFS的主从架构的主角色的扮演者,是HDFS的大脑,它维护着整个文件系统的目录树,以及目录树里所有的文件和目录,这些信息以两种形式存放在本地文件中,一种是命名空间镜像,也叫HDFS元数据的完整快照(每次NameNode启动时,加载最新的);另一种是命名空间镜像的编辑日志。

SecondaryNode:用于定期合并命名空间镜像和命名空间镜像的编辑日志的辅助守护进程。

DataNode:数据节点,是HDFS的主从架构的从角色的扮演者,它在NameNode的指导下完成I/O任务。DataNode会不断地向NameNode报告:初始化时,每个DataNode将当前存储的块告知NameNode,在集群正常工作时,DataNode仍然会不断地更新NameNode,为之提供本地修改的相关信息,同时接受来自NameNode的指令,创建、移动或删除本地磁盘上的数据块。

HDFS客户端:HDFS客户端是指用户和HDFS交互的手段,HDFS提供了非常多的客户端,包括命令行接口、Java API、thrift接口、C语言库、用户空间文件系统等。


2.3 容错

(1)心跳机制

(2)检测文件块的完整性(利用校验和)

(3)集群负载均衡

(4)NameNode上的FSImage和编辑日志文件

(5)文件的删除(超过设置的时间才会真正被删除)


3. YARN

3.1 YARN的架构

    YARN的架构还是传统的主从架构,YARN服务由ResourceManager和NodeManager两类进程组成,Container是YARN的资源表示模型,任何类型的计算类型的作业都可以运行在Container中,ApplicationMaster就是YARN的二级调度器,它也运行在Container中。

ResourceManager:负责集群中所有资源管理和调度,在双层调度器范例中,属于中央调度器。它定期会接收各个NodeManager的资源汇报信息,并进行汇总,并根据资源使用情况,将资源分配给各个应用的二级调度器。

NodeManager:是YARN集群中单个节点的代理,它管理YARN集群中的单个计算节点,它负责保持与ResourceManager的同步,跟踪节点的健康情况,管理各个Container的生命周期,监控每个Container的资源使用情况,管理分布式缓存,管理各个Container生成的日志,提供不同YARN应用可能需要的辅助服务。

ApplicationMaster:是协调集群中应用程序的进程,每个应用程序都有自己专属的ApplicationMaster,不同的计算框架的ApplicationMaster的实现也是不同的,它负责向ResourceManager申请资源,在对应的NodeManager上启动Container来执行任务,并在应用中不断监控这些Container的状态。属于二级调度器。

Container:YARN的资源表示模型,由于YARN的Container中完全没有计算框架的逻辑,所以对不同的计算框架是无差别对待的。


3.2 YARN的工作流程

(1)客户端向ResourceManager提交自己的应用;

(2)ResourceManager向NodeManager发出指令,为该应用启动第一个Container,并在其中启动ApplicationMaster;

(3)ApplicationMaster向ResourceManager注册;

(4)ApplicationMaster采用轮询的方式向ResourceManager的YARN Scheduler申请资源;

(5)当ApplicationMaster申请到资源后(获得了空闲的节点信息),便会与对应的NodeManager通信,请求启动计算任务;

(6)NodeManager根据资源大小、所需运行环境,在Container中执行任务;

(7)各个任务向ApplicationMaster汇报自己的状态和进度,以便ApplicationMaster掌握各个任务的执行状况;

(8)应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。


4. MapReduce

4.1 MapReduce的编程思想

    Map(映射)与Reduce(化简)来源于LISP和其他函数式编程语言中的古老的映射和化简操作,MapReduce操作数据的最小单位是一个键值对。用户在使用MapReduce编程模型的时候,第一步就需要将数据抽象为键值对的形式,接着map函数会以键值对作为输入,经过map函数处理后,产生一系列新的键值对作为中间结果输出到本地。MapReduce计算框架会自动将这些中间结果数据按照键值做聚合处理,并将键相同的数据分发给reduce函数处理。reduce函数以键和对应的值的集合作为输入,经过reduce函数的 处理后,产生了另外一系列键值对作为最终输出。用表达式表示如下:

{ Key1,Value1 } ——>{ Key2, List<Value2> } ——>{ Key3, Value3 }.


4.2 MapReduce的过程

    一个MapReduce作业包括input、map、combine、reduce和output五个阶段,其中combine阶段并不一定发生,map输出的中间结果被分发到reducer的过程称为shuffle(数据混洗)。

input: 如果使用HDFS上的文件作为MapReduce的输入,MapReduce计算框架首先会用FileInputFormat类将作为输入的HDFS上的文件切分形成输入分片(InputSplit),每个InputSplit将作为一个Map任务的输入,再将InputSplit解析为键值对。

map: InputSplit将解析好的键值对交给用户编写的map函数处理,处理后的中间结果会写入本地磁盘上,在刷写磁盘的过程中,还做了partition(分区)和sort(排序)操作。

shuffle:代表map函数产生输出到reduce的消化输入的整个过程。

reduce:对shuffle处理后的文件调用reduce函数进行处理。由于经过了shuffle的处理,文件都是按键分区且有序,因此对相同分区的文件只需调用一次reduce函数处理。

output: reduce的输出一般为HDFS。

    总的来说,MapReduce包含Map和Reduce两个阶段。Map任务执行过程:首先通过用户指定的InputFormat类中的getSplits方法和next方法将输入文件切片并解析成键值对作为map函数的输入,然后map函数经过处理后输出并将中间结果交给指定的Partition处理,确保中间结果分发到指定的Reduce任务处理,如果用户指定了Combiner,还会执行combine操作。Reduce任务的执行过程:首先需要将已经完成的Map任务的中间结果复制到Reduce任务所在的节点,待数据复制完成后,再以键进行排序,通过排序,将所有键相同的数据交给reduce函数处理,处理完成后,结果直接输出到HDFS上。



猜你喜欢

转载自blog.csdn.net/jingyi130705008/article/details/80449417
今日推荐