文档章节

NameNode总结

sunt99
 sunt99
发布于 2016/07/31 11:20
字数 944
阅读 9
收藏 0

一 NameNode的作用

     NameNode是文件系统的大脑,管理文件的命名空间以及对集群中文件的访问,存储着元数据。保存的最重要的两个映射:文件名&数据块(保存在磁盘上,持久化的)  ,数据块&DateNode列表(NameNode不保存,是通过DataNode传递的)。

    NameNode 与客户端,DataNode,NameNode之间都可以通信,分别通过实现ClientProtocol,DataNodeProtocol和NameNodeProtocol接口。

二 文件读写过程分析

   1 文件读取过程

       首先客户端使用FileSystem.open()函数打开文件,DistributedFileSystem使用RPC与NameNode通信,得到文件的数据块信息,对于每一个数据块,元数据返回的是保存该数据块的数据节点的地址。

        然后DistributedFileSystem 返回FSDataInputStream 给客户端用来读取数据,客户端调用Stream的read()方法开始读取数据。

        DFSInputSteam连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端,当数据块读取完毕,DFSInputStream关闭与此数据节点的连接,连接下一个数据块的最近的数据节点。当所有节点读取完毕,调用FSDataInputSteam的close函数关闭。

      在读取过程中,如果客户端在与数据节点的通信中,出现错误,则直接读取下个节点,并将此节点记录下来。

   2 文件写入过程

      首先客户端调用create()方法创建文件,DistributedFileSystem调用RPC与NameNode通信,传达客户端要新建一个文件,元数据节点检查命名空间,确定文件原来不存在,并且客户端有创建文件的权限,然后在创建文件。返回DFSOutputStream,使得客户端写入数据。

      DFSOutputStream 将数据分成块,写入data queue,因为数据的写入是流式的,data queue 由Data Stream 读取,并通知其他的数据块(假设默认复制3块),分配的数据节点放在一个pipeline里。

     Data Streamer将数据块写入pipeline中的第一个数据节点,第一个数据节点又将数据块写入第二个数据节点,第二个数据节点将数据写入第三个数据节点。DFSOutput Stream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据写入成功。如果数据节点在写入过程中失败,关闭pipeline,将ack queue 中的数据块放入data queue 的开始。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中另外的两个数据节点。元数据则被通知,复制块数目不足,将会创建第三份备份。

   当客户端结束写入数据,则调用stream的close()函数

 

三   java API 对文件的基本操作

1 FileSystem类(开启文件系统)


Configuration conf=new Configuration();//获取配置信息
FileSystem fs=FileSystem.get(URI.create(uri),conf);//得到地址
InputStream input=null;
input=fs.open(new Path(uri));
IOUtils.copyBytes(input,System.out,4096,false);//读取文件,打印出来
IOUtils.closeStream(input);

2 FileStatus类(查看文件状态)

//查看HDFS中文件或者目录的元信息。
FileStatus fstus=fs.getFileStatus(new Path(uri));
fstus.getPath();//得到文件路径
fstus.getLen(); //得到文件长度
fstus.ModificationTime()//得到最新修改时间
fstus.getReplication()//得到文件备份树
fstus.getOwner()//得到文件拥有者

3 BlockLocation(查看数据块的位置)

//查找某个文件Block在HDFS集群的位置。
FileStatus fstus=fs.getFileStatus(new Path(uri));
BlockLocation []block=fs.getFileBlockLocations(fstus,0,fstus.getLen));

4 查看文件是否存在

//列出HDFS下的所有文件。检查是否存在,使用exist()方法。
Path []paths=new Path[args.length];
FileStatus fstus=fs.listStatus(paths);
Path []listedPaths=FileUtil.stat2Paths(fstus);
for(Path p:listedPaths){
       System.out.println(p);
}

 

© 著作权归作者所有

上一篇: DataNode总结
sunt99
粉丝 0
博文 7
码字总数 6398
作品 0
沈阳
程序员
私信 提问
恢复hdfs的namenode

最近公司因为断电之前没有关闭Hadoop集群,造成数据丢失,namenode坏了,无法启动,所以我尝试恢复。 方法一:使用hadoop namenode -importCheckpoint 1、删除name目录: 1 [hadoop@node1 hd...

choulanlan
2017/05/18
0
0
hadoop的两大核心之一:HDFS总结

hadoop的两大核心之一 海量数据的存储(HDFS) 什么是HDFS? hadoop distributed file system(hadoop分布式文件系统) 是一种允许文件通过网络在多台主机上分享的文件系统, 可让多机器上的多用户...

迪allen
2014/03/25
1K
0
Hadoop 1.x与Hadoop 2.x的区别

最近看了某大神的博客,非常详细地描述了关于Hadoop 1.x与Hadoop 2.x的区别和改进,博客原文链接如下: http://www.cnblogs.com/edisonchou/p/4470682.html 看了博客之后,自己简单总结概述了...

edwardGe
2018/07/03
48
0
大数据教程(6.7)第六章问题总结

本篇博主将介绍大家中学习前面的hadoop文章中可能出现的问题。 首先,可能涉及的命令: 一、运行mr程序出错 二、初始化工作目录结构 hdfs namenode -format 只是初始化了namenode的工作目录,...

em_aaron
2018/11/06
22
0
深刻理解HDFS工作机制

 深入理解一个技术的工作机制是灵活运用和快速解决问题的根本方法,也是唯一途径。对于HDFS来说除了要明白它的应用场景和用法以及通用分布式架构之外更重要的是理解关键步骤的原理和实现细节...

张涛泽
2017/04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
4
0
JAVA 利用时间戳来判断TOKEN是否过期

import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;/** * @descri......

huangkejie
昨天
4
0
分页查询

一、配置 /*** @author beth* @data 2019-10-14 20:01*/@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ ......

一个yuanbeth
昨天
6
0
在LINQPad中使用Ignite.NET

LINQPad是进行.NET开发的一款优秀工具,非常有利于Ignite.NET API的快速入门。 入门 下载LINQPad:linqpad.net/Download.aspx,注意要选择64位操作系统的AnyCPU版本; 安装Ignite.NET的NuGet...

李玉珏
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部