hdfs命令怎么复制文件夹 hdfs 复制文件夹_文件系统


前言

在企业里面,我们搭建一个服务一般都会考虑几个问题。

首先是用途,比方说一般都有开发环境,测试环境以及生产环境(比较重要的服务一般还会有灰度环境)。这个用途一旦决定了,我们就可以考虑接下来的问题了。第二是架构,第三就是成本了。架构会直接决定所需要花费的机器成本和维护成本。好吧,好像有点扯远了。

回到正题。

这里我想要说明的事情是我当上大数据运维之后,遇到的坑其实都可以归根溯源到架构或者原理的理解上面。

所以我特别想记录一下 hdfs 和 yarn 的架构,遇到坑的时候回想一下或许可以从这里找到解决问题的思路。

HDFS

hdfs 包含两种角色,NamenodeDatanode

下面是一张官方架构图。


hdfs命令怎么复制文件夹 hdfs 复制文件夹_hdfs复制文件夹_02


hdfs 是典型的主从架构。在 hdfs 的内部,文件是会被划分成多个块,块被存储在一组 slave 里面( 就是图里的绿色小方格 )。

master 负责管理文件系统的命名空间( 比如打开文件,关闭文件以及重命名文件和文件夹),客户端对文件系统的访问权限以及块和 slave 的映射关系。

slave 负责存储文件,处理客户端的读写请求并且根据 master 的指令对块进行创建,删除以及复制。

下面分几个方面描述一个 hdfs 这个分布式文件系统。

  • 命名空间

像大多数文件系统一样,用户可以对文件(夹)进行增删改查。NN 负责维护这些对命名空间进行操作的元数据信息。

  • 数据复制

在 HDFS 的内部,文件会被分成大小相同的多个块进行存储,同时,为了实现容错,这些块会被复制多份并散落在不同的 DN 上进行存储。这个块大小和复制份数是可以由用户定义的。

上面提到 DN 是存储这些块的,NN 是负责管理块和 DN 的映射关系。那么,这里我们有两个东西,一个是心跳,另一个是块报告。DN 周期性向 NN 发送心跳信息和块报告。心跳是告诉 NN 它还活着,块报告是告诉 NN 它有哪些块。

详细如图所示。


hdfs命令怎么复制文件夹 hdfs 复制文件夹_hdfs命令怎么复制文件夹_03


  1. 副本 No.1:如果客户端正在这个 DN 上面写,那么就放在这个 DN;否则,在这个机架任意选取一个 DN
  2. 副本 No.2:放在和第一份副本不同的机架上面的某个节点
  3. 副本 No.3:放在第二份副本那个机架上的不同节点上面

总的来说,就是一个副本在一个节点,另一个副本在另一个机架的一个节点上,最后一个副本均匀分布在第二个副本那个机架的不同节点上。

使用这个策略我们提高了读写效率(降低机架之间传输的所需带宽)和不影响数据的安全可靠。

同时,HDFS 有一个就近读的策略,默认是会选取离接收读请求那个 DN 最近的块以降低带宽的开销。这是所谓的块选择。同时,这里有一个安全模式,当NN发现它安全的时候,它才会继续接受请求。那怎么判断安全呢?那就是副本数达到一个可承受的最小值。

  • 元数据持久化

这里我们说两个文件,一个是 EditlLog,另一个是 FsImage。

  1. EditLog:记录文件系统元数据的变化。比如新增一个文件之类。修改复制因子的操作这里也会记录
  2. FsImage:保存整个文件系统的命名空间,包括文件的块映射以及文件系统的一些属性

其实 EditLog 是记录操作的,FsImage是保存被操作的文件系统的。那么这里我们有一个叫 checkpoint 的东西,它的工作原理是当 NN 启动的时候,会从磁盘读取 EditLog 和 FsImage 这两个文件,并将 EditLog 里面记录的操作应用到 FsImage 然后生成一个新版本的 FsImage,然后会删掉这个 EditLog。这个过程就是 checkpoint 了。

  • 鲁棒性
  1. 磁盘故障,心跳信息与重复制
    每个 DN 都会定期发送心跳信息到 NN 表示自己还活着。假设出现网络问题,NN 会标记此 DN 已经失联,这时候便不再转发任何的 IO 请求给它,同时 NN 会触发 re-replication。其实,磁盘只读,DN 失联或者 block 损坏都是会令 NN 触发 re-replication 的。
  2. 数据检验
    NN 会对新写入的文件做一个校验和然后存在一个隐藏文件里面,当客户端要读这个文件,NN 会将从各个 DN 读回来的 block 的检验值和隐藏文件里面的进行对比。如果对,那么读出来,错误,就继续寻找其他无损的 block。
  3. snapshot
    其实就是用来回滚到你做这个快照的时候的状态。
  • 数据写过程
  1. 数据块
    HDFS 天生就是用来处理大文件的。默认的块大小是 64mb,可以在配置文件调节。
  2. 写过程
    写入数据的时候客户端会现将内容写到一个临时文件里,当临时文件超过块大小之后,客户端会通知 NN。NN 会修改文件系统层级并为其分配一个数据块,NN 响应客户端的请求,告诉客户端放到哪个 DN 的哪个数据块里面去。然后客户端将临时文件的内容写到 NN 指定的 DN。当一个文件写完了,剩下的临时文件会直接被发送到 DN,然后客户端告诉 NN 搞定了。NN 确认之后将文件状态从创建变为永久存储。( 如果文件创建过程中NN故障了,那么文件就丢失了。)
  3. 复制是管道式的
    正如上面所说,写的过程里面客户端会获取一个可写的 DN 列表。这时候( 假设复制因子是 3 ),客户端将数据写到第一个 DN。第一个 DN 接收数据并写到本地,然后将数据传输到列表里面的第二个 DN,第二个 DN 和第三个 DN 同理。
  • 空间回收
  1. 文件删除与恢复
    文件被删之后并不是马上移除,而是被移动到 trash 目录,这时候是可以被恢复的。用户可以设置一个过期时间,时间一过,文件就会被 NN 移除了。文件移除与空间释放之间会有一个延时。

YARN

yarn 有几个角色,都比较重要。我们先看图然后再总结一下角色的作用。


hdfs命令怎么复制文件夹 hdfs 复制文件夹_客户端_04


  • ResourceManager

RM 主要有两个组件,一个是 scheduler,另一个是 ApplicationManager。

  1. scheduler
    这个调度器主要作用是分配资源给任务,比如 CPU,memory 等等。最流行的有两种调度策略,分别是 CapacityScheduler 和 FairScheduler。
  2. ApplicationManager
    这个应用管家主要负责接受任务提交,为任务启动 ApplicationMaster 以及负责 ApplicationMaster 失败后的重启。
  • NodeManager

如其名,这个组件负责监控并且向 RM 汇报资源的使用情况。

  • ApplicationMaster

每个任务的 AM 负责根据调度器的安排分配资源细节,跟踪状态并且监控任务过程。

其实,我们对着上面的这个框架图然后知道每个角色的作用就可以明白 YARN 架构的工作流程了。


好了,到这里的话我大致就讲完 hadoop 这个东东里面的主要部分了。我当时所在的团队使用的是 CDH 版本的 hadoop,和社区版还是有一点区别的。但是里面的原理是一样的。