暑假周进度报告(四)

HDFS体系结构

 冷备份:发生故障以后,先停止一段时间,把一些数据从第二名称节点慢慢恢复过来,恢复过来后再提供对外服务。

HDFS存储原理:

冗余数据保存的问题:一个数据块会被默认保存3份(可并行操作同一数据,加快数据传输速度;很容易检查数据错误,有参照;保证数据可靠性)

数据保存策略的问题:

1)

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

数据恢复的问题:名称节点出错通过第二名称节点冷备份恢复

数据节点出错:当隔了一个周期,名称节点收不到数据节点的心跳信息以后,知道这个数据节点发生了故障,将此数据节点结点标记为宕机即不可用,把凡是存储在故障机上的数据,重新复制分发到其他正常可用的机器上(所有数据冗余备份,冗余数据位置可以不断变化)

数据出错:校验码不对不一致,进行恢复,进行冗余副本的再次复制

HDFS数据读写过程

FileSystem是一个通用文件系统的抽象基类,可以被分布式文件系统继承,所有可能使用Hadoop文件系统的代码,都要使用这个类 Hadoop为FileSystem这个抽象类提供了多种具体实现 DistributedFileSystem就是FileSystem在HDFS文件系统中的具体实现 FileSystem的open()方法返回的是一个输入流FSDataInputStream对象,在HDFS文件系统中,具体的输入流就是DFSInputStream;FileSystem中的create()方法返回的是一个输出流FSDataOutputStream对象,在HDFS文件系统中,具体的输出流就是DFSOutputStream。

Configuration conf = new Configuration();                          conf.set("fs.defaultFS","hdfs://localhost:9000");                        conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
FSDataInputStream in = fs.open(new Path(uri));
FSDataOutputStream out = fs.create(new Path(uri));

  读数据的过程

第一步打开文件,创建输入流FSDataInputStream,FSDataInputStream in = fs.open(new Path(uri));URI就是你输入的文件地址。例如:hdfs://localhost:9000,文件打开以后生成了输入流FsDataInputStream,输入流里面封装了DFSInputStream(真正跟名称节点打交道),用户客户端编程只跟前面的FsDataInputStream打交道,不会去访问DFSInputStream.

第二步,DFSInputStream会和名称节点进行沟通,通过远程过程调用去沟通(获得所需要的数据块被保存到哪些名称节点)通过ClientProtocal.getBlockLocations() 查找下一个数据块。拿到数据位置。

第三步:读取请求,输入流中执行read函数,选择距离客户端最近的数据节点去建立连接,然后去读数据。

第四步:读取数据(把数据从数据节点读到客户端)。读完这个输入流以后,FsDataInputStream要关闭和数据节点的连接。

按顺序循环依次完成所有数据块的读写

第五步:查找下一个数据块(等同于第二步)

第六步读取数据(等同于第四步)

第七步:关闭文件,调用输入流的关闭操作close

  写数据的过程

1.创建文件请求,客户端打算向HDFS写入数据,用FileSystem实例化一个对象fs(fs类型是DistributedFileSystem)创建一个输出流,FsDataOutputStream,创建完以后,Hadoop会封装一个DFSOutputStream(专门和名称节点打交道)

2.询问名称节点,创建文件元数据。DFSOutputStream要执行RPC远程调用,去访问名称节点,让名称节点在文件系统的命名空间中新建一个文件,名称节点不会直接去创建文件,先做一些检查,检查这个文件是否已经存在,还有检查客户端是否有权限创建这个文件。两个检查都通过,则名称节点就会创建这个文件。

3.往里写数据。通过输出流,流水线复制,把整个数据分成一个个分包,这些分包会被放在DFSOutputStream这个对象的内部队列,放上去以后DFSOutputStream就向名称节点去申请保存这些数据块的数据节点

4.申请到以后,写入数据包。分包先发到第一个数据节点,第一个数据节点再发到第二个数据节点,第二个数据节点再发到第三个数据节点,以此类推,完成流水线复制

5.接受确认包,确认包由最后一个数据节点依次往前传到客户端,客户端收到时都已经写入完成了

6.完成以后关闭文件

FileSystem是个抽象基类,具体实现:在HDFS中实现为DistributedFileSystem子类

 启动Hadoop:1.cd /usr/local/hadoop

2../sbin/start-dfs.sh

3.jps判断是否成功启动

4.关闭Hadoop./sbin/stop-dfs.sh

备注:Hadoop中有三种Shell命令方式:

hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统

hadoop dfs只能适用于HDFS文件系统

hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统

fs命令可以说是HDFS最常用的命令 利用该命令可以查看HDFS文件系统的目录结构、上传和下载数据、 创建文件等。

该命令的用法为: hadoop fs [genericOptions] [commandOptions]

hadoop fs -ls <path>:显示<path>指定的文件的详细信息

hadoop fs -mkdir <path>:创建<path>指定的文件夹

hadoop fs -cat <path>:将<path>指定的文件的内容输出到标准输出

hadoop fs -cp 本地文件路径 HDFS路径 将文件从本地拷贝上传到HDFS中。

实例:分布式文件系统HDFS上是否存在某个文件

原文地址:https://www.cnblogs.com/zzstdruan1707-4/p/11482332.html