分布式文件系统HDFS简介
两大核心技术:
分布式存储
分布式处理
文件系统结构
HDFS自身的局限性
1:不适合低延迟数据访问
2.无法高效存储大量小文件
3.不支持多用户写入及任意修改文件
HDFS实现目标
HDFS相关概念
HDFS采用这种抽象的块的概念设计好处
元数据
为什么要这样设计
名称节点
FsImage
HDFS存储原理
由于采用的是低廉成本机器进行存储,所以会不断的出故障。
基于这种情况,就必须要冗余数据,保存
冗余存储这种设计的好处:
01.加快数据传输速度
02.很容易检查数据错误
03保存数据可靠性
块拿到手后如何进行分布式存储:
第一副本:优先放在磁盘不太满,CPU不太忙的节点
第二副本:放在和第一个副本不同的节点
第三副本:放在第一副本相同的节点的机架上
数据读取
HDFS提供一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
当客户端读取数据时,从名称节点获取数据块不同副本的存储位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相对应的优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据。
数据的错误和恢复
1.名称节点出错
FsImage
EditLog
2.数据节点出错
(1)如何判断出错
数据节点会定期向名称节点发送信息
3.数据出现错误
(1)如何判断出错
校验码校验,客户端每写一个文件,就会为这个文件写一个校验码,保存在同一个文件下
校验不一致,则说明数据错误和恢复,进行冗余的复制
HDFS读取过程
pubic static void main(String[] args){
try{
Configuration conf=new Configuration();
FileSystem fs=FileSystem.get(conf);
Path filename=new Path("hdfs://localhost:9000/user/hadoop/test.txt");
FSDataInputStream is=fs.open(filename);
BufferdReader d =new BufferedReader(new InputStreamReader(is));
String context=d.readLine();//读取文件一行
System.out.println(content);
d.close();//关闭文件
fs.clpse();//关闭hdfs
}catch(Exception e){
e.printStackTrace();
}
}
FileSystem
第一步:打开文件
FileSystem fs=FileSystem.get(conf);
第二步:获取数据块信息
FileSystem fs=FileSystem.get(conf);
第三步:读取信息
Path filename=new Path("hdfs://localhost:9000/user/hadoop/test.txt");
第四步:读取数据
FSDataInputStream is=fs.open(filename);
第五步:获取数据块信息
通过ClientProtocal.getBlockLocations()查找下一个数据块
BufferdReader d =new BufferedReader(new InputStreamReader(is));
第六步:读取数据
String context=d.readLine();//读取文件一行
第七步:关闭文件
d.close();//关闭文件
fs.clpse();//关闭hdfs
HDFS写数据过程
第一步:创建文件请求
第二步:创建文件元数据
第三步:写入数据
第四步:写入数据包
第五步:接受确认包
第六步:关闭文件
第七步:写操作完成
HDFS编程实践
HDFS的基本编程方法
Hadoop中常用的三种命令
hadoop fs的三个常用指令
注意本地文件与分布式文件是不同的
除了使用命令来控制,还可以使用网页来管理文件
利用JavaApi和HDFS交互
编写代码