温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

NameNode有什么用

发布时间:2021-12-30 10:22:33 来源:亿速云 阅读:212 作者:小新 栏目:云计算

小编给大家分享一下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有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI