久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

HDFS中create函數的作用是什么

HDFS中create函數的作用是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

成都創新互聯公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網站設計制作、成都網站設計、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的香坊網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

client通過exists()函數得知目前的namenode那邊不存在此文件后,

則通過namenode.create函數創建一個文件。具體細節如下:

 這里意味著:clientMachine的clientName創建了src文件。

clientMachine只用來選擇目標DataNode.

public LocatedBlock create(String src, String clientName, String clientMachine, boolean overwrite) throws IOException {

        Object results[] = namesystem.startFile(new UTF8(src), new UTF8(clientName), new UTF8(clientMachine), overwrite);//調用文件系統的startFile函數,返回值為block信息和目標datanode信息

        if (results == null) {

            throw new IOException("Cannot create file " + src + " on client " + clientName);

        } else {

            Block b = (Block) results[0];//取回block

            DatanodeInfo targets[] = (DatanodeInfo[]) results[1];//獲取DatanodeInfo數組信息

            return new LocatedBlock(b, targets);//組合返回最終信息 

        }

    }

====================================

下面開始學習

public synchronized Object[] startFile(UTF8 src, UTF8 holder, UTF8 clientMachine, boolean overwrite) {

 對此函數的分析如下:

public synchronized Object[] startFile(UTF8 src, UTF8 holder, UTF8 clientMachine, boolean overwrite) {

//背景知識:參數有holder和clientMachine.比如一個例子如下:

Holder:DFS_CLIENT_xxxx

clientMachine:Machine66.

也就是說一個clientMachine上面可以有多個Holder.

一個clientMachine上的Holder發出了一個上傳的請求。

下面的代碼中哪里用到了holder和哪里用到了clientMachine,

還請讀者自己注意思考。

        Object results[] = null;

        if (pendingCreates.get(src) == null) {//說明pendingCreates記錄了正在創建的文件

            boolean fileValid = dir.isValidToCreate(src);//文件路徑也確實不存在,需要這一句嗎?

            if (overwrite && ! fileValid) {//如果可以覆蓋的話,目前都是不可以覆蓋

                delete(src);

                fileValid = true;

            }

            if (fileValid) {//確實可以的話,繼續執行

                results = new Object[2];//創建返回結果的數組

                // Get the array of replication targets 

                DatanodeInfo targets[] = chooseTargets(this.desiredReplication, null, clientMachine);

//根據clientMachine和備份數目選擇多個目標datanode

                if (targets.length < this.minReplication) {

                    LOG.warning("Target-length is " + targets.length +

                        ", below MIN_REPLICATION (" + this.minReplication+ ")");

                    return null;

                }//如果長度達不到備份數,則返回失敗

                // Reserve space for this pending file

                pendingCreates.put(src, new Vector());//表明這個文件正在create!!!

                synchronized (leases) {//開始處理租約系統

                    Lease lease = (Lease) leases.get(holder);//查找租約系統

                    if (lease == null) {//如果不存在

                        lease = new Lease(holder);//創建

                        leases.put(holder, lease);//存儲到leases

                        sortedLeases.add(lease);//存儲到sortedLeases

                    } else {//如果存在的話,則lease本身刷新時間且重新加入到sortedLeases.

//注意,這里有一個sort過程。

                        sortedLeases.remove(lease);

                        lease.renew();

                        sortedLeases.add(lease);

                    }

                    lease.startedCreate(src);//lease的本身creates保存了文件名

                }

                // Create next block

                results[0] = allocateBlock(src);//主要是記錄文件對應的Block信息

                results[1] = targets;//分配的datanode信息

            } else { // ! fileValid

              LOG.warning("Cannot start file because it is invalid. src=" + src);

            }

        } else {

            LOG.warning("Cannot start file because pendingCreates is non-null. src=" + src);

        }

        return results;//返回結果!

    }

 -------------------------------------------------------------

DatanodeInfo[] chooseTargets(int desiredReplicates, TreeSet forbiddenNodes, UTF8 clientMachine) {

        TreeSet alreadyChosen = new TreeSet();//初始化空的已經選擇的機器

        Vector targets = new Vector();//真的無語。這里為啥還要再創建一個targets,浪費內存,直接傳到chooseTarget一樣的好吧!崩潰!

        for (int i = 0; i < desiredReplicates; i++) {//根據備份數來選擇執行次數

            DatanodeInfo target = chooseTarget(forbiddenNodes, alreadyChosen, clientMachine);//選擇單個機器

            if (target != null) {//選擇好了一個,就加到targets和alreadyChosen.崩潰,加2次有啥意思!??!

                targets.add(target);

                alreadyChosen.add(target);

            } else {

                break; // calling chooseTarget again won't help

            }

        }

        return (DatanodeInfo[]) targets.toArray(new DatanodeInfo[targets.size()]);//返回執行的結果

    }

---------------

=======================

DatanodeInfo chooseTarget(TreeSet forbidden1, TreeSet forbidden2, UTF8 clientMachine) {

        //

        // Check if there are any available targets at all

        //

        int totalMachines = datanodeMap.size();//獲取當前已知的所有數據節點個數

        if (totalMachines == 0) {//為0就不用說了,返回null

            LOG.warning("While choosing target, totalMachines is " + totalMachines);

            return null;

        }

        //

        // Build a map of forbidden hostnames from the two forbidden sets.

        //

        TreeSet forbiddenMachines = new TreeSet();

        if (forbidden1 != null) {//這里forbidden1是初始化禁止的節點,此處為null

            for (Iterator it = forbidden1.iterator(); it.hasNext(); ) {

                DatanodeInfo cur = (DatanodeInfo) it.next();

                forbiddenMachines.add(cur.getHost());

            }

        }

        if (forbidden2 != null) {//是已經選擇的節點,因為已經選擇的就不會再返回了,你懂的

            for (Iterator it = forbidden2.iterator(); it.hasNext(); ) {

                DatanodeInfo cur = (DatanodeInfo) it.next();

                forbiddenMachines.add(cur.getHost());

            }

        }

        //

        // Build list of machines we can actually choose from

        //

        Vector targetList = new Vector();//從總的節點中去掉不可以選擇的節點,得到剩下的可選的節點

        for (Iterator it = datanodeMap.values().iterator(); it.hasNext(); ) {

            DatanodeInfo node = (DatanodeInfo) it.next();

            if (! forbiddenMachines.contains(node.getHost())) {

                targetList.add(node);

            }

        }

        Collections.shuffle(targetList);//本來不知道干嘛的,百度了一下,用來洗牌的

       //為啥?因為DFSShell采用計算機組成原理的菊花鏈的方式來上傳數據。剩下的我就不用解釋了

        //

        // Now pick one

        //

        if (targetList.size() > 0) {//如果還剩下確實可以選擇的節點,并且clientMachine也在里面

            //并且容量大于5塊,就直接返回clientMachine.我猜是為了本地加速

            //畢竟上傳到本地和上傳到遠程主機是不一樣的。

            // If the requester's machine is in the targetList, 

            // and it's got the capacity, pick it.

            //

            if (clientMachine != null && clientMachine.getLength() > 0) {

                for (Iterator it = targetList.iterator(); it.hasNext(); ) {

                    DatanodeInfo node = (DatanodeInfo) it.next();

                    if (clientMachine.equals(node.getHost())) {

                        if (node.getRemaining() > BLOCK_SIZE * MIN_BLOCKS_FOR_WRITE) {

                            return node;

                        }

                    }

                }

            }

            //

            // Otherwise, choose node according to target capacity

            //否則,就從中選擇一個容量大于5塊的節點

            for (Iterator it = targetList.iterator(); it.hasNext(); ) {

                DatanodeInfo node = (DatanodeInfo) it.next();

                if (node.getRemaining() > BLOCK_SIZE * MIN_BLOCKS_FOR_WRITE) {

                    return node;

                }

            }

            //

            // That should do the trick.  But we might not be able

            // to pick any node if the target was out of bytes.  As

            // a last resort, pick the first valid one we can find.

            //否則,就選擇一個至少大于1塊的節點

            for (Iterator it = targetList.iterator(); it.hasNext(); ) {

                DatanodeInfo node = (DatanodeInfo) it.next();

                if (node.getRemaining() > BLOCK_SIZE) {

                    return node;

                }

            }

            LOG.warning("Could not find any nodes with sufficient capacity");

            return null;//否則返回null

        } else {

            LOG.warning("Zero targets found, forbidden1.size=" +

                ( forbidden1 != null ? forbidden1.size() : 0 ) +

                " forbidden2.size()=" +

                ( forbidden2 != null ? forbidden2.size() : 0 ));

            return null;//一個可用來查找的節點都沒有!

        }

    }

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯行業資訊頻道,感謝您對創新互聯的支持。

當前題目:HDFS中create函數的作用是什么
鏈接地址:http://www.js-pz168.com/article46/pojohg.html

成都網站建設公司_創新互聯,為您提供靜態網站、Google、網頁設計公司、全網營銷推廣、品牌網站設計、用戶體驗

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都做網站
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
亚洲国产人成综合网站| jiyouzz国产精品久久| 99这里都是精品| 免费看成人午夜电影| 欧洲激情一区二区| 国产午夜精品在线观看| 视频一区视频二区中文字幕| 懂色av中文一区二区三区| 久久国产精品高清| 欧美美女激情18p| 国产精品夫妻自拍| 精品一区二区三区视频| 国产福利久久| 欧美中文字幕一二三区视频| 欧美国产乱子伦| 美女视频黄频大全不卡视频在线播放| 91福利入口| 91久久精品一区二区三| 国产性天天综合网| 蜜桃免费网站一区二区三区| 成人黄动漫网站免费| 91黄色小视频| 国产精品久久久久精k8| 激情久久久久久久久久久久久久久久| 激情伦成人综合小说| 欧美伦理电影网| 亚洲精品videosex极品| 成人综合在线观看| 亚洲欧洲一区二区在线观看| 久久久精品国产免大香伊| 日韩黄色小视频| 国产乱码精品一区二区三区日韩精品 | 欧洲人成人精品| 国产精品久久久久久久久免费相片 | 国产一区二区在线观看免费| 欧美久久综合性欧美| 欧美videos中文字幕| 日韩激情一区二区| 国产视频一区二区不卡| 欧美一区二区在线视频| 亚洲成在线观看| 国产高清自拍一区| 91精品麻豆日日躁夜夜躁| 亚洲第一激情av| 国产视色精品亚洲一区二区| 91麻豆精品国产91久久久使用方法| 亚洲一区二区在线免费观看视频| 91亚洲精品久久久蜜桃网站| 欧美日韩色一区| 亚洲国产精品一区二区久久恐怖片| 1卡2卡3卡精品视频| 69av一区二区三区| 丝袜亚洲另类欧美综合| 狠狠色狠狠色综合人人| 欧美精品一区二| 国内外成人在线视频| 亚洲欧洲精品一区| 国产精品久久夜| www.色综合.com| 欧美日韩成人综合在线一区二区| 亚洲国产日韩一级| 精品一区二区三区国产| 久久色.com| 丰满亚洲少妇av| 欧美性色aⅴ视频一区日韩精品| 亚洲综合一区二区精品导航| 国产欧美在线一区二区| 久久午夜国产精品| 国产91丝袜在线观看| 欧美性猛交xxxxxx富婆| 午夜欧美电影在线观看| 欧美国产一二三区| 国产精品久久久久精k8| 5566中文字幕一区二区| 日韩欧美一卡二卡| 国产美女久久久久| 欧美午夜不卡在线观看免费| 视频一区二区三区中文字幕| 日本午夜精品电影| 亚洲人成在线播放网站岛国| 国产精品久久国产精品| 国产丝袜美腿一区二区三区| 成人av在线电影| 日韩一二三区不卡| 国产高清不卡一区二区| 在线不卡的av| 国产一区二区美女诱惑| 欧美日韩不卡在线| 久久aⅴ国产欧美74aaa| 在线看一区二区| 日本欧美大码aⅴ在线播放| 亚洲欧美电影在线观看| 亚洲成人www| 天天综合色天天综合色hd| 亚洲一区在线观看免费观看电影高清| 鲁鲁视频www一区二区| 亚洲视频一区二区在线| 开心色怡人综合网站| **欧美大码日韩| 裸模一区二区三区免费| 亚洲欧美激情在线| 欧美一区二区三区四区夜夜大片 | 国产一区二区日韩精品| 欧美日韩精品一区二区| 极品美女销魂一区二区三区 | 国产欧美一区在线| av一区和二区| 国产精品天天看| 国产在线观看一区| 综合电影一区二区三区 | 福利视频网站一区二区三区| 91精品国产色综合久久| 国产suv精品一区二区6| 亚洲精品在线三区| 91免费视频网| 国产精品久久久久久久久图文区 | 成人免费视频观看视频| 国产精品国产三级国产普通话蜜臀| 国产一级特黄a大片99| 亚洲日韩欧美一区二区在线| 日本不卡久久| 午夜欧美电影在线观看| 在线观看视频一区二区| 国产一区999| 精品盗摄一区二区三区| 99国精产品一二二线| 国产精品高潮呻吟| 日韩欧美精品一区二区| 日本在线观看不卡视频| 欧美日本在线看| 成人免费视频一区| 中文字幕精品—区二区四季| 欧美日韩成人一区二区三区| 午夜精品一区二区三区电影天堂| 色94色欧美sute亚洲13| 激情文学综合插| 久久综合狠狠综合久久综合88| www.久久久| 亚洲制服丝袜av| 欧美在线视频全部完| 东方欧美亚洲色图在线| 国产日韩v精品一区二区| 欧美日韩电影一区二区三区| 日韩专区一卡二卡| 欧美一区二区精品在线| 97伦理在线四区| 一区二区三区欧美激情| 欧美影院一区二区| 不卡一区二区三区四区| 国产精品色眯眯| 亚洲欧美久久234| 国产在线视频一区二区| 国产欧美日韩中文久久| 日韩区国产区| 国产一区美女在线| 国产欧美日韩另类一区| 色吧亚洲视频| 国产精品一二三四五| 国产精品素人视频| 亚洲免费不卡| 成人理论电影网| 亚洲精品久久久蜜桃| 欧美视频你懂的| 999精品视频一区二区三区| 一个色妞综合视频在线观看| 欧美日韩高清一区二区| 国产精品白丝jk白祙| 日韩激情一区二区| 欧美精品一区二区三区一线天视频| 玖玖玖精品中文字幕| 狠狠色综合播放一区二区| 国产日韩欧美精品在线| 艳色歌舞团一区二区三区| 成人在线视频一区| 玉足女爽爽91| 欧美一区二区三区爱爱| 美媛馆国产精品一区二区| 九九视频精品免费| 国产精品久久毛片a| 欧美伊人精品成人久久综合97| 91九色在线免费视频| 日韩电影在线免费观看| 久久久国产精品午夜一区ai换脸| 亚洲国产一区在线| 成人av一区二区三区| 亚洲bt欧美bt精品777| 精品免费国产二区三区| 亚洲巨乳在线观看| 91婷婷韩国欧美一区二区| 亚洲成人自拍一区| 久久久精品综合| 色婷婷狠狠综合| 国产精品区免费视频| 久久精品国产免费| 国产精品麻豆视频| 欧美另类高清zo欧美| 欧美日韩一区二区视频在线观看| 国产成人午夜电影网| 亚洲国产精品一区二区久久恐怖片| 欧美成人激情免费网|