HDFS的Shell命令练习
查看HDFS根目录
hadoop fs -ls /
在根目录创建一个目录test
hadoop fs -mkdir /test
上传文件
hadoop fs -put ./test.txt /test
或 hadoop fs -copyFromLocal ./test.txt /test
下载文件
hadoop fs -get /test/test.txt .
或 hadoop fs -getToLocal /test/test.txt .
拷贝文件
hadoop fs -cp /test/test.txt /test1
删除文件
hadoop fs -rm /test1/test.txt
移动文件
hadoop fs -mv /test/test.txt /test1
递归删除文件目录
hadoop fs –rm -r /test1
HDFS架构
-NameNode
-DataNode
-Secondary NameNode
MetaData(元数据)
——元数据:好比仓库管理员记账的账本(100斤白菜,存放在哪,几号存放的;
图书管理系统,存放一本书,需要记录书名,存放位置,存放时间,有几个副本…
NameNode
- 是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
- 文件包括:
① fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息(hadoop1.0和hadoop2.0的伪分布式并不是和内存中的内存元数据实时同步的)。
② edits:操作日志文件。
③ fstime:保存最近一次checkpoint的时间(比如windows系统的还原点)
以上这些文件是保存在linux的文件系统中。
Namenode始终在内存中保存metedata,用于处理“读请求”
到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回
Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致(1.0集群和2.0的伪分布式),而是每隔一段时间通过合并edits文件来更新内容。Secondary namenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。
SecondaryNameNode
- HA的一个解决方案。但不支持热备。配置即可。
- 执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage.
- 默认在安装在NameNode节点上(1.0),但这样…不安全!
secondary namenode的工作流程:
- secondary通知namenode切换edits文件
- secondary从namenode获得fsimage和edits(通过http)
- secondary将fsimage载入内存,然后开始合并edits
- secondary将新的fsimage发回给namenode
- namenode用新的fsimage替换旧的fsimage
什么时候开始checkpiont(同步)?
fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
fs.checkpoint.size
规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。
满足以上任何两个条件,就开始合并
Datanode
- 提供真实文件数据的存储服务。
- 文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.
- 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
- Replication。多复本。默认是三个。(hdfs-site.xml的dfs.replication属性)
(复本所保存的那个机器down掉了,namenode会主动发送复制命令再复制一个复本到其他datanode,这其中包含了datanode的心跳机制,datanode会定期发送心跳给namenode,如果datanode过了这个周期没有发送心跳,namenode会认为这个datanode down掉了。)
hdfs是怎么分配块大小的?(Shell命令练习:验证块大小)
- 方法:上传大于128MB的文件,观察块大小
- 验证:使用 http://hadoop0:50070 观察
清除# hadoop fs -ls / 下所有文件:hadoop fs - rm –r 文件夹名.. (递归删除)
文件大小:154773078 字节(147M)——-jdk-7u79-linux-i586.gz 上传到HDFS的 /jdk1.7 目录下
hadoop fs -put /root/jdk-7u79-linux-i586.gz /jdk1.7
在/itcast/hadoop-2.4.1/tmp/dfs/data/current/BP-1152942234-192.168.1.10-1458206501707/current/finalized目录下找到这4条记录:
-rw-r--r--. 1 root root 134217728 Mar 20 01:52 blk_1073741839
-rw-r--r--. 1 root root 1048583 Mar 20 01:52 blk_1073741839_1015.meta
-rw-r--r--. 1 root root 20555350 Mar 20 01:52 blk_1073741840
-rw-r--r--. 1 root root 160599 Mar 20 01:52 blk_1073741840_1016.meta
其中不带.meta后缀的文件是block文件,可以看到其中一个block大小是128M(134217728字节),另一个则占剩余的大小。