0%

hdfs实操

  • HDFS重要特性
  • HDFS shell操作
  • HDFS工作流程与机制

HDFS重要特性

  • 主从架构(master/slave)

    • 一个NameNode,多个DataNode
    • 机架(Rack)
  • 分块存储

    • 物理上分块,默认128M
    • 块大小可通过配置参数规定,参数位于hdfs-defalut.xml中:dfs.blocksize
  • 副本机制

    • 文件的所有block都有副本
    • 由参数dfs.replication控制,默认值是3,也就是额外备份2份
  • 元数据记录

    • 文件自身属性信息

    • 文件块位置映射信息

  • 抽象统一的目录树结构(namespace)

    • 层次性文件组织结构
    • NameNode负责维护
    • 客户端通过路径来访问文件,如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
  • 数据块存储

    • 各个block的具体存储管理由DataNode节点承担

HDFS架构

HDFS shell操作

1
2
3
4
5
hadoop fs -ls file:/// #操作本地文件系统
hadoop fs -ls hdfs:///mode1:8020/ #操作HDFS分布式文件系统
hadoop fs -ls / #直接根目录,没有指定协议 讲加载读取fs.defaultFS值(core-site.xml)
hadoop fs -ls gfs:/// #操作谷歌文件系统
hadoop fs -ls tfs:/// #操作淘宝文件系统

ps:hdfs dfs = hadoop fs

  1. 创建文件夹

    hadoop fs -mkdir [-p] <path>

  2. 查看指定目录下内容

    hadoop fs -ls [-h] [-R] [<path> ...]

    -h 人性化显示size

    -R 递归查看目录及其子目录

  3. 上传文件到HDFS指定目录下

    hadoop fs -put [-f] [-p] <localsrc> ... <dst>

    -f 覆盖目标文件(已存在下)

    -p 保留访问和修改时间,所有权和权限

    localsrc 本地文件系统(客户端所在机器)

    dst 目标文件系统(HDFS)

  4. hadoop fs -cat <src>

  5. hadoop fs -tail <src>

  6. 下载文件到本地系统指定目录

    hadoop fs -get [-f] [-p] <src> ... <localdst>

  7. hadoop fs -cp [-f] <src> ... <dst>

  8. 追加数据到HDFS文件中

    hadoop fs -appendToFile <localsrc> ... <dst>

    将所有给定本地文件的内容追加到给定dst文件

    dst如果文件不存在,则创建该文件

    如果<localSrc>为-,则输入为从标准输入中读取

  9. hadoop fs -mv <src> ... <dst>

HDFS工作流程与机制

角色构成

主角色:NameNode

NameNode维护和管理文件系统元数据,包括namespace、文件和块的位置信息、访问权限等信息(不存储实际数据块)

NameNode是访问HDFS的唯一入口

NameNode所在机器通常会配置有大量内存(RAM)

NameNode是Hadoop集群中的单点故障

  • NameNode内部通过内存磁盘文件两种方式管理元数据

  • 其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志

从角色:DataNode

DataNode负责具体的数据块存储,其数量决定了HDFS集群的整体数据存储能力

DataNode启动时,会将自己注册到NameNode并汇报自己负责持有的块列表

DataNode所在机器通常配置有大量的硬盘空间

主角色辅助角色:secondarynamenode

Secondary NameNode充当NameNode的辅助节点

帮助NameNode进行元数据文件的合并动作

写数据流程

  1. HDFS客户端创建对象实例DistributedFileSystem,该对象中封装了与HDFS文件系统操作的相关方法

  2. 调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件

    • NameNode执行克重检查判断:目标文件是否存在、父目录是否存在、客户端是否具有创建该文件的权限。检查通过,NameNode就会为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据
  3. 客户端通过FSDataOutputStream输出流开始写入数据

  4. 客户端写入数据时,将数据分成一个数据包(packet 默认64k),内部组件DataStreamer请求NameNode挑选出适合存储数据副本的一组DataNode地址,默认是3副本存储

    DataStreamer将数据包流式传输到pipeline的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode。同样,第二个DataNode存储数据包并且发送给第三个(即最后一个)时DataNode

  5. 传输的反方向上,会通过ACK机制消炎数据包传输是否成功

  6. 客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭

  7. DistributedFieSystem联系NameNode告知其文件写入完成,等待NameNode确认

    因为namenode已经知道文件由哪些块组成(DataStream请求分配数据块),因此仅需等待最小复制块即可成功返回

    最小复制是由参数dfs.namenode.replication.min指定,默认是1

基础支撑

  • Pipeline管道(HDFS数据传输方式)

  • ACK应答响应(确保数据传输安全)

  • 默认三副本存储策略(不能把所有副本放在一台机器上)

    由BlockPlacementPolicyDefault指定

    • 第一块副本:优先客户端本地,否则随机

    • 第二块副本:不同于第一块副本的不同机架

    • 第三块副本:第二块副本相同机架不同机器