HDFS的exists函数解析
2019獨角獸企業重金招聘Python工程師標準>>>
在上傳一個文件時,需要判斷文件是否存在于HDFS中,這是通過向namenode節點發請求得到的。
那么,namenode如何判斷一個文件是否存在于文件系統中呢?
------------------------
/**
?????*/
????public?boolean?exists(String?src)?throws?IOException?{
????????return?namesystem.exists(new?UTF8(src));//直接調用namesystem.
????}
?那下面我們來看看namesystem是如何來判斷的。
?
public?boolean?exists(UTF8?src)?{
????????if?(dir.getFile(src)?!=?null?||?dir.isDir(src))?{
????????????return?true;//從這可以看到,要么確實存在,如果不存在且是目錄也可以。
????????}?else?{
????????????return?false;
????????}
????}
先分析getFile(...)函數。
-----------------------------------------
?
public?Block[]?getFile(UTF8?src)?{
????????waitForReady();
????????synchronized?(rootDir)?{
????????????INode?targetNode?=?rootDir.getNode(src.toString());//獲取節點
????????????if?(targetNode?==?null)?{
????????????????return?null;//節點不存在
????????????}?else?{
????????????????return?targetNode.blocks;//節點存在,返回文件塊信息
????????????}
????????}
????}
?----------繼續分析getNode
?
INode?getNode(String?target)?{
????????????if?(!?target.startsWith("/")?||?target.length()?==?0)?{
????????????????return?null;//路徑是否規范
????????????}?else?if?(parent?==?null?&&?"/".equals(target))?{
????????????????return?this;//是否為根目錄
????????????}?else?{
????????????????Vector?components?=?new?Vector();
????????????????int?start?=?0;
????????????????int?slashid?=?0;
????????????????while?(start?<?target.length()?&&?(slashid?=?target.indexOf('/',?start))?>=?0)?{
????????????????????components.add(target.substring(start,?slashid));
????????????????????start?=?slashid?+?1;
????????????????}
????????????????if?(start?<?target.length())?{
????????????????????components.add(target.substring(start));
????????????????}
????????????????return?getNode(components,?0);//開啟遞歸查找模式
????????????}
????????}
?---------
?INode?getNode(Vector?components,?int?index)?{
????????????if?(!?name.equals((String)?components.elementAt(index)))?{
????????????????return?null;//當前INode的名字是否OK?
????????????}
????????????if?(index?==?components.size()-1)?{
????????????????return?this;//已經到了最后一個item
????????????}
????????????//?Check?with?children
????????????INode?child?=?(INode)?children.get(components.elementAt(index+1));//根據文件名從children中查找對應INode,然后再遞歸查找
????????????if?(child?==?null)?{
????????????????return?null;
????????????}?else?{
????????????????return?child.getNode(components,?index+1);
????????????}
????????}
-------------好,然后分析isDir函數
?
public?boolean?isDir(UTF8?src)?{
????????synchronized?(rootDir)?{
????????????INode?node?=?rootDir.getNode(normalizePath(src));
????????????return?node?!=?null?&&?node.isDir();
????????}
????}
這個就比較簡單了,直接查看INode的block是否為NULL.
---從以上代碼能分析出哪些結論?
1每個INode有個name
2 成員Block[] blocks記錄了文件的塊位置信息,如果沒有則是目錄
3 子INode信息存在TreeMap中,映射關系是(name,INode).
好,為后續分析提供了堅實的基礎!
轉載于:https://my.oschina.net/qiangzigege/blog/357591
總結
以上是生活随笔為你收集整理的HDFS的exists函数解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RC6遥控协议
- 下一篇: 通过案例学调优之--Oracle Clu