关于HDFS
- 解决海量数据的分布式存储
- 分布式文件系统
- 需要借助于海量的计算机集群
- 主节点:元数据服务
- 从节点:完成存储任务
- 实现目标
- 兼容廉价的硬件设施
- 实现流数据读写
- 支持大数据集
- 支持简单的文件模型
- 强大的平台兼容性
- 自身局限性
- 不适合低延迟数据访问
- 无法高效存储小数据
- 不支持多用户写入以及任意读写文件
- 相关概念
-
块
- 为了分摊磁盘读写开销
- 比普通的文件系统的块要大得多
- 支持现象大规模数据存储
- 减低分布式节点的寻址开销
- 缺点
- 会导致MapReduce只有几个任务执行,降低了并行性
- 好处
- 支持大规模文件存储
- 简化系统设计
- 适合数据备份
-
名称节点(主节点)NameNode
- 整个集群的管家:记录了各个数据块存储位置
- 结构
-
FsImage
- 保存系统文件树
- 文件的复制等级
- 修改和访问时间
- 访问权限
- 块的大小以及组成文件的块
- 具体操作过程
- 保存系统文件树
-
EditLog
- 记录数据的存储删除等
-
FsImage的规模太大:每次发生数据会很大规模,所以只将更新部分存储到EditLog中。
-
第二名称节点:定期和名称节点通信,当EditLog过大时名称节点停止使用EditLog,并产生edits.new新节点。
- 解决EditLog不断增大的过程
- 冷备份
-
-
数据节点 DataNode
- 负责存储节点
- 每个数据节点都会被保存到各自本地Linux文件系统中去
-
体系结构
-
目录结构
-
结构局限性
- 命名空间限制:所有元数据都是保存在内存中去,所能存储的文件规模有上线
- 性能会受到单个名称节点的限制
- 隔离问题:只有一个命名空间,不能对不同应用程序进行隔离
- 一旦一个节点发生故障,整个都不可用
存储原理
- 出故障是常态
- 每个数据都被冗余保存
- (冗余副本)优点
- 加快数据传输速度:多台机器并行
- 很容易检查数据错误:多个副本参照
- 保证数据可靠性:会自动复制新的副本
- 数据读取
- 提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
- 优先选取最近节点(同一机架)读取数据
- 错误和恢复
- 名称节点出错
- 会将数据从第二节点的冷备份中恢复数据,此时会停运一段时间
- 数据节点出错
- 不断发送心跳信息
- 接收不到之后会被名称节点标记不可用
- 此时将正常备份数据重新复制
- 可以调整冗余备份数据的具体存放位置
- 数据本身出错
- 校验码校验:客户端读取数据时使用
- 创建文件数据时创建校验码
- 名称节点出错
读取数据过程
- 打开文件
- 获取数据块信息
- 读取请求
- 读取数据
- 获取数据块信息
ClientProtocal.getBlockLocation();
- 读取数据 -> 完成
- 关闭文件
写数据过程
- 创建文件请求
- 创建文件元数据
- 写入数据
- 写入数据包:流水线复制
- 接受确认包:由最后一个数据包逐次向前传递
- 写操作完成
基本编程方法
- 常用Shell命令和JavaAPI
- 启动
$ cd /usr/local/hadoop
$ ./bin/hdfs namenode -format # 格式化hdfs文件系统
$ ./sbin/start-dfs.sh # 启动
$ start-all
- 常用命令
hadoop fs
适用于不同的文件系统,适用于HDFShadoop dfs
只适用于HDFShdfs dfs
只适用于HDFSls
显示详细信息mkdir
创建相关文件夹cat
显示相关文件内容hadoop -cp fileurl1 fileurl2
从本地复制到HDFS文件系统中去hadoop -put fileurl1 fileurl2
上传- 使用url链接可以直接访问文件
- 利用Java API交互
- 基本的Hadoop common jar包在/usr/local/hadoop/share/hadoop/
- 配置文件放置到Java工程目录下(安装软件的bin目录)
// 测试:HDFS中是否存在某个文件
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path
public class ThreePss {
public static void main(String[] args) {
try {
String filename = "hdfs://localhost:9000/user/hadoop/test.txt";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
if(fs.exists(new Path(filename))) {
System.out.println("文件存在");
} else {
System.out.println("文件不存在");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
# 可以直接使用shell命令查询
测验
- HDFS命名空间包括了块、存储的目录以及对应文件
- IoT协议是物联网协议,HDFS构建在TCP/IP协议
- 客户端通过一个可以配置的端口向NameNode主动发起TCP连接,并使用客户端协议与名称节点进行交互
- 名称节点和数据节点之间则使用数据节点协议进行交互
- 客户端和数据节点的交互式通过RPC(Remote Procedure Call)来实现的
- 启动关闭Hadoop是
start-dfs.sh
和stop-dfs.sh
- 补充(NameNode作为中心服务器,负责管理文件系统的命名空间和客户端对文件的访问