大数据复习笔记——hadoop

今天主要回顾一下hadoop学习时候的重要知识点,以及mr提交作业时候的流程、数据块副本放置策略等等

1、HDFS架构

设计目标
  1. 硬件错误
    a) 硬件错误是常态而不是异常。
    b) HDFS可能由成百上千的服务器所构成,单机故障概率的存在意味着总有一部分服务器不工作的。
    c) 错误检测和快速自动恢复是HDFS最核心架构目标。
  2. 流式数据访问
    a) 运行在HDFS上的应用需要流式访问它们的数据集。
    b) HDFS的设计重点是批处理,而不是交互处理。是高吞吐量而不是低延迟。
    c) 为了提高数据的吞吐量,在关键方面修改POSIX的语义。
  3. 大规模数据集
    a) HDFS上的一个典型文件大小一般都在G字节至T字节。
    b) HDFS支持大文件存储。
    c) 单一HDFS实例能支撑数以千万计的文件。
  4. 简单的一致性模型
    a) HDFS应用遵循“一次写入多次读取”的文件访问模型。
    b) 简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。
    c) Map/Reduce应用或者网络爬虫应用都非常适合这个模型。
  5. 移动计算比移动数据更划算
    a) 降低网络阻塞的影响,提高系统数据的吞吐量。
    b) 将计算程序发送到数据所在的主机,比GB级别TB级别的数据移动更便捷。
  6. 异构软硬件平台间的可移植性
    a) HDFS在设计的时候就考虑到平台的可移植性。
    b) 这种特性方便了HDFS作为大规模数据应用平台的推广。
    大数据复习笔记——hadoop_第1张图片
1、Namenode

NameNode管理文件系统的命名空间

  1. 以两种方式在NameNode本地进行持久化:
    命名空间镜像文件(fsimage)和编辑日志(edits log)
    fsimage很大,GB级别;edits log只追加的文件

  2. fsimage文件不记录每个block所在的DataNode信息,这些信息在每次系统启动的时候从DataNode重建。之后DataNode会周期性地通过心跳包向NameNode报告block信息。DataNode向NameNode注册的时候NameNode请求DataNode发送block列表信息。

存储结构
大数据复习笔记——hadoop_第2张图片
in_use.lock文件用于NameNode锁定存储目录。这样就防止其他同时运行的NameNode实例使用相同的存储目录。
edits表示edits log日志文件
fsimage表示文件系统元数据镜像文件
NameNode在checkpoint之前首先要切换新的edits log文件,在切换时更新seen_txid的值。

当文件系统客户端进行了写操作(例如创建或移动了文件),这个事务首先在edits log中记录下来。NameNode在内存中有文件系统的元数据,当edits log记录结束后,就更新内存中的元数据。内存中的元数据用于响应客户端的读请求。
用户的操作是一个事务,每个操作NN都要先将操作记录到edits log中,如果给NN指定了多个目录,则在多个目录中都存在edits log文件,用户的操作要在多个目录中都写完成,才让NN同步数据到内存中。当NN在内存中也同步了数据,就返回客户端success。

2、SecondaryNameNode

edits log会随着对文件系统的操作而无限制地增长,这对正在运行的NameNode而言没有任何影响,如果NameNode重启,则需要很长的时间执行edits log的记录以更新fsimage(元数据镜像文件)。在此期间,整个系统不可用。
在系统启动期间,NameNode合并fsimage+edits log

SecondaryNameNode就是为NameNode内存中的文件系统元数据生成检查点(checkpoint),定期合并fsimage和edits log。

工作流程如图所示
1、Secondarynamenode请求namenode生成新的edits log文件并向其中写日志。NameNode会在所有的存储目录中更新seen_txid文件
2、SecondaryNameNode通过HTTP GET的方式从NameNode下载fsimage和edits文件到本地。
3、SecondaryNameNode将fsimage加载到自己的内存,并根据edits log更新内存中的fsimage信息,然后将更新完毕之后的fsimage写到磁盘上。
4、SecondaryNameNode通过HTTP PUT将新的fsimage文件发送到NameNode,NameNode将该文件保存为.ckpt的临时文件备用。
5、NameNode重命名该临时文件并准备使用。此时NameNode拥有一个新的fsimage文件和一个新的很小的edits log文件(可能不是空的,因为在SecondaryNameNode合并期间可能对元数据进行了读写操作)。管理员也可以将NameNode置于safemode,通过hdfs dfsadmin -saveNamespace命令来进行edits log和fsimage的合并。

Secondarynamenode就是通过HTTP GET/PUT的方法,将namenode中的镜像文件和编辑日志更新到fsimage上,然后namenode再进行操作。

大数据复习笔记——hadoop_第3张图片

存储架构

大数据复习笔记——hadoop_第4张图片
1、SecondaryNameNode中checkpoint目录布局(dfs.namenode.checkpoint.dir)和NameNode中的一样。

