HDFS的实现目标
- 兼容廉价的硬件设备
- 实现流数据的读写
- 支持大数据集
- 支持简单的文件模型
- 强大的跨平台兼容性
HDFS的局限性
- 不适合低延迟数据访问,不支持实时性的访问数据
- 无法高效存储大量的小文件,小文件越多,搜索耗时越大
- 不支持多用户写入,以及任意修改文件,只允许追加不允许修改
HDFS相关概念
块
- 与普通文件系统中的块的联系:都是为了分摊磁盘读写开销,也就是在大量数据间分摊磁盘寻址的开销
- 与普通文件系统中的块的区别:HDFS的块比普通的文件块要大得多,普通的文件系统的块有几千个字节,而HDFS中的块有64MB或128MB。这样设计可以支持面向大规模的数据存储和降低分布式节点的寻址开销
- HDFS采用这种块的好处
1. 支持大规模文件存储
2. 简化系统设计
3. 适合数据备份
名称节点NameNode
主节点,相当于整个HDFS集群的管家,负责元数据的存储。相当于一个数据目录,记录哪些块被存储在哪些机器上。
- 元数据
- 文件是什么
- 文件被分成多少块
- 每个块和文件时怎么映射的
- 每个块被存储在哪台服务器上
-
Fsimage,保存系统文件树
-
EditLog,记录对数据进行的创建、删除、重命名等操作
数据节点
数据节点是分布式文件系统HDFS的工作节点,负责具体数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表,每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中
HDFS的存储原理
冗余数据的保存
因为廉价的PC机容易故障,所有需对块进行冗余保存,一般冗余值默认保存3份
好处
- 加快数据传输速度,应用可以并行操作
- 容易检查数据错误,对照寻错
- 保证数据可靠性
数据存取策略
- 数据存放
- 第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
- 第二个副本:放置在与第一个副本不同的机架的节点上
- 第三个副本:与第一个副本相同机架的其他节点上
- 更多副本:随机节点
- 数据读取
- HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
- 当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据
数据错误与恢复
- 名称节点出错:先暂停服务,从SecondaryNameNode中FsImage和Editlog进行恢复
- 数据节点出错: 当数据节点发生故障,名称节点就无法收到来自数据节点的心跳信息,这时,该数据节点就会被标记为“宕机”,节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它发送任何I/O请求。名称节点会将故障机上的数据备份到正常的机器上去,HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置
- 数据本身出错:通过比对校验码探测到数据是否出错,校验码是每次写入文件时保存的
HDFS常用命令
有三种shell命令方式。
- hadoop fs ,适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
- hadoop dfs,只能适用于HDFS文件系统
- hdfs dfs,也只能适用于HDFS文件系统
先转到Hadoop的安装目录下
- 创建多级目录
./bin/hdfs dfs -mkdir -p /usr/hadoop
- 查看目录下的内容
./bin/hdfs dfs -ls /
- 删除目录
./bin/hdfs -rm -r /input
-r表示删除子目录 - 向HDFS上传文件
./bin/hdfs dfs -put ~/test.txt input
使用的相对路径,上传至HDFS上的input目录下 - 从HDFS上下载文件
./bin/hdfs dfs -get input/test.txt /usr/local
- 查看将HDFS中的文件内容
./bin/hdfs dfs -cat input/test.txt
- HDFS上文件的拷贝
./bin/hdfs dfs -cp input/test.txt /input
将/usr/hadoop//input/test.txt 拷贝到/input中 - HDFS上文件的移动
./bin/hdfs dfs -mv /usr/hadoop/test.txt /input
- 复制本地文件到HDFS
./bin/hdfs dfs -copyFromLocal /usr/local input/test.txt