文档章节

HDFS中的addBlock函数

强子1985
 强子1985
发布于 2014/12/19 16:14
字数 478
阅读 235
收藏 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

粉丝 871
博文 1061
码字总数 757086
作品 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
hbase0.95 hadoop1.1.2 集成 无法启动

我只找到了错误日志。 ERROR org.apache.hadoop.hdfs.DFSClient: Failed to close file /hbase/hbase.version org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /hbase/hb......

西二旗板报
2013/05/21
648
0

没有更多内容

加载失败,请刷新页面

加载更多

apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
47分钟前
0
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
3
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
3
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
3
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部