HDFS
本文系统性的整理了hdfs相关的内容,包含概念,架构,原理,shell操作等知识点。
hdfs介绍
hdfs是分布式文件管理系统的一种,即很多服务器联合起来实现其功能,集群中的服务器有各自的角色,多个集群节点 去做一件事情;通过目录树定位文件。适合一次写入,多次读取。并且不支持修改,适合做分析。
win电脑的磁盘是NTFS的方式管理数据, 大数据集群采用的是HDFS(hadoop distributed file system)管理数据。
在hdfs这部分中,重点是hdfs的shell操作, 开发,以及hdfs的客户端。需要明白hdfs的数据流,namenode和secondaryNode 原理。hdfs整体是偏运维。
优点:
(1). 高容错性:数据自动板寸多个副本,通过增加副本的形式,提高容错性。如果一个副本挂了,会自动的再找一个服务器作为副本存储。始终保持指定的副本数。
(2). 适合处理大数据:GB, TB甚至PB级别的数据。 能够处理百万以上的文件数量。
(3). 可以构建再廉价的机器上,通过多副本机制,提高容错性。
缺点:
(1). 不适合低延迟的数据访问,比如毫秒级;
(2). 不适合对高效的对大量的小文件进行存储;
1. 存储大量的小文件是不可取的,会占用NameNode大量的内存存储文件目录和块信息。NameNode的内存总是有限的。
2. 小文件的寻址时间会超多读取的时间,违反了hdfs的设计目标。
(3). 不支持并发写入,文件随机修改;
(4). 一个文件只能有一个写,不允许多个线程同时写;
(5).仅支持数据追加, 不能文件的随机修改
hdfs架构
HDFS分了四部分:
- NamaNode;
- DataNode;
- SecondaryNameNode
- client
hdfs分为4部分:
一 NameNode
(1). 作为管理者;管理hdfs的命名空间,配置副本策略,数据块的映射信息,处理客户端读写请求。
二 DataNode
(1). 执行NameNode的命令, 对数据块进行读写操作;实际存数数据库;
三 Client 客户端
(1). 文件切分,文件上传hdfs的时候,client会将文件切成一个个的block, 再进行上传;默认是128M一个文件。
(2). 和Namenode交互,获取文件的位置的信息;
(3). 和datanode交互, 读取或写入数据;
(4). client提供命令管理hdfs,比如namenode格式化;
(5). client通过命令访问hdfs, 比如对hdfs的增删改查;
四 Secondary NameNode
(1). 并非namenode的热备;当namenode挂掉的时候,并不能马上替换namenode并提供服务;
(2). 辅助namenode,分担其工作的,比如定期合并Fsimage(镜像文件 )和Edits(编辑日志), 推送给namenode。
(3). 紧急情况下可辅助恢复namenode,可恢复部分的数据。
hdsf文件块大小设置(面试题)
hdfs的文件在物理上都是分块存储的,块的大小可以通过配置参数(dfs.blocksize)来规定。默认的2.x版本的是128兆。老版本是64M。
如果寻址时间约为10ms,即查到目标数据所在的block的时间为10ms。
寻址时间是传输数据的时间的1%时(据专家说的), 为最佳状态。因此,传输时间为 10ms/ * 0.01 = 1000ms = 1s
目前普遍的磁盘传输速度是100兆/s。
虽然设定默认一个block是128M, 但是实际会根据自己的机器磁盘传输速度的情况定,有个公司是256兆。
块设置的不能太小也不能太大?
(1) 太小会增加寻址时间,程序会一直在找块开始的位置;
(2) 太大会导致,从磁盘传输数据的时间会明显大于定位这个块所位置所需的时间。在处理这块数据时会很慢;
HDFS块的大小设置取决于磁盘的传输速率。
hdfs的shell操作
基本语法
bin/hadoop fs 具体命令
或者 bin/hdfs dfs 具体命令
hadoop 是包含了hdfs的;dfs是fs的实现类;
命令大全
使用 hdfs dfs
命令 或者 hadoop fs
查看所有可以使用的命令, 二者一样的。
常用命令:
-
-help
hadoop fs -help 要查询的命令 比如: hadoop fs -help rm 查询 rm 命令的使用; -
-ls 命令
hadoop fs -ls / 查看根目录下的文件;
hadoop fs -lsr / 递归查询指定目录下的文件夹; -
-mkdir 命令
hadoop fs -mkdir /test 创建目录
hadoop fs -mkdir -p /test/demo 创建多级目录 -
-moveFromLocal 从本地剪切粘贴到HDFS路径上
hadoop fs -moveFromLocal 本地文件路径 hdfs文件路径(指定到文件夹下)
将本地路径的文件, 剪切到 hdfs文件路径上。 -
-appendToFile 追加文件到已经存在的文件末尾
hadoop fs -addToFile 本地文件路径 hdfs文件路径(指定到文件名) -
-cat 显示文件内容
hadoop fs -cat /demo.txt -
-chgrp -chmod -chown 和linux上用法一致, 修改文件所属权限
hadoop fs -chgrp 要改为的所属组的名 要改的文件名路径
hadoop fs -chgrp groupname /data/demo/demo1.txt -
-copyFromLocal 从本地拷贝文件到hdfs路径
hadoop fs -copyFromLocal 本地文件路径 hdfs文件路径(指定到文件夹下) -
-copyToLocal 从hdfs拷贝到本地
hadoop fs -copyToLocal hdfs上的文件路径 本地的文件夹路径 -
-cp 从hdfs拷贝到另一个hdfs路径
hadoop fs -cp hdfs原文件路径 hdfs目标文件夹路径 -
-mv 在hdfs目录中移动文件
hadoop fs -mv hdfs原文件路径 hdfs目标文件夹路径 -
-get 等同于copyToLocal 下载hdfs文件到路径
hadoop fs -copyToLocal hdfs上的文件路径 本地的文件夹路径 -
-getmerge 合并下载多个文件 , 即将hdfs路径上的多个文件内容,合并之后下载到本地指定的文件内
hadoop fs hdfs路径上的文件夹 本地路径的文件
hadoop fs /data/* ./all.txt -
-put 等同于copyFromLocal
hadoop fs -put 本地文件路径 hdfs文件路径(指定到文件夹下) -
-tail 显示一个文件的末尾
hadoop fs -tail -200 /data/demo.txt -
-rm 删除文件
hadoop fs -rm /data/demo.txt
hadoop fs -rm -r /data/demo.txt 递归删除 -
-rmdir 删除空文件夹
-
-du 统计文件夹大小
hadoop fs -du 文件夹路径
hadoop fs -du -h 文件夹路径 以兆的单位显示
hadoop fs -du -h -s 文件夹路径 显示总的文件大小 -
-setrep 设置hdfs的文件的副本数量
hadoop fs -setrep 2 文件所在的路径
2是设置的副本数量在指定配置副本数的时候, 代码中指定 的副本数优先级最高,其次是代码的配置文件中参数,最后是节点上的默认副本数。
HDFS 客户端操作
这部分暂时略过
hdfs的数据流
hdfs的写数据流程
(1) 客户端拿到文件,创建Distributed FileSystem, 通过这个对象,向NameNode请求上传文件/data/a.txt;
(2) namdenode先检查上传的文件是否存在, 再响应是否可以上传文件;
(3) 请求上传第一个block(0-128M),向namenode请求返回datanode;
(4)namenode返回datanode1, datanode2节点,表示可以采用这2个节点存储数据;具体传到哪个节点, 是根据负载和节点距离计算的,原则是负载小的距离近的先上传;
(5)通过FSDataOutputStream(输出流),开始上传数据。首先请求建立Block传输通道(按照箭头指的方向);
(6)建立成功之后,datanode会给应答成功按照箭头指的方向);
(7)再之后开始传输数据。按照流的方式,传输的时候是以最小的Packet为单位;
先读取到第一个datanoede节点的内存中,将第一个block数据序列化datanoede节点的磁盘上;然后剩下在内存中的数据传输到第二个datanoede节点的内存中,然后再序列化到第二个datanoede磁盘中;
(8) 数据传输完毕后, 响应传输结果。传输完毕之后datanoede节点内存中的数据会被删除;
(9)Distributed FileSystem通知namenode传输数据完成;
上面提到 节点距离计算 ,是根据网络拓扑算出来的,具体解释以后再补。
先挖坑
整体过程就是一个io流操作, 如图所示: