1.定义
全称(Hadoop Distributed File System),是一种分布式文件管理系统。
2.诞生背景
如今时代数据量越来越大,一个操作系统存不下所有的数据,就需要分配到更多的操作系统管理的磁盘中,但是涉及到多个机器就难以管理维护,需要一种系统来管理多台机器上的文件。
3.优缺点
高容错性、适用于大数据、可构建在廉价机器上。
不适合低延时数据访问,对大量小文件存储不友好、不支持并发写入和文件随机修改(仅支持追加)。
4.组成架构
4.1NameNode
可以理解为主要管理者:①管理HDFS的名称空间;②管理数据块映射信息;③配置副本策略;④处理client读写请求。
4.2DataNode
可以理解为工人即NameNode主要管的人:①存储实际的数据块(数据长度、校验和、时间戳);②执行数据块的读写操作。
4.3Secondary NameNode(重点)
具体可以一步这里:NameNode与Secondary NameNode
4.4Client
客户端:①文件上传时将其切分成块进行存储;②与NameNode交互,获取文件的位置信息;③与DataNode交互,读取或者写入数据;④可格式化NameNode,可对HDFS进行增删改查。
5.shell命令(实用,重点)
5.1创建文件夹
例如创建一个/emt文件夹
hadoop fs -mkdir /emt
5.2上传
5.2.1剪切本地文件到HDFS
例如从本地当前目录下的my.txt剪切到hdfs的/emt目录下
hadoop fs -moveFromLocal my.txt /emt
5.2.2拷贝本地文件到HDFS
例如从本地当前目录的me.txt拷贝到hdfs的/emt目录下
hadoop fs -copyFromLocal me.txt /emt
还可以用put,与copyFromLocal效果等同
hadoop fs -put me.txt /emt
5.2.3追加一个文件到已经存在的文件末尾
例如把today.txt中内容追加到hdfs的/emt下的文件me.txt的末尾。
hadoop fs -appendToFile today.txt /emt/me.txt
5.3下载
例如把hdfs的/emt下的文件me.txt拷贝到当前目录下
hadoop fs -copyToLocal /emt/me.txt ./
也可以使用get,拷贝到当前目录下,并命名为me2.txt
hadoop fs -get /emt/me.txt ./me2.txt
5.4其他常用操作
显示/emt目录下的信息
hadoop fs -ls /emt
显示文件内容
hadoop fs -cat /emt/me.txt
创建文件夹
hadoop fs -mkdir /wy
统计文件夹的大小信息
hadoop fs -du -s -h /emt
设置HDFS中文件的副本数量(例如为10)
hadoop fs -setrep 10 /emt/me.txt
其实还有其他的指令-cp、-mv、-tail,-rm等等,其实和linux命令不能说很像,只能说一模一样,就是前面多了个hadoop fs,然后正常命令前面多了个-。
6.HDFS读写流程
6.1读流程
6.2写流程
图中以上传第一个块为例,后面块同理。
6.2.1节点距离
写数据的过程,NameNode会选择距离待上传数据最近距离的DataNode接受数据。那么这个距离怎么计算呢?
总结来说就是
两个节点到达最近的公共祖先的距离总和
比如上图中节点B、C的最近公共祖先是A,那么距离综合是2+1=3