C语言学习网

NameNode有什么用

发表于:2022-08-19 作者:安全数据网编辑
编辑最后更新 2022年08月19日,小编给大家分享一下NameNode有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一 NameNode的作用Name

小编给大家分享一下NameNode有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一 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);}

以上是"NameNode有什么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0