HDFS基础
Hadoop Distributed File System
- 分布式文件系统
 - 运行在 commodity hardware
 - fault-tolerant 高容错
 - 部署在廉价的(low-cost hardware)的机器上
 - 高吞吐量 high throughput
 - 适用于大数据量
 
普通文件系统
- 目录结构
 - 存在的是文件或文件夹
 - 对外提供服务: 创建、修改、删除、查看、移动
 
普通文件系统 VS 分布式文件系统
- 单机 集群
 - 分布式文件系统能够横跨N个机器
 
HDFS前提和设计目标
- Hardware Failure(硬件错误) 是很常见的
    
- 每个机器只存储文件的部分数据,blocksize=128M,block存放在不同的机器上来容错
 
 - Streaming Data Access 流式数据访问
 - Large Data Sets 大规模数据集
 - Moving Computation is Cheaper than Moving Data 移动计算比移动数据更划算
 
HDFS 架构
NameNode and DataNodes
- 主从架构
    
- 主节点管理NameSpace(这里可以理解为整个文件系统)
 - 主节点提供对客户端的访问 (对文件的CRUD及管理文件与DataNode之间的映射)
 - 数据节点提供数据存储功能
 - 一个文件被拆分为多个block,存在一系列的DataNode上,用于容错
 
 - 副本机制
    
- 讲一个大文件氛分为多个block,除了最后一个,每个块大小相同
 - 文件的副本数量可以在创建的时候指定
 
 
副本摆放策略
默认 相同rack内文件传输就会快一些
- 本rack的一个节点上
 - 另外一个rack的节点上
 - 与2相同的rack的另外一个节点上
 
还有其他的方式版本不同可能不同
- 本rack的一个节点上
 - 本rack的另一个节点上
 - 另外一个rack的节点上
 
客户端写数据到HDFS的流程
- 客户端发起上传文件命令
 - namenode判断文件是否存在,并返回是否能写的回复,同时,判断文件的大小返回客户端写入到哪几个datanode
 - 根据文件的大小拆分不同的block
 - 根据返回的datanode的数据传输链接,建立连接(连接其中一个datanode,由datanode再去和其他datanode建立连接?)
 - 按顺序传输block到datanode
 - 通知namenode传输完成,记录元数据信息,名称、block存放的地方等信息
 
读数据流程
- 客户端发起读请求到namenode
 - namenode判断是否存在等,若存在,返回文件的元数据信息(文件名称、block的信息)
 - 按顺序发送到datanode读取数据
 - 组装,返回
 
HDFS的元数据管理
- 元数据 : 其实就是HDFS的目录结构以及每个BLOCK信息(id,副本系数,block存在什么地方)
 - 存在什么地方: 对应配置 hadoop.tmp.dir 目录下的name文件下面 fsimage文件中
 - 文件新增、修改、删除等操作不能直接每次都操作fsimage,文件io很浪费性能
 - checkPoint
 
1. 内存中有一个树形结构
2. 新增或修改直接操作内存
3. 定期将内存中的数据写入到fsimage文件中
4. 在未同步到磁盘的时间过程中,将所有对磁盘的操作命令放在edits日志当中
5. 新进程 - Secondary namenode 将fsimage加载磁盘数据到内存中,
然后将edits的操作都作用到内存中去,然后新生成的fsimage替换调原来的fsimage数据。
安全模式
namenode在启动过程中,会先进入一个safemode 的状态,暂时是不能进行读写操作的,会接受所有datanode接收到block的信息(大概30s时间), 当检查到所有的block的块的副本数量是配置的最少数量时,就退出安全模式
HDFS 命令行操作
 hadoop fs [generic options]
        [-appendToFile <localsrc> ... <dst>]
        [-cat [-ignoreCrc] <src> ...]
        [-checksum <src> ...]
        [-chgrp [-R] GROUP PATH...]
        [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
        [-chown [-R] [OWNER][:[GROUP]] PATH...]
        [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
        [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
        [-count [-q] [-h] [-v] [-x] <path> ...]
        [-cp [-f] [-p | -p[topax]] <src> ... <dst>]
        [-createSnapshot <snapshotDir> [<snapshotName>]]
        [-deleteSnapshot <snapshotDir> <snapshotName>]
        [-df [-h] [<path> ...]]
        [-du [-s] [-h] [-x] <path> ...]
        [-expunge]
        [-find <path> ... <expression> ...]
        [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
        [-getfacl [-R] <path>]
        [-getfattr [-R] {-n name | -d} [-e en] <path>]
        [-getmerge [-nl] <src> <localdst>]
        [-help [cmd ...]]
        [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]]
        [-mkdir [-p] <path> ...]
        [-moveFromLocal <localsrc> ... <dst>]
        [-moveToLocal <src> <localdst>]
        [-mv <src> ... <dst>]
        [-put [-f] [-p] [-l] <localsrc> ... <dst>]
        [-renameSnapshot <snapshotDir> <oldName> <newName>]
        [-rm [-f] [-r|-R] [-skipTrash] <src> ...]
        [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
        [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
        [-setfattr {-n name [-v value] | -x name} <path>]
        [-setrep [-R] [-w] <rep> <path> ...]
        [-stat [format] <path> ...]
        [-tail [-f] <file>]
        [-test -[defsz] <path>]
        [-text [-ignoreCrc] <src> ...]
        [-touchz <path> ...]
        [-usage [cmd ...]]
- hadoop fs -ls/ 查看文件列表
 - 上传文件到HDFS
    
- hadoop fs -copyFromLocal LICENSE.txt / 上传文件
 - hadoop fs -moveFromLocal LICENSE.txt / 上传文件,本地的就没了
 - hadoop fs -put ReadMe.md / 将ReadMe.md文件上传到HDFS的根目录
 
 - 下载文件
    
- hadoop fs -get /ReadMe.md
 - hadoop fs -getmerge /hdfs-test ./t.txt 把几个文件和成一个文件下载
 
 - hadoop fs -cat /ReadMe.md 读取根目录下的ReadMe.md文件(/ 不能少)
 - hadoop fs -text /ReadMe.md 读取
 - hadoop fs -mkdir /hdfs-test 创建目录
 - hadoop fs -mv /ReadMe.md /hdfs-test
 - hadoop fs -cp /hdfs-test/README.txt /hdfs-test/ReadMe.txt_back 拷贝文件
 - hadoop fs -rm / 删除单个文件
 - hadoop fs -rmdir /hdfs-test 删除不为空的目录
 - hadoop fs -rmr /hdfs-test = hadoop fs -rm -rf /hdfs-test 删除目录
 - hadoop fs -ls -R /hdfsapi/test 递归展示下面所有文件及文件夹
 - hadoop fs -ls == hadoop fs -ls /usr/hadoop/
 - HDFS存储扩展
    
- 1file ==> 1…n block ==> 存放在不同的节点上
 - 文件存放目录(/home/hadoop/app/tmp/dfs/data/current/BP-1458152468-127.0.0.1-1559113660087/current/finalized/subdir0/subdir0)
 - 将所有的块按照顺序打包下来 cat block001 testfile, cat blockoo1 testfile… 后续testfile是一个完整的文件