一、HDFS概述1、定义HDFS 是一个分布式文件系统用于存储文件通过目录树来定位文件由很多服务器联合起来实现其功能集群中的服务器有各自的角色2、使用场景需要存储和处理海量数据如日志分析、数据仓库一次写入、多次读取的场景如数据分析和机器学习对延迟要求不高但需要高吞吐量的应用3、优缺点优点高容错性和可靠性 数据自动保存多个副本(默认3个)确保数据在硬件故障时仍可用即使某一节点失效其他副本仍可提供数据访问某一副本丢失可自动恢复支持大规模数据存储 能够处理GB,TB,PB级别规模的数据能够处理百万以上级别的文件数量廉价硬件的高效利用 可以运行在普通廉价硬件上通过分布式架构实现高性能存储和访问缺点不适合低延时数据访问 不能实现毫秒级的数据存储无法高效的对大量小文件进行存储 大量小文件会占用 NameNode 大量内存和块信息小文件存储的寻址时间会超过读取时间违反了hdfs的设计目标不支持并发写入和文件随机修改 一个文件只能有一个写不支持多线程写文件仅支持追加不支持随机修改4、组成架构NameNode DataNode Secondary NameNode ClientNameNode 是管理者管理hdfs的名称空间配置副本策略管理数据块映射信息处理客户端读写请求DataNode 是执行者存储实际的数据块执行数据块的读写操作Secondary NameNode 并非 NameNode 的热备当 NameNode 实际挂掉的时候并不能马上替换 NameNode 并提供服务辅助NameNode 分担其工作量比如定期合并 Fsimage 和Edits 并推送给 NameNode 在紧急情况下可辅助恢复 NameNodeClient 客户端。文件切分, 文件上传 HDFS 的时候, Client 将文件分成一个一个的块, 然后进行上传; 与 NameNode 交互, 获取文件的位置信息; 与 DataNode 交互, 读取或写入数据; 提供一些命令来管理、访问 HDFS ,比如 NameNode 格式化、增删改查操作5、文件块BlockHDFS中的文件在物理上是分块存储Block块的大小可以通过配置参数(dfs.blocksize来规定文件块默认128M - 磁盘传输速率普遍每秒传输100M左右文件设置太小 - 文件块太多; 增加寻址时间设置太大 - 文件传输时间增加;远远大于寻址时间;处理数据会非常慢总结: 文件块大小设置取决于磁盘传输速率二、HDFS 的 Shell 操作1、常用命令:上传 : hadoop fs -put 本地文件路径 hdfs文件路径 (-moveFromLocal \ -copyFromLocal)下载 : hadoop fs -get 本地文件路径 hdfs文件路径 (-copyToLocal)追加 : hadoop fs -appendToFile 本地文件路径 hdfs文件路径显示目录信息 : hadoop fs -ls hdfs文件路径显示文件内容 : hadoop fs -cat hdfs文件路径创建路径 : hadoop fs -mkdir hdfs文件路径拷贝 : hadoop fs -cp hdfs文件路径 hdfs文件路径移动文件 : hadoop fs -mv hdfs文件路径 hdfs文件路径显示末尾 : hadoop fs -tail hdfs文件路径删除文件 : hadoop fs -rm hdfs文件路径 (-rm -r 递归删除)文件夹大小 : hadoop fs -du -s -h hdfs文件路径 (-h显示每一个文件的大小)设置副本数量 : hadoop fs -setrep 数量 hadoop fs -setrep三、HDFS的读写流程1、文件写入流程客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件(将需要写入的文件名、文件大小等信息告诉 NameNode)NameNode 检查目标文件是否已存在父目录是否存在NameNode 返回是否可以上传如果通过检查。NameNode 会将操作写入 EditLog客户端请求第一个 Block 上传到哪几个 DataNode 服务器上NameNode 返回 DataNode 节点分别为dn1、dn2、dn3客户端通过 FSDataOutputStream 模块请求 dn1 上传数据dn1 收到请求会继续调用 dn2然后 dn2 调用 dn3将这个通信管道建立完成dn1、dn2、dn3 逐级应答客户端客户端开始往 dn1上传第一个 Block先从磁盘读取数据放到一个本地内存缓存以 packet 为单位dn1 收到一个 Packet 就会传给 dn2dn2 传给 dn3dn1每传一个 packet 会放入一个应答队列等待应答。每个 DataNode 写完一个块后会返回确认信息当一个 Block 传输完成之后客户端再次请求 NameNode 上传第二个 Block 的服务器写完数据关闭输出流发送完成信号给 NameNode在 HDFS 写数据的过程中NameNode 会选择距离待上传数据最近距离的 DataNode 接收数据节点距离两个节点到达最近的共同祖先的距离总和副本节点选择第一个副本在 Client 所处的节点上。如果客户端在集群外随机选一个。第二个副本在另一个机架的随机一个节点第三个副本在第二个副本所在机架的随机节点2、HDFS读数据流程客户端通过 DistributedFileSystem 向 NameNode 请求下载文件NameNode 通过查询元数据找到文件块所在的 DataNode 地址挑选一台 DataNode就近原则然后随机服务器请求读取数据DataNode 开始传输数据给客户端从磁盘里面读取数据写给输入流以 Packet 为单位来做校验客户端以 Packet 为单位接收先在本地缓存然后写入目标文件四、NameNode 和 SecondaryNameNode1、NameNode 启动第一次启动 NameNode 格式化后创建 Fsimage 和 Edits 文件。如果不是第一次启动直接加载编辑日志和镜像文件到内存客户端对元数据进行增删改的请求NameNode 记录操作日志更新滚动日志NameNode 在内存中对元数据进行增删改2、Secondary NameNode工作Secondary NameNode 询问 NameNode 是否需要 CheckPoint(检查点)直接带回NameNode 是否检查结果Secondary NameNode 请求执行 CheckPointNameNode 滚动正在写的 Edits 日志将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNodeSecondary NameNode 加载编辑日志和镜像文件到内存并合并生成新的镜像文件 fsimage.chkpoint拷贝 fsimage.chkpoint 到 NameNodeNameNode 将 fsimage.chkpoint 重新命名成 fsimage3、Fsimage和Edits解析NameNode 被格式化之后将在 $hadoop$/data/tmp/dfs/name/current目录中产生如下文件fsimage_0000000000000000000、fsimage_0000000000000000000.md5、seen_txid、VERSIONFsimage (镜像文件)HDFS 文件系统元数据的一个永久性的检查点其中包含 HDFS 文件系统的所有目录和文件 inode 的序列化信息Edits (编辑日志)存放 HDFS 文件系统的所有更新操作的路径文件系统客户端执行的所有写操作首先会被记录到Edits文件中seen_txid文件保存的是一个数字就是最后一个edits_的数字每次 NameNode启动的时候都会将 Fsimage 文件读入内存加载 Edits 里面的更新操作保证内存中的元数据信息是最新的、同步的可以看成 NameNode 启动的时候就将 Fsimage 和 Edits 文件进行了合并4、CheckPoint时间设置通常情况下SecondaryNameNode每隔一小时执行一次hdfs-default.xmlproperty namedfs.namenode.checkpoint.period/name value3600s/value /property一分钟检查一次操作次数当操作次数达到1百万时SecondaryNameNode执行一次property namedfs.namenode.checkpoint.txns/name value1000000/value description操作动作次数/description /property property namedfs.namenode.checkpoint.check.period/name value60s/value description 1分钟检查一次操作次数/description /property五、DataNode1、DataNode工作机制一个数据块在DataNode上以文件形式存储在磁盘上包括两个文件一个是数据本身一个是元数据包括数据块的长度块数据的校验和以及时间戳DataNode启动后向NameNode注册通过后周期性6小时的向NameNode上报所有的块信息心跳机制每3秒一次心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台机器或删除某个数据块。如果超过10分钟 30秒没有收到某个DataNode的心跳则认为该节点不可用集群运行中可以安全加入和退出一些机器2、数据完整性当 DataNode 读取 Block 的时候它会计算 CheckSum如果计算后的 CheckSum与 Block 创建时值不一样说明 Block 已经损坏Client 读取其他 DataNode 上的 Block常见的校验算法crc32md5128sha1160DataNode 在其文件创建后周期验证 CheckSum