1.数据库分块
思考:为什么块的大小不能设置太小,也不能设置太大? ( 1 ) HDFS 的块设置 太小 , 会增加寻址时间 ,程序一直在找块的开始位置; ( 2 )如果块设置的 太大 ,从 磁盘传输数据的时间 会明显 大于定位这个块开 始位置所需的时间 。导致程序在处理这块数据时,会非常慢。 总结: HDFS 块的大小设置主要取决于磁盘传输速率 2.HDFS的读写流程(切记不要和mapreduce流程搞混,hdfs是建立pipline进行进行上传,mapreduce是切片) (写流程)(1)客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件,NameNode 检
查目标文件是否已存在,父目录是否存在。 (2) NameNode 返回是否可以上传。 (3)客户端请求第一个 Block 上传到哪几个 DataNode 服务器上。 (4) NameNode 返回 3 个 DataNode 节点,分别为 dn1 、 dn2 、 dn3 。 (5)客户端通过 FSDataOutputStream 模块请求 dn1 上传数据, dn1 收到请求会继续调用 dn2 ,然后 dn2 调用 dn3 ,将这个通信管道建立完成。 (6) dn1 、 dn2 、 dn3 逐级应答客户端。 (7)客户端开始往 dn1 上传第一个 Block (先从磁盘读取数据放到一个本地内存缓存), 以 Packet 为单位, dn1 收到一个 Packet 就会传给 dn2 , dn2 传给 dn3 ; dn1 每传一个 packet 会放入一个应答队列等待应答 。 (8)当一个 Block 传输完成之后,客户端再次请求 NameNode 上传第二个 Block 的服务 器。(重复执行 3-7 步)。 3.网络拓扑-节点距离计算 在 HDFS 写数据的过程中, NameNode 会选择距离待上传数据最近距离的 DataNode 接 收数据。那么这个最近距离怎么计算呢?(看图方法,查询到达两节点的公共祖节点的次数和) 例如,假设有数据中心 d1 机架 r1 中的节点 n1 。该节点可以表示为 /d1/r1/n1 。利用这种 标记,这里给出四种距离描述。 4.副本节点的选择 5.HDFS的读流程 ( 1 )客户端通过 DistributedFileSystem 向 NameNode 请求下载文件, NameNode 通过查 询元数据,找到文件块所在的 DataNode 地址。 (2)挑选一台 DataNode (就近原则,然后随机)服务器,请求读取数据。 (3) DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位 来做校验)。 (4)客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。 6.NN和2NN工作机制 首先,我们做个假设,如果存储在 NameNode 节点的磁盘中,因为经常需要进行随机访 问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在 内存中,一旦断电,元数据丢失,整个集群就无法工作了。 因此产生在磁盘中备份元数据的 FsImage 。 这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新 FsImage ,就会导 致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数 据丢失。 因此,引入 Edits 文件(只进行追加操作,效率很高)。每当元数据有更新或者添 加元数据时,修改内存中的元数据并追加到 Edits 中。 这样,一旦 NameNode 节点断电,可 以通过 FsImage 和 Edits 的合并,合成元数据。 但是,如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦 断电,恢复元数据需要的时间过长。因此,需要定期进行 FsImage 和 Edits 的合并,如果这 个操作由 NameNode 节点完成,又会效率过低。 因此,引入一个新的节点 SecondaryNamenode , 专门用于 FsImage 和 Edits 的合并1)第一阶段:NameNode 启动
( 1 )第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启 动,直接加载编辑日志和镜像文件到内存。 (2)客户端对元数据进行增删改的请求。 (3) NameNode 记录操作日志,更新滚动日志。 (4) NameNode 在内存中对元数据进行增删改。 2 )第二阶段: Secondary NameNode 工作 ( 1 ) Secondary NameNode 询问 NameNode 是否需要 CheckPoint 。直接带回 NameNode 是否检查结果。 (2) Secondary NameNode 请求执行 CheckPoint 。 (3) NameNode 滚动正在写的 Edits 日志。 (4)将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode 。 (5) Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。 (6)生成新的镜像文件 fsimage.chkpoint 。 (7)拷贝 fsimage.chkpoint 到 NameNode 。 (8) NameNode 将 fsimage.chkpoint 重新命名成 fsimage 。 CheckPoint 时间设置 1 )通常情况下, SecondaryNameNode 每隔一小时执行一次。 [hdfs-default.xml]( 1 )一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据 本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。 (2) DataNode 启动后向 NameNode 注册,通过后,周期性(6 小时)的向 NameNode 上 报所有的块信息。 DN 向 NN 汇报当前解读信息的时间间隔,默认 6 小时;



