一、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、