暑假周进度报告(四)

HDFS体系结构java

 

 

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

HDFS存储原理:编程

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

数据保存策略的问题:函数

1)oop

 

 

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

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

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

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

 

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上是否存在某个文件