hadoop学习分享

hadoop作为大数据的底层存储解决方案,是目前的首选。

hadoop主要由hdfs和mapReduce两大组件组成,一个是分布式文件系统,一个是分布式并行计算框架。可以说这两个组件解决了大数据最基本的数据存储和离线大数据处理的问题,当然这里说是离线数据处理,因为实时处理有别的组件支持。而hdfs,我更认同分布式块文件系统的叫法。

hadoop2.x之后,由hdfs,MapReduce和Yarn三大组件构成


hdfs,分布式块文件系统

这里先简单说一下自己对hdfs的整体理解,首先hdfs是个文件系统,然后他是分布式的,我们只需要把他理解为linux的文件系统就行了,因为真的很像,命令行操作文件等都很像。

hdfs特点

hdfs运行在廉价机器,容错率高等特点就不多了,这里需要说一下的是hdfs如何保持文件一致性,对已经写入磁盘的文件,只支持追加操作,不支持修改操作!这是hdfs比较重要的特点。

hdfs基本概念

  • 块(Block)
  • 元数据
  • NameNode
  • DataNode

块简单理解就是一个固定大小的连续存储空间,大小可由配置文件更改,每个块都有个全局的ID号唯一标识。(个人认为这两个是最重要的特点)

元数据

hdfs的元数据,由三部分组成,文件本身信息(目录、权限等),文件和块的对应关系,块的存放位置。

元数据是存放在NameNode里的,实际数据都是存放在DataNode中。

NameNode

NameNode提供命名空间服务,元数据都保存在NameNode内存中,以便快速查找。NameNode服务进程通过心跳包和DataNode进程通讯。

DataNode

实际的数据存放点,hdfs的数据通常保存多份(防丢失);另外一个很重要的特点是,客户端读写数据直接于DataNode通信,不需要NameNode。

hdfs核心原理

NameNode作用

管理整个文件系统的命名空间,控制客户端对文件的访问,管理文件的存放读取等,管理所以数据块,所有涉及要访问操作文件的,都有NameNode来下命令,因为他有元信息,他才知道客户端要到哪台DataNode,拿哪个ID的块。

周期性从每个DataNode接收心跳信息和块状态报告(包含块位置信息)。

DataNode作用

周期上报所有块信息,定时发送心跳包。

元数据持久化

一般NameNode会把元数据加载到内存,并执行edits日志文件在内存中生成最新的元数据,加快查询速度,在开机以后的所有操作,只要是成功的,都会写进新的edits日志记录文件;而Secondary NameNode进程,提供的服务就是定期合并日志文件至fsimage(文件系统镜像),以保证元数据是最新的。

Secondary NameNode

上面提到了,它主要任务是定期合并日志至镜像,保持NameNode的元数据最新。需要注意的一点是Secondary NameNode不是备份节点!

总结:启动了相应的进程有相应的服务。

mapReduce分布式并行框架

简单来说,mapReduce程序其实就是运行在不同主机上的一个个进程,通过进程间通信协同完成功能罢了。

重要是hadoop2.x引入的Yarn资源管理框架的理解。

mapReduce认识

这是MapReduce程序处理数据的过程,其实就分治的思想,把大的数据切片分给几个进程去处理,然后再把各自结果再统一。


MR1和MR2区别

总的来说,MR1和MR2都是实现并行计算,最终结果是一样的,只是MR2在计算的过程中,进一步优化了,使得MR框架分工更加明确,管理更方便了。我们可以简单地把功能归结给Yarn资源调度管理器。而Yarn,只需理解为是一个操作系统,只不过是适用于管理多台电脑的操作系统

MR1,简单来说,其计算过程就是任务切分,委派给下面的进程处理,最大的特点就是他是taskTracker向jobTracker主动拉取任务的。通过下图简单看一下即可,已经被MR2替代。

MR2呢,主要是看Yarn资源调度管理器,引进Yarn,增加了ResourceManager(RM)和NodeManager

  • RM包括ApplicationManager和ResourceScheduler,负责应用管理和资源调度。(这不就是操作系统做的事吗)
  • NodeManager负责节点的运行,主要是启动Container来完成map或reduce任务。

MR2的执行过程

1 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
2 ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
3 ApplicationMaster首先向ResourceManager注册,这样,用户可以直接通过ResourceManager查看应用程序的运行状态,然后,它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
4 ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
5 一旦ApplicationMaster申请到资源后,则与对应的NodeManager通信,要求其启动任务。
6 NodeManager为任务设置好运行环境(包括环境变量、jar包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
7 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。
8 应用程序运行完成后,ApplicationMaster向ResourceManager注销,并关闭自己

Yarn

正如上面所说,Yarn其实就可以理解为操作系统。我们只需要明确它的几个管理器提供的服务是什么即可。

ResourceManager

  • 处理客户端请求
  • 启动/监控ApplicationMaster
  • 监控NodeManager
  • 资源分配与调度

NodeManager

  • 单个节点上的资源管理
  • 处理来自ResourceManager的命令
  • 处理来自ApplicationMaster的命令

ApplicationMaster

  • 数据切分
  • 为应用程序申请资源,并分配给内部任务
  • 任务监控与容错

跟操作系统不同:

它是双层调度框架,RM将资源分配给AM,AM将资源进一步分配给各个Task。而操作系统直接管理各个进程,不需要衍生出子管理器(AM)来,当然,这样就可以很明确各个主机的职责了。