HDFS(一)

  HDFS的概念
  HDFS首先是文件系统(FileSystem,FS),尽管这个FS是基于OS原生的文件系统之上;而且这个文件系统是一个抽象概念,HDFS作为一个整体出现,对外(client)隐藏了其内部分分布式文件存储的细节。
  HDFS的核心概念有三个,完美实现了对于内部复杂性的封装:
  首先是数据块;原生的文件系统有数据块的概念,不同的操作系统不一样,大概几千K;硬件上面数据存储也是有数据块,512K。HDFS的数据块则是64M到128M。HDFS之所以这么就是为了减少选址时间(文件小,索引多,导致查询慢);但是文件块也不能太大,否则影响并发(文件大,分布少,导致并发小)。
  数据块定义了这个概念目的是为了操作都是围绕数据块来的:
  1)索引都是以块为单位进行记录;
  2)容错也是以块为单位(副本拷贝,覆盖);
  3)文件不再一个整体,而是文件块集合,这样模型变得简单(二级关系变成了一级关系);
  4)刷缓冲区的文件到Disk也是以块为单位,即FSDataOutputStream.flush;想要立即刷回硬盘需要调用hsync()函数;
  第二个概念是NameNode,NameNode的职责就是负责元数据管理,NameNode里面包含了文件块的位置;如果没有NameNode就无法组装起完整的文件。所以NameNode节点数据需要主备模式,即NameNode和Secondary NameNode两个;为了数据同步同时又不影响NameNode工作,HDFS设计了checkpoint机制。
  VERSION文件里面定义了这个集群相关的一些信息
  1)clusterId字段代表了集群ID;
  2)namesparcId则代表HDFS文件系统ID,在NameNode创建之初的时候产生;
  3)storageType代表node类型,namenode or datanode;
  4)cTime代表文件操作系统创建的时间;新格式化的时候这个值总是0;但是当文件操作系统被更新的时候将会改写为更新的时间点(时间戳)。

  checkpoint机制是一个时间点;到了时间点之后:

  1)Secondary NameNode(SNN)将会向NameNode(NN)请求数据;NameNode会把当前操作日志(edits文件)进行roll,然后向一个新的操作日志文件中写;然后secondary获取到edits以及fsimage两个文件,注意此时faimage文件还是旧的,未同步;NameNode不会随时更新此文件,只有checkpoint的时候有secondary nameNode做同步。
  2)SNN将会根据edits的日志操作合并到fsimage里面;
  3)然后再把faimage文件同步到NameNode节点中去。
  这样就实现了NameNode备份,可能会因为checkpoint不及时,导致数据丢失。
  看过了checkpoint,其实你会发现在checkpoint之前,所有的改动其实并没有被持久化,只是被保存到内存中的数据库;任何的修改都是先该edits文件,然后再更新到内存数据;这种情况导致的就是当NameNode重启的时候,他是会将edits文件和fsimage文件进行合并,操作和SNN是类似的。

  第三个概念是DataNode,DataNode的角色是用于存储和查询数据文件;数据存入DataNode的过程是:Client向NameNode请求文件路径,有则返回既存DataNode(包括两个副本DataNode),如果没有则根据DataNode的分布返回一个Pipeline,首先是map运行机器(第一个副本),另外两个尽量选择是一个机架上面的其他两个DataNode;如果没有则选择另外一个机架上面。

  在整个操作过程中,有两条线,第一条线是访问NameNode获取Pipeline;第二条线是想dataNode中写入数据;其中client端在写入数据的时候其实会维护一个FileBlockQueue,只有写入成功的才会删除;用于当写入发生异常,比如4.1挂了,将会把所有的写入4.1失败的数据以及未来数据统统发给后续的副本DataNode机器,同时通知NameNode;另外为了数据一致性,将会在最后个DataNode写入的时候做校验和。但是为什么要在最后一个点做呢?这样做是为了避免在复制副本过程中发生了对包,所以check是放在最后一个节点做得,这样check只需要做一次。
  其实NameNode和DataNode所管理的对象都是数据块;NameNode是记录数据块存储的位置,同时通过NN和SNN实现了高可用;

  在Hadoop 2.x推出了NameNode的HA之后,其实Standby Namenode就会同时扮演Secondary NameNode的功能(当前活跃的NameNode称之为Active NameNode),Secondary NameNode和Standby NameNode最大的却别在于前者并不对外提供服务,只是对NameNode提供服务;后者则是提供对外服务(用于做为Active NameNode的backup)。所以二者不需要并存(即使并存也会报错)。NameNode的SecondaryNameNode是为了帮助NameNode做日志集成,用于挂掉后,可以通过集成的日志进行数据恢复;NameNode的HA则是扮演持续服务的角色,客户端将会同时配置两个NameNode;不过做standby node所在的节点同时会扮演secondary nameNode的角色;

  standby namenode切换为active namenode之后,数据是如何做到同步的呢?通过共享存储实现的,这里使用到的是cloudera的QJM(Quorum Journal Manager) 方案,active namenode的每次写入edits之后,数据将会写入到JournalNode中(只要保证超过半数的JournalNode数据写入成功即可);standby namenode将会定时的从journalNode中同步数据;通过这种方式实现了该节点可以同步active nodename的数据。

  HDFS还有两个很重要的工具:
  distcp,用于在两个集群间拷贝数据;
  1)distcp实现是基于mapreduce,但是只有map节点;
  2)distcp有一个“-m”参数,该参数指定了几个map来跑程序;map将会被均匀的分布到各个DataNode上面;这个数字不能太小,否则将会导致数据倾斜因为map会选定执行的设备为数据保存的第一个副本;极端讲,如果只有一个map那么将会导致所有的文件都拷贝到了同一个节点上面。
  har,hadoop自己的tar工具,可以对文件,尤其是小文件进行打包;好处就是hadoop原生支持,而且可以当成普通目录进行读取。

参考

《hadoop 权威指南(第四版)》

原文地址:https://www.cnblogs.com/xiashiwendao/p/8688695.html