凡科网电脑版怎么做网站,微博广告,衡阳建设学校网站,提供网站建设优势3.5 HDFS存储原理 3.5.1 冗余数据保存
作为一个分布式文件系统#xff0c;为了保证系统的容错性和可用性#xff0c;HDFS采用了多副本方式对数据进行冗余存储#xff0c;通常一个数据块的多个副本会被分布到不同的数据节点上。 如图所示#xff0c;数据块1被分别存放到…3.5 HDFS存储原理 3.5.1 冗余数据保存
作为一个分布式文件系统为了保证系统的容错性和可用性HDFS采用了多副本方式对数据进行冗余存储通常一个数据块的多个副本会被分布到不同的数据节点上。 如图所示数据块1被分别存放到数据节点A和C上数据块2被存放在数据节点A和B上。 这种多副本方式具有以下几个优点
1加快数据传输速度
2容易检查数据错误
3保证数据可靠性 3.5.2 数据存取策略 1.数据存放
Ø第一个副本放置在上传文件的数据节点如果是集群外提交则随机挑选一台磁盘不太满、CPU不太忙的节点
Ø第二个副本放置在与第一个副本不同的机架的节点上
Ø第三个副本与第一个副本相同机架的其他节点上
Ø更多副本随机节点
2. 数据读取 ØHDFS提供了一个API可以确定一个数据节点所属的机架ID客户端也可以调用API获取自己所属的机架ID Ø当客户端读取数据时从名称节点获得数据块不同副本的存放位置列表列表中包含了副本所在的数据节点可以调用API来确定客户端和这些数据节点所属的机架ID当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时就优先选择该副本读取数据如果没有发现就随机选择一个副本读取数据 3. 数据复制采用流水线策略 当客户端需要向HDFS中写入一个文件时文件首先被写入本地计算机。 1按照HDFS的设置被切分成一定大小的块具体大小由HDFS设置。 2每个块都会向HDFS的NameNode节点发起写请求。 3NameNode节点会根据系统中各个DataNode节点的使用情况选择一个合适的DataNode节点列表返回给客户端。 4客户端随后会将数据首先写入列表中的第一个DataNode节点同时将列表传给该节点。 3 数据复制采用流水线策略 5第一个DataNode节点在接收到一定数量的数据后会向列表中的第二个DataNode节点发起连接请求并把自己已经接收到的数据和列表传给第二个节点。 6第二个节点在接收到数据后也会向列表中的第三个节点发起连接请求。依此类推。这样列表中的多个DataNode节点形成了一条数据复制的流水线。 3.5.3 数据错误与恢复 HDFS具有较高的容错性可以兼容廉价的硬件它把硬件出错看作一种常态而不是异常并设计了相应的机制检测数据错误和进行自动恢复主要包括以下几种情形 Ø 名称节点出错 Ø 数据节点出错 Ø 数据出错。 1. 名称节点出错 名称节点保存了所有的元数据信息其中最核心的两大数据结构是FsImage和Editlog如果这两个文件发生损坏那么整个HDFS实例将失效。解决方案 1 把名称节点上的元数据信息同步存储到其他文件系统如 NFS 2 运行一个第二名称节点当名称节点死机后可以把运行第二名称节点作为一种弥补但这种做法有问题问题在哪 最优做法 NFS 和第二名称节点结合用 2. 数据节点出错 Ø 每个数据节点会定期向名称节点发送“心跳”信息向名称节点报告自己的状态。 Ø 当数据节点发生故障或者网络发生断网时名称节点就无法收到来自一些数据节点的心跳信息这时这些数据节点就会被标记为“宕机”节点上面的所有数据都会被标记为“不可读”名称节点不会再给它们发送任何 I/O 请求。 Ø 这时有可能出现一种情形即由于一些数据节点的不可用会导致一些数据块的副本数量小于冗余因子。 Ø 名称节点会定期检查这种情况一旦发现某个数据块的副本数量小于冗余因子就会启动数据冗余复制为它生成新的副本。 Ø HDFS 和其它分布式文件系统的最大区别就是可以调整冗余数据的位置。 3. 数据出错 Ø 网络传输和磁盘错误等因素都会造成数据错误 Ø 客户端在读取到数据后会采用 md5 和 sha1 对数据块进行校验以确定读取到正确的数据 Ø 在文件被创建时客户端就会对每一个文件块进行信息摘录并把这些信息写入到同一个路径的隐藏文件里面 Ø 当客户端读取文件的时候会先读取该信息文件然后利用该信息文件对每个读取的数据块进行校验如果校验出错客户端就会请求到另外一个数据节点读取该文件块并且向名称节点报告这个文件块有错误名称节点会定期检查并且重新复制这个块。 3.6 HDFS数据读写过程 Ø FileSystem 是一个通用文件系统的抽象基类可以被分布式文件系统继承所有可能使用 Hadoop 文件系统的代码都要使用这个类 Ø Hadoop 为 FileSystem 这个抽象类提供了多种具体实现 Ø DistributedFileSystem 就是 FileSystem 在 HDFS 文件系统中的具体实现 Ø FileSystem 的 open() 方法返回的是一个输入流 FSDataInputStream 对象在 HDFS 文件系统中具体的输入流就是 DFSInputStream Ø FileSystem 中的 create() 方法返回的是一个输出流 FSDataOutputStream 对象在 HDFS 文件系统中具体的输出流就是 DFSOutputStream 。