2、如果NameNode完全坏掉(没有备用机,也没有NFS),可以快速地从SecondaryNameNode恢复。有可能丢数据

3、Datanode
存储结构

大数据复习笔记——hadoop_第5张图片
1、HDFS块数据存储于blk_前缀的文件中,包含了被存储文件原始字节数据的一部分。
2、每个block文件都有一个.meta后缀的元数据文件关联。该文件包含了一个版本和类型信息的头部,后接该block中每个部分的校验和。

存储模型

1、文件线性切割成块(Block)(按字节切割)
2、Block分散存储在集群节点中
3、单一文件Block大小一致,文件与文件可以不一致
4、Block可以设置副本数,副本分散在不同节点中
a) 副本数不要超过节点数量
b) 承担计算
c) 容错
5、文件上传可以设置Block大小和副本数
6、已上传的文件Block副本数可以调整,大小不变
7、只支持一次写入多次读取,同一时刻只有一个写入者
对同一个文件,一个时刻只有一个写入者
8、可以append追加数据

副本放置策略(重点)

第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
第三个副本:与第二个副本相同机架的节点。
大数据复习笔记——hadoop_第6张图片

2、HDFS的权限(了解)

1、每个文件和目录都和一个拥有者和组相关联。
2、文件或者目录对与拥有者、同组用户和其他用户拥有独立的权限。
3、对于一个文件,r表示读取的权限,w表示写或者追加的权限。对于目录而言,r表示列出目录内容的权限,w表示创建或者删除文件和目录的权限,x表示访问该目录子项目的权限。
4、默认情况下hadoop运行时安全措施处于停用模式。一个客户端可以在远程系统上通过创建和任意一个合法用户同名的账号来进行访问。 hadoop root
5、安全措施可以防止用户或自动工具及程序意外修改或删除文件系统的重要部分。(dfs.permissions.enabled属性)。防止好人做错事。
6、超级用户是namenode进程的标识。对于超级用户,系统不会执行任何权限检查。

3、Hadoop的安全模式(了解)

工作流程
  1. 启动NameNode,NameNode加载fsimage到内存,对内存数据执行edits log日志中的事务操作。
  2. 文件系统元数据内存镜像加载完毕,进行fsimage和edits log日志的合并,并创建新的fsimage文件和一个空的edits log日志文件。
  3. NameNode等待DataNode上传block列表信息,直到副本数满足最小副本条件。
  4. 当满足了最小副本条件,再过30秒,NameNode就会退出安全模式。最小副本条件指整个文件系统中有99.9%的block达到了最小副本数(默认值是1,可设置)

在NameNode安全模式(safemode)

  1. 对文件系统元数据进行只读操作
  2. 当文件的所有block信息具备的情况下,对文件进行只读操作
  3. 不允许进行文件修改(写,删除或重命名文件)

通过命令查看namenode是否处于安全模式:
$ hdfs dfsadmin -safemode get
Safe mode is ON

4、HDFS搭建方式

*此处搭建方式不会再一一举例,仅陈述下所搭建方式的作用区别。

a)伪分布式搭建

再节点上安装运行 Hadoop
单台服务器放不下,切块,将块打散放在各个datanode中

b)完全分布式搭建

hadoop官网地址:http://hadoop.apache.org
中文文档:http://hadoop.apache.org/docs/r1.0.4/cn

node01 node02 node03 node04
Namenode SecondaryNameNode
- DataNode-1 DataNode-2 DataNode-3

需要四台服务器来搭建

c)HA

解决HDFS 1.0中单点故障和内存受限问题,HDFS2.x中Federation和HA分离,HA只能有两个NameNode
手动HA
大数据复习笔记——hadoop_第7张图片
自动HA
大数据复习笔记——hadoop_第8张图片
基于zookeeper实现

d)联邦(Federatioin)

解决内存受限问题
HDFS Federation(联邦);水平扩展,支持多个NameNode;
(1)所有NameNode共享所有DataNode存储资源
(2)每个NameNode分管一部分目录;

5、HDFS操作

a )写文件

