文档章节

HDFS中的addBlock函数

强子1985
 强子1985
发布于 2014/12/19 16:14
字数 478
阅读 233
收藏 7

 

public LocatedBlock addBlock(String src, String clientMachine) throws IOException {

        int retries = 5;//设定重试次数为5

        Object results[] = namesystem.getAdditionalBlock(new UTF8(src), new UTF8(clientMachine));

//获取新的一个Block和DataNode节点信息

        while (results != null && results[0] == null && retries > 0) {

            try {//发生错误,且不超过错误次数,就重新获取

                Thread.sleep(100);

            } catch (InterruptedException ie) {

            }

            results = namesystem.getAdditionalBlock(new UTF8(src), new UTF8(clientMachine));

            retries--;

        }

//无论如何,都结束了!

        if (results == null) {//没找到?返回错误

            throw new IOException("Cannot obtain additional block for file " + src);

        } else if (results[0] == null) {

            return null;//没有Block?返回null

        } else {

            Block b = (Block) results[0];

            DatanodeInfo targets[] = (DatanodeInfo[]) results[1];

            return new LocatedBlock(b, targets);//这个简单,返回Block和DatanodeInfo

        }

    }

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

C1:OKAY  c2:OKAY   c3:OKAY

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

 

下面开始讲解

 public synchronized Object[] getAdditionalBlock(UTF8 src, UTF8 clientMachine) {

---

public synchronized Object[] getAdditionalBlock(UTF8 src, UTF8 clientMachine) {

        Object results[] = null;

        if (dir.getFile(src) == null && pendingCreates.get(src) != null) {

//文件系统dir中没有此文件且此文件正在创建过程中

            results = new Object[2];//创建返回的变量数组

            //

            // If we fail this, bad things happen!

            //这里的checkFileProgress很关键,

            //后面会分析checkFileProgress的作用

            if (checkFileProgress(src)) {

                // Get the array of replication targets //这个仍然很简单,之前分析过了

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

                if (targets.length < this.minReplication) {

                    return null;

                }

                // Create next block返回不多说!

                results[0] = allocateBlock(src);

                results[1] = targets;

            }

        }

        return results;

    }

===

接下来是函数

 

synchronized boolean checkFileProgress(UTF8 src) {

 

这个函数还是蛮重要的!

 

/**

     * Check that the indicated file's blocks are present and

     * replicated.  If not, return false.

     */

    synchronized boolean checkFileProgress(UTF8 src) {

        Vector v = (VectorpendingCreates.get(src);//获取文件名src对应的每个块

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

            Block b = (Block) it.next();//对于当前块来说

            TreeSet containingNodes = (TreeSetblocksMap.get(b);//获取这个块对应的datanode节点信息

            if (containingNodes == null || containingNodes.size() < this.minReplication) {

                return false;//如果此Block对应的datanode个数不足最小备份数,则禁止返回Block

            }

        }

        return true;//顺利返回true.

}

从这个函数,我们得知,如果在写入的过程中有datanode挂机,但是受影响的block的总个数达到安全阀值,我们还是容许继续写入的!

 

 

© 著作权归作者所有

共有 人打赏支持
强子1985

强子1985

粉丝 862
博文 943
码字总数 648757
作品 8
南京
架构师
windows下使用cygwin安装hadoop出现的问题,求解,谢谢!

$ ./hadoop jar ./dfs_operator.jar DFSOperator 13/11/07 00:58:40 WARN hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop .ipc.RemoteException: java.io.IOException: File /d......

小恩v
2013/11/07
572
2
hadoop向hdfs拷贝文件,出错,文件为空,错误如下

[whp@namenode hadoop-0.20.2]$ bin/hadoop dfs -put ../input in 15/05/26 15:35:39 WARN hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.ipc.RemoteException: java.io.IOExc......

nana0223
2015/05/26
409
5
hadoop异常“could only be replicated to 0 nodes, instead of 1” 解决

异常分析 1、“could only be replicated to 0 nodes, instead of 1”异常 (1)异常描述 上面配置都正确无误,并且,已经完成了如下运行步骤: [root@localhost hadoop-0.20.0]# bin/hadoop...

夏春涛
2017/09/26
0
0
Hdfs磁盘存储策略和预留空间配置

一、Hdfs磁盘存储策略 1、 指定本地目录存储策略 data目录为Hot策略对应DISK; data1目录为Cold策略对应ARCHIVE; 重启hdfs 2、指定hdfs目录的存储策略 查看hdfs存储策略 创建2个hdfs目录 指...

哓竹
2016/11/12
94
0
hadoop hbase无法启动 2

今天又碰到的问题: Not able to place enough replicas 2015-02-08 18:35:43,978 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:web cause:java.......

gbsnaker
2015/02/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sourcetree 离线免注册登录安装教程

Sourcetree是一个优秀的git可视化管理工具,深受开发者喜爱Sourcetree官网,但是在安装时需要谷歌账户登录,需要翻qiang才可以,此一点一直被人们所诟病。今天本教程就为大家提供离线免登陆安...

QQZZFT
13分钟前
0
0
使用 PostgreSQL 解决一个实际的统计分析问题

使用 PostgreSQL 解决一个实际的统计分析问题作者:老农民(刘启华)Email: 46715422@qq.com 之前有个朋友扔给我一个奇葩需求,他们公司之前做了一批问卷调查,全部都是统一格式的excel...

新疆老农民
16分钟前
0
0
TypeScript基础入门之高级类型的映射类型

转发 TypeScript基础入门之高级类型的映射类型 高级类型 映射类型 一个常见的任务是将一个已知的类型每个属性都变为可选的: interface PersonPartial {    name?: string;    age?...

durban
32分钟前
0
0
Dubbo源码分析(6):Dubbo内核实现之基于SPI思想Dubbo内核实现

SPI接口定义 定义了@SPI注解 package com.alibaba.dubbo.common.extension; import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.an......

郑加威
32分钟前
0
0
RxJS的另外四种实现方式(后记)—— 同时实现管道和链式编程

目录 RxJS的另外四种实现方式(序) RxJS的另外四种实现方式(一)——代码最小的库 RxJS的另外四种实现方式(二)——代码最小的库(续) RxJS的另外四种实现方式(三)——性能最高的库 Rx...

一个灰
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部