hadoop的HDFS详解

一、HDFS的shell(命令行客户端)操作

常用命令参数介绍
-help             
功能:输出这个命令参数手册
-ls                  
功能:显示目录信息
示例: hadoop fs -ls hdfs://hadoop-server01:9000/
备注:这些参数中,所有的hdfs路径都可以简写
-->hadoop fs -ls /   等同于上一条命令的效果
-mkdir              
功能:在hdfs上创建目录
示例:hadoop fs  -mkdir  -p  /aaa/bbb/cc/dd
-moveFromLocal            
功能:从本地剪切粘贴到hdfs
示例:hadoop  fs  - moveFromLocal  /home/hadoop/a.txt  /aaa/bbb/cc/dd
-moveToLocal              
功能:从hdfs剪切粘贴到本地
示例:hadoop  fs  - moveToLocal   /aaa/bbb/cc/dd  /home/hadoop/a.txt 
--appendToFile  
功能:追加一个文件到已经存在的文件末尾
示例:hadoop  fs  -appendToFile  ./hello.txt  hdfs://hadoop-server01:9000/hello.txt
可以简写为:
Hadoop  fs  -appendToFile  ./hello.txt  /hello.txt
-cat  
功能:显示文件内容  
示例:hadoop fs -cat  /hello.txt   
-tail                 
功能:显示一个文件的末尾
示例:hadoop  fs  -tail  /weblog/access_log.1
-text                  
功能:以字符形式打印一个文件的内容
示例:hadoop  fs  -text  /weblog/access_log.1
-chgrp 
-chmod
-chown
功能:linux文件系统中的用法一样,对文件所属权限
示例:
hadoop  fs  -chmod  666  /hello.txt
hadoop  fs  -chown  someuser:somegrp   /hello.txt
-copyFromLocal    
功能:从本地文件系统中拷贝文件到hdfs路径去
示例:hadoop  fs  -copyFromLocal  ./jdk.tar.gz  /aaa/
-copyToLocal      
功能:从hdfs拷贝到本地
示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
-cp              
功能:从hdfs的一个路径拷贝hdfs的另一个路径
示例: hadoop  fs  -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2 
-mv                     
功能:在hdfs目录中移动文件
示例: hadoop  fs  -mv  /aaa/jdk.tar.gz  /
-get              
功能:等同于copyToLocal,就是从hdfs下载文件到本地
示例:hadoop fs -get  /aaa/jdk.tar.gz
-getmerge             
功能:合并下载多个文件
示例:比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
hadoop fs -getmerge /aaa/log.* ./log.sum
-put                
功能:等同于copyFromLocal
示例:hadoop  fs  -put  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2
-rm                
功能:删除文件或文件夹
示例:hadoop fs -rm -r /aaa/bbb/
-rmdir                 
功能:删除空目录
示例:hadoop  fs  -rmdir   /aaa/bbb/ccc
-df               
功能:统计文件系统的可用空间信息
示例:hadoop  fs  -df  -h  /   
-du 
功能:统计文件夹的大小信息
示例:
hadoop  fs  -du  -s  -h /aaa/*  
-count         
功能:统计一个指定目录下的文件节点数量
示例:hadoop fs -count /aaa/   
-setrep                
功能:设置hdfs中文件的副本数量
示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz
<这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量>

二、hdfs的工作机制

1、概述

1.  HDFS集群分为两大角色:NameNode、DataNode  (Secondary Namenode)
2.  NameNode负责管理整个文件系统的元数据
3.  DataNode 负责管理用户的文件数据块
4.  文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上
5.  每一个文件块可以有多个副本,并存放在不同的datanode上
6.  Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文
    件的副本数量
7.  HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进
    行

2、HDFS写数据的流程

2.1、概述

客户端要向HDFS写数据,首先要跟namenode通信以确认可以写文件并获得接收文件block的datanode,然后,客户端按顺序将文件逐个block传递给相应datanode,并由接收到block的datanode负责向其他datanode复制block的副本。

2.2、详细流程图

2.2、详细步骤解析

1、客户端有一个文件cls.avi,300M,客户端向namenode请求上传文件/aaa/cls.avi,namenode查询元数据,元数据要检查一下看有没有/aaa这个目录,没有就不让传,假设条件满足(有/aaa这个目录)
2、元数据就给客户端一个响应,说可以上传
3、rpc请求上传第一个block(0-128M),请返回哪几台datanode可以上传(namenode记录了这个集群里有哪些datanode,哪些在线,哪些已经死掉了,每一台datanode空间的大小,这是因为每一个datanode定期向namenode汇报它的信息)
4、假设返回dn1、dn3、dn4这3个datanode。考虑的因素有:空间、距离
客户端说要返回几个dn就返回几个dn
上传datanode的选择策略是:
第一个副本:先考虑跟客户端距离最近的,距离指的是客户端到datanode之间网络跳转的极速,如果在同一个机架(路由器)下面,它们的距离基本上是一样的,那这个时候就考虑空间,如果空间也都一样的话,那就随机了。
第二个副本:再考虑跨机架选择一个datanode增加副本的可靠性,因为副本主要是用来考虑安全的,如果在同一个机架上,如果机架断电,那么就都找不到了。
第三个副本:就在第一个副本同机架挑选另外一个datanode存放

一般公司1个机架就搞定了,几十台机器

5、客户端向datanode传数据流,在传之间要先建管道。先跟目标机器(dn1)请求建立一个通道channel,告诉dn1要传数据,同时还要传给dn3和dn4,dn1请求dn3建立一个通道,dn3请求dn4建立一个通道。

client---请求建立通道---->dn1----请求建立通道--->dn3---请求建立通道--------->dn4
                                                                          |                                                                                         |                                                                         |
|                                                                         |
|                                                                         |
|<-----应答成功------dn1<------应答成功-------dn3<------应答成功(准备好了)----                                      
6、管道建成之后开始传输,从客户端开始读文件(0-128M),然后向datanode里面写的,并不是把128M传到dn1成功了才往dn3、dn4复制的,而是以一个一个的小数据包(packet,一个packet有64k)为单位来写,先写进dn1的缓冲区,然后一边向dn1的block1的存储区写,一边向dn3的缓冲区复制,dn3的缓冲区一边向dn3的block1的存储区写,一边向dn4的缓冲区写,这样,block1的三个副本几乎同时传完。
7、每一个packet都有应答,上传成功了就返回上传成功了。block只要dn1上传成功了客户端就认为上传成功了,如果dn3、dn4没上传成功的话,没有关系,namenode最后会做异步的同步,会将dn1上面的block于dn3、dn4进行同步。如果dn1上传失败的话,就向namenode请求,说datanode1不行,请求再换一个datanode,这之后namenode就会几下datanode1这台机器有问题。

8、接下来客户端上传第二个block,这个时候会再次请求namenode,让namenode返回三个datanode,按照上面的原则再选。

9、namenode就记下了这个文件上传到哪个目录,上传了几个block,每个block的每个副本都在哪个dn上。当客户端读的时候就能够返回这些信息

3、HDFS读数据的流程

3.1 概述

客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件

3.2、详细步骤图

3.3、详细步骤解析

1、客户端跟namenode通信查询文件元数据,namenode返回要查询的文件的元数据信息(知道这个文件有几个block,分别在哪里,比如说文件有三个block)
2、根据返回的元数据信息,找到找到第一个block所在的datanode服务器
3、挑选一台datanode(就近原则,然后随机)服务器,请求读取数据
4、建立通道,传输数据(datanode是向通道里面拉取数据,客户端是向通道里面读取数据的)
5、第一个block传输完之后,按照上面的流程获取第二个block
6、获取到第二个block之后,将第二个block块追加到第一个block的末尾
7、再获取第三个block追加到文件的末尾,这样整个文件就获取到了

三、namenode的工作机制

1、namenode的职责

NAMENODE职责:
负责客户端请求的响应
元数据的管理(查询,修改)

2、元数据管理

每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint)
日志文件是滚动的,一个正在写的,几个已经写好滚动的,checkpoint时把正在写的滚动一下,然后把fsimage和日志文件下载到secondary namenode机器,只有第一次才会下载fsimage,这时fsimage不会很大,以后就只下载日志文件



元数据信息首先存在内存里面,如果内存里存满的话, 定时dump到fsimage(整个内存里面元数据的镜像文件),内存里面所有的数据在fsimage里面都有,其实就是序列化到fsimage

当有元数据信息进行更新的时候,首先先在内存里面更新,然后在edits里面记录操作日志,这样即便当前的namenode挂了,也能通过操作日志和fsimage(里面存的是老数据)来得到全新的数据。
如果edits运行久了,里面就会有非常多的操作日志了,这样每次启动的时候加载edits就会加载很长时间,会启动的特别慢,这个时候怎么做呢,将edits和fsimage定期的合并,形成新的fsimage,这样遗留的edits日志就会非常的少。
1、secondary namenode和namenode之间会进行心跳通信,secondary namenode会向namenode请求是否要做checkpoint,当条件满足(比如,设置的定时时间达到了,或者edits里面日志的数量达到了),2、会请求做checkpoint,当执行了checkpoint 3、namenode滚动当前正在写的edits 4、然后将所有的日志文件,包括刚刚滚动出来的日志文件和fsimage下载到secondary namenode 
5、在secondary namenode上将日志文件和fsimage加载到secondary namenode的内存合并成更新后的元数据,6、将元数据dump成新的fsimage.chkpoint文件 7、将fsimage.chkpoint文件上传到namenode 8、将fsimage.chkpoint文件重命名成fsimage 9、当第二次再执行checkpoint的时候,只把edits文件下载到secondary namenode就行了(因为secondary namenode已经有fsimage文件了,namenode上的fsimage还是secondary namenode传过去的),这时候将edits和fsimage.chkpoint合并成最新的元数据信息,dump成fsimage.chkpoint,上传到namenode就行了。
edits和fsimage尽可能的追上内存中的数据


namenode对数据的管理采用了三种存储形式:
内存元数据(NameSystem)
磁盘元数据镜像文件
数据操作日志文件(可通过日志运算出元数据)

1

checkpoint操作的触发条件配置参数
dfs.namenode.checkpoint.check.period=60  #检查触发条件是否满足的频率,60秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
#以上两个参数做checkpoint操作时,secondary namenode的本地工作目录
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}

dfs.namenode.checkpoint.max-retries=3  #最大重试次数
dfs.namenode.checkpoint.period=3600  #两次checkpoint之间的时间间隔3600秒
dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录

2.1、

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容