分布式文件系统HDFS简介

两大核心技术:

分布式存储

分布式处理

Hadoop专栏(一)———分布式文件系统HDFS_数据

文件系统结构

Hadoop专栏(一)———分布式文件系统HDFS_数据库_02


HDFS自身的局限性

1:不适合低延迟数据访问

2.无法高效存储大量小文件

3.不支持多用户写入及任意修改文件

Hadoop专栏(一)———分布式文件系统HDFS_hdfs_03


HDFS实现目标

Hadoop专栏(一)———分布式文件系统HDFS_分布式_04

HDFS相关概念

HDFS采用这种抽象的块的概念设计好处

Hadoop专栏(一)———分布式文件系统HDFS_数据_05


元数据

Hadoop专栏(一)———分布式文件系统HDFS_hdfs_06


为什么要这样设计

Hadoop专栏(一)———分布式文件系统HDFS_数据库_07


名称节点

Hadoop专栏(一)———分布式文件系统HDFS_数据_08

Hadoop专栏(一)———分布式文件系统HDFS_hadoop_09


FsImage

Hadoop专栏(一)———分布式文件系统HDFS_数据_10

HDFS存储原理

由于采用的是低廉成本机器进行存储,所以会不断的出故障。
基于这种情况,就必须要冗余数据,保存

冗余存储这种设计的好处:

01.加快数据传输速度

02.很容易检查数据错误

03保存数据可靠性

块拿到手后如何进行分布式存储:

第一副本:优先放在磁盘不太满,CPU不太忙的节点

第二副本:放在和第一个副本不同的节点

第三副本:放在第一副本相同的节点的机架上

Hadoop专栏(一)———分布式文件系统HDFS_hadoop_11


数据读取

HDFS提供一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID

当客户端读取数据时,从名称节点获取数据块不同副本的存储位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相对应的优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据。

数据的错误和恢复

1.名称节点出错

FsImage

EditLog

Hadoop专栏(一)———分布式文件系统HDFS_数据_12

2.数据节点出错

(1)如何判断出错

数据节点会定期向名称节点发送信息

Hadoop专栏(一)———分布式文件系统HDFS_数据库_13

3.数据出现错误

(1)如何判断出错

校验码校验,客户端每写一个文件,就会为这个文件写一个校验码,保存在同一个文件下

校验不一致,则说明数据错误和恢复,进行冗余的复制

Hadoop专栏(一)———分布式文件系统HDFS_hdfs_14

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

Hadoop专栏(一)———分布式文件系统HDFS_hadoop_15

Hadoop专栏(一)———分布式文件系统HDFS_hadoop_16


第一步:打开文件

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写数据过程

Hadoop专栏(一)———分布式文件系统HDFS_数据库_17


第一步:创建文件请求

第二步:创建文件元数据

第三步:写入数据

第四步:写入数据包

第五步:接受确认包

第六步:关闭文件

第七步:写操作完成

HDFS编程实践

HDFS的基本编程方法

Hadoop专栏(一)———分布式文件系统HDFS_hadoop_18


Hadoop中常用的三种命令

Hadoop专栏(一)———分布式文件系统HDFS_hadoop_19


hadoop fs的三个常用指令

Hadoop专栏(一)———分布式文件系统HDFS_数据_20


注意本地文件与分布式文件是不同的

Hadoop专栏(一)———分布式文件系统HDFS_数据_21


除了使用命令来控制,还可以使用网页来管理文件

Hadoop专栏(一)———分布式文件系统HDFS_hadoop_22


利用JavaApi和HDFS交互

Hadoop专栏(一)———分布式文件系统HDFS_hdfs_23


编写代码

Hadoop专栏(一)———分布式文件系统HDFS_hdfs_24