大数据复习笔记——hadoop_第9张图片

  1. 调用客户端的对象DistributedFileSystem的create方法;
  2. DistributedFileSystem会发起对namenode的一个RPC连接,请求创建一个文件,不包含关于block块的请求。namenode会执行各种各样的检查,确保要创建的文件不存在,并且客户端有创建文件的权限。如果检查通过,namenode会创建一个文件(在edits中,同时更新内存状态),否则创建失败,客户端抛异常IOException。
  3. DistributedFileSystem返回一个FSDataOutputStream对象给客户端用于写数据。FSDataOutputStream封装了一个DFSOutputStream对象负责客户端跟datanode以及namenode的通信。
  4. FSDataOutputStream对象将数据切分为小的数据包(64kb,core-default.xml:file.client-write-packet-size默认值65536),并写入到一个内部队列(“数据队列”)。DataStreamer会读取其中内容,并请求namenode返回一个datanode列表来存储当前block副本。列表中的datanode会形成管线,DataStreamer将数据包发送给管线中的第一个datanode,第一个datanode将接收到的数据发送给第二个datanode,第二个发送给第三个。。。
  5. DFSOoutputStream维护着一个数据包的队列,这的数据包是需要写入到datanode中的,该队列称为确认队列。当一个数据包在管线中所有datanode中写入完成,就从ack队列中移除该数据包。如果在数据写入期间datanode发生故障,则执行以下操作
    a) 关闭管线,把确认队列中的所有包都添加回数据队列的最前端,以保证故障节点下游的datanode不会漏掉任何一个数据包。
    b) 为存储在另一正常datanode的当前数据块指定一个新的标志,并将该标志传送给namenode,以便故障datanode在恢复后可以删除存储的部分数据块。
    c) 从管线中删除故障数据节点并且把余下的数据块写入管线中另外两个正常的datanode。namenode在检测到副本数量不足时,会在另一个节点上创建新的副本。
    d) 后续的数据块继续正常接受处理。
    e) 在一个块被写入期间可能会有多个datanode同时发生故障,但非常少见。只要设置了dfs.replication.min的副本数(默认为1),写操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标副本数(dfs.replication默认值为3)。
  6. 如果有多个block,则会反复从步骤4开始执行。
  7. 当客户端完成了数据的传输,调用数据流的close方法。该方法将数据队列中的剩余数据包写到datanode的管线并等待管线的确认
  8. 客户端收到管线中所有正常datanode的确认消息后,通知namenode文件写完了。
  9. namenode已经知道文件由哪些块组成,所以它在返回成功前只需要等待数据块进行最小量的复制。

个人总结:hdfs客户端创建请求给FileSystem,FileSystem发起对namenode的一个RFC连接,请求创建文件;检查通过之后返回给FSDataOutputStream来进行封装并且给datanode来写数据,封装好的对象发送给第一个datanode,第一个datanode将接收到的数据发送给第二个datanode,第二个发送给第三个…;当客户端传输完数据后,调用close方法,该方法将数据队列中的剩余数据包写到datanode的管线并等待管线的确认;8. 客户端收到管线中所有正常datanode的确认消息后,通知namenode文件写完了。

b)读文件

大数据复习笔记——hadoop_第10张图片

  1. 客户端通过FileSystem对象的open方法打开希望读取的文件,DistributedFileSystem对象通过RPC调用namenode,以确保文件起始位置。对于每个block,namenode返回存有该副本的datanode地址。这些datanode根据它们与客户端的距离来排序。如果客户端本身就是一个datanode,并保存有相应block一个副本,会从本地读取这个block数据。
  2. DistributedFileSystem返回一个FSDataInputStream对象给客户端读取数据。该类封装了DFSInputStream对象,该对象管理着datanode和namenode的I/O,用于给客户端使用。客户端对这个输入调用read方法,存储着文件起始几个block的datanode地址的DFSInputStream连接距离最近的datanode。通过对数据流反复调用read方法,可以将数据从datnaode传输到客户端。到达block的末端时,DFSInputSream关闭与该datanode的连接,然后寻找下一个block的最佳datanode。客户端只需要读取连续的流,并且对于客户端都是透明的。
  3. 客户端从流中读取数据时,block是按照打开DFSInputStream与datanode新建连接的顺序读取的。它也会根据需要询问namenode来检索下一批数据块的datanode的位置。一旦客户端完成读取,就close掉FSDataInputStream的输入流。
  4. 在读取数据的时候如果DFSInputStream在与datanode通信时遇到错误,会尝试从这个块的一个最近邻datanode读取数据。它也记住那个故障datanode,保证以后不会反复读取该节点上后续的block。DFSInputStream也会通过校验和确认从datanode发来的数据是否完整。如果发现有损坏的块,就在DFSInputStream试图从其他datanode读取其副本之前通知namenode。

个人总结:客户端通过open方法打开希望读取的文件,DistributedFileSystem通过RFC调用namenode,来确定block的地址;FSDataInputStream调用read方法,连接距离最近的datanode,通过反复调用read方法,将数据传输到客户端,到达block的末端时,关闭该datanode,寻找下个新的block;一旦客户端完成读取,调用close方法。

6、mapreduce

相同”key的键值对为一组调用一次reduce方法,方法内迭代这一组数据进行计算分组比较器

工作流程
大数据复习笔记——hadoop_第11张图片
Map:

1、根据业务需求处理数据并映射为KV模型
2、并行分布式
3、计算向数据移动

Reduce:

1、数据全量/分量加工
2、Reducer中可以包含不同的key 分区的范围大于分组
3、相同分区的Key汇聚到一个Reducer中
4、“相同”的Key调用一次reduce方法
5、排序和比较实现key的汇聚

你可能感兴趣的:(大数据复习笔记——hadoop)