- 浏览: 278704 次
文章分类
最新评论
-
feargod:
...
ActivityGroup的子activity响应back事件的顺序问题 -
hoarhoar:
谢谢你,终于解决了,我真是受够了,总是45秒钟,真是疯了。
youku 的广告必须要屏蔽 -
lilai:
...
youku 的广告必须要屏蔽 -
aijuans2:
...
youku 的广告必须要屏蔽 -
weiwo1978:
说的非常好,mark
SELECT语句执行的顺序
终于可以开始分析ReplicationMonitor,他依赖了其他的任务数据,我们先来看看他的类的java doc
说明反而没有说具体的工作内容,而是直接说call某个方法,看方法名字也好理解,就是执行一些复制的工作,那么在复制决策执行前肯定需要做调研了,调研完了再按照一定的准则执行特定的复制操作了。
好我们首先看下复制检测的时间间隔
- this .replicationRecheckInterval = conf.getInt( "dfs.replication.interval" , 3) * 1000L;
- //dfs.replication.interval=3 默认的设置,注意单位是秒
看这个时间间隔貌似算是最小的了,3秒就会检测一次是否需要复制数据了,看来干活很给力。
我们先来看下run方法里的逻辑:
- 1 :computeDatanodeWork(); //计算块复制情况(例如少了还是多了)
- 2 :processPendingReplications(); //处理那些复制超时的块请求
我们首先看下computeDatanodeWork()这个方法的java doc
- /**
- * Compute block replication and block invalidation work
- * that can be scheduled on data-nodes.
- * The datanode will be informed of this work at the next heartbeat.
- *
- * @return number of blocks scheduled for replication or removal
- */
其实这个返回值根本就没有用到,连个log也没打
在进行计算block复制数前需要验证是否处于安全模式下,针对这点注释里写的很明白(后面要把这个safeMonitor后台任务加入分析)
因为检测的频率过高,为防止检测过多的节点和数据块,在检测时设置了一些阈值来限定当此检测的范围,例如
- static final int INVALIDATE_WORK_PCT_PER_ITERATION = 32 ;
- static final float REPLICATION_WORK_MULTIPLIER_PER_ITERATION = 2 ;
- blocksToProcess = (int )(heartbeats.size()
- * ReplicationMonitor.REPLICATION_WORK_MULTIPLIER_PER_ITERATION);
- nodesToProcess = (int )Math.ceil(( double )heartbeats.size()
- * ReplicationMonitor.INVALIDATE_WORK_PCT_PER_ITERATION / 100 );
- ArrayList<DatanodeDescriptor> heartbeats
针对上面的计算公式,例如我有100个datanode节点,则hearbeats.size ==100 ,那么在3秒的时间内处理的限制数就是blockToProcess = 200 nodeToProcess = 32
好进入正题,首先是选择那些需要复制的块,那些需要复制的块保存在下面这个数据结构中
- // Store set of Blocks that need to be replicated 1 or more times
- UnderReplicatedBlocks neededReplications
我们看下这个结构的内部实现
- /* Class for keeping track of under replication blocks
- * Blocks have replication priority, with priority 0 indicating the highest
- * Blocks have only one replicas has the highest
- */
- private List<TreeSet<Block>> priorityQueues = new ArrayList<TreeSet<Block>>();
利用这个实现了一个优先级有序队列,优先级一共只有4级 (0,1,2,3),同时block实现了Comparable接口,依据blockId和生成时间来做比较。
那么是谁将复制请求传递过来的呢,追踪代码看有以下几种情况:
- 1 :当lease被删除时,需要检测和这个租约关联的hdfs文件的block数是否和期望的一致,如果小于期望值则将这个块加入到需要复制队列中
- 2 :当离开安全模式时需要校验块的复制情况,如果没达到复制因子的则加入到需要复制队列中
- 3 :当datanode注册到namenode时需要校验这个datanode是否处于正准备退役阶段,如果是那需要检测该datanode节点上的所有block的复制数是否已经达到复制因子,如果没有则需要加入到需要复制队列中
- 4 :当DecommissionManager的监控线程执行检测时,如果发现某个退役节点处于正准备退役阶段,则对该退役节点的所有块执行检测,查看是否达到复制因子,如果没有达到则将该block加入到需要复制队列中
好了有了来源我们就看看下面的逻辑, 从neededReplications中先选出blocksToProcess大小的block,然后经过一系列复杂的逻辑判断,看是否需要真正的复制,如果需要就将block加入到pendingReplications队列中。
同时还存在一个recentInvalidateSets 这个集合里存储了当时无效的block,这里会计算这里面的block还是否有效。
接下来看 processPendingReplications,这个的逻辑比较简单,就是将pendingReplicationMonitor中监控到的超时复制请求重新放入neededReplications中去。
好了我们已经看到block需要被复制的逻辑了,那么到底是谁执行复制的具体操作呢,追踪下发现是
DatanodeDescriptor.addBlockToBeReplicated(block, targets);该方法将需要复制的功能交给了datanode自己来做,datanode发送心跳信息时会接收到一个需要传递数据的commond,然后依据command里的参数来执行对应的传送数据的请求。
更多信息请查看 java进阶网 http://www.javady.com
发表评论
-
hadoop FSNamesystem中的recentInvalidateSets
2012-04-20 20:28 979今天早就回来了,然后偷懒了2个小时,现在才开始分析代码, ... -
hadoop namenode后台jetty web
2012-04-20 20:28 1661现在开始分析namenode启动时开启的第2类线程, ... -
hadoop namenode format做了什么?
2012-04-18 20:58 1076一看到format就和磁盘格式化联想到一起,然后这个fo ... -
hadoop分布式配置(服务器系统为centos5,配置时使用的用户是root)
2012-04-14 21:19 1013目前我们使 ... -
hadoop系列A:多文件输出
2012-04-14 21:18 1359package org.myorg; import ... -
Hadoop 安装问题和解决方案
2012-04-10 13:21 1204前几天在Window和Linux主机安装了Hadoop, ... -
运行Hadoop遇到的问题
2012-04-10 13:19 1547运行Hadoop遇到的问题 1, 伪分布式模式 ... -
运行Hadoop遇到的问题
2012-04-10 13:19 0运行Hadoop遇到的问题 1, 伪分布式模式 ... -
hadoop使用过程中的一些小技巧
2012-04-09 10:16 1117hadoop使用过程中的一些小技巧 ------------- ... -
运行hadoop时的一些技巧
2012-04-09 10:14 735//用来给key分区的,需要实现Partitioner接口 ... -
hive相关操作文档收集
2012-04-08 10:51 0How to load data into Hive ... -
hive sql doc
2012-04-08 10:51 0记录2个常用的hive sql语法查询地 官方 ht ... -
hive Required table missing : "`DBS`" in Catalog "" Schema "
2012-04-08 10:51 0最近需要提取一些数据,故开始使用hive,本机搭建了一个hiv ... -
HDFS数据兼容拷贝
2012-04-08 10:50 0系统中使用了hadoop 19.2 20.2 2个版本,为啥有 ... -
hdfs 简单的api 读写文件
2012-04-08 10:50 0Java代码 import ... -
hbase之htable线程安全性
2012-04-22 15:22 1127在单线程环境下使用hbase的htable是没有问题,但是突然 ... -
hbase之scan的rowkey问题
2012-04-22 15:22 1701最近使用到hbase做存储,发现使用scan的时候,返回的ro ... -
datanode启动开启了那些任务线程
2012-04-22 15:22 1042今天开始分析datanode,首先看看datanode开启了哪 ... -
namenode这个类的主要功能
2012-04-22 15:22 1432今天来总看下namenode这个类的主要功能 首先看下这个类 ... -
hadoop监控
2012-04-22 15:21 1571通过从hadoop的 hadoop-metrics文件中就可以 ...
相关推荐
NameNode职责
[bigdata@namenode1 scripts]$ pwd /home/bigdata/software/hadoop/share/scripts [bigdata@namenode1 scripts]$ python configuration-utils.py -c 2 -m 8 -d 30 -k True Using cores=2 memory=8GB disks=30 hbase=...
Hadoop Namenode性能诊断及优化
hdfs的namenode的元数据管理机制,简要画出了元数据管理的流程分析
未知原因导致namenode 的fsimage等文件丢失,namenode重启失败的参考解决
NameNode及SecondaryNameNode分析
NULL 博文链接:https://snv.iteye.com/blog/1884565
王家林的“云计算分布式大数据Hadoop实战高手之路---从零开始”的第九讲Hadoop图文训练课程:剖析NameNode和Secondary NameNode的工作机制和流程. 此教程来自于王家林免费发布的3本Hadoop教程:云计算分布式大数据...
hadoop NameNode 源码解析
大家都知道HDFS的架构由NameNode,SecondaryNameNode和DataNodes组成,其源码类图如下图所示:正如上图所示,NameNode和DataNode继承了很多的protocol用于彼此间的通信,其实nameNode还实现了...实现了ClientProtocol...
今天小编就为大家分享一篇关于Hadoop之NameNode Federation图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
详细讲解了Hdfs中NameNode节点的配置,备份和恢复,以及secondNamenode的配置
HDFS体系结构主要由两部分组成:NameNode和DataNode。 NameNode NameNode是HDFS的中心节点,负责管理文件系统的命名空间。它维护着整个文件系统的目录结构、文件权限和数据块的映射关系。NameNode是HDFS的单点故障...
Hadoop Namenode恢复
(1)第一次启动 NameNode 格式化后,创建 fsimage 和 edits 文件 (2)客户端对元数据进行增删改的请求 (3)NameNode 记录操作
■ NameNode 服务器线程数 ■ 用于来自客户端和DataNode 的RPC 调用的线程(心跳和元数据操作) ■ CM默认是30(非CM默认值为10) ■ 推荐:集群节点数x 20 的自然对数 ■ 设置太低的症状:DataNode 日志中的...
第5章 NameNode和SecondaryNameNode(面试开发重点) 5.1 NN和2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应...
最新的hdfs namenode主备安装文档,详细,命令只需要copy执行即可
1. Hadoop 2.0 2. 部署在2个Ubuntu上 3. 2个namenode 2个datanode