小编给大家分享一下NameNode有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
创新互联公司专业为企业提供巴林左旗网站建设、巴林左旗做网站、巴林左旗网站设计、巴林左旗网站制作等企业网站建设、网页设计与制作、巴林左旗企业网站模板建站服务,10余年巴林左旗做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
一 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有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!