namenode是hadoop的核心,他管理文件系统的命名空间,维护文件系统树以及这个树的所有的文件和索引目录。这些信息通过两种形式将文件持久化到本地磁盘:命名空间镜像(fsImage)和编辑日志(edit log).名称节点记录着每个文件的每个块所在的数据节点,但是不永久保存块的位置,这些信息会在系统启动是有数据节点重建推送过来。
主要管理两个东西
The NameNode controls twocritical tables:
* 1) filename->blocksequence (namespace)
* 2) block->machinelist ("inodes")
文件名-->数据块
数据块-->DataNode列表
文件名-->数据块保存在磁盘上(持久化);但NameNode上不保存数据块-->DataNode列表,该列表是通过DataNode上报建立起来的。
Namenode实现了ClientProtocol 、DatanodeProtocol NamenodeProtocol、可以提供给客户端、datanoe、secondory namenode调用的方法,是通过rpc机制调用的。
ClientProtocol提供给客户端,用于访问NameNode。它包含了文件角度上的HDFS功能。和GFS一样,HDFS不提供POSIX形式的接口,而是使用了一个私有接口。一般来说,程序员通过org.apache.hadoop.fs.FileSystem来和HDFS打交道:最常用的分布式文件类是DistributedFileSystem,包含有DFSClient dfs,包含了ClientProtocol rpcNamenode实例,分布式文件实例通过dfs-->rpcNamenode代理类跟Namenode进行间接关联,具体可以参考详细的api
DatanodeProtocol:用于DataNode向NameNode通信,包括:
register,用于DataNode注册;
sendHeartbeat/blockReport/blockReceived,用于DataNode的offerService方法中;
errorReport向NameNode报告一个错误的Block,用于BlockReceiver和DataBlockScanner;
nextGenerationStamp和commitBlockSynchronization用于lease管理。
NamenodeProtocol用于从NameNode到NameNode的通信。主要是secondary NameNode 到NameNode的调用
启动:
1初始化ipc server, 主要负责接收并处理来自客户端/datanode的连接(详细情况见hadoop rpc学习)
2 Namenode通过FSNamesystem来实现对内部文件的管理:
初始化FSNamesystem, 然后查找StorageDirectory,查找配置文件(dfs.name.edits.dir和 dfs.name.dir)就是正在修改的命名空间文件和命名空间文件,放到List<StorageDirectory> storageDirs 中,循环找出需要进行修复或者回滚的文件内容,进行处理。查找到最新的StorageDirectory,装载image文件(\home\baqun\tmp\dfs\name\current\fsimage其中包括了版本信息、文件个数、最后修改时间、包含的block的信息、权限控制信息、datanode信息、正在创建的文件信息)
(这是一个复杂的过程,把blocks的信息、inode的信息,permission、parent inode然后组装起来 读取datanode\)
然后把edit log也装载进来:读取两个edit文件,一个是之前的edit log,另外一个是正在写的log文件,装载然后merge进内存。
3提供服务
其中FSNamesystem的初始化是一个重要的过程:
初始化如下:
1初始化FSDirectory
2装载最新的命名空间文件
3机器名、端口号设置
4配置信息初始化(文件副本数、最大/小文件副本数、默认block大小、心跳时间间隔)
5设置safeMode,安全模式:
安全模式是这样一种状态,系统处于这个状态时,不接受任何对名字空间的修改,同时也不会对数据块进行复制或删除数据块。NameNode启动的时候会自动进入安全模式,同时也可以手工进入(不会自动离开)。系统启动以后,DataNode会报告目前它拥有的数据块的信息,当系统接收到的Block信息到达一定门槛,同时每个Block都有dfs.replication.min个副本后,系统等待一段时间后就离开安全模式。这个门槛定义的参数包括:
l dfs.safemode.threshold.pct:接受到的Block的比例,缺省为95%,就是说,必须DataNode报告的数据块数目占总数的95%,才到达门槛;
l dfs.replication.min:缺省为1,即每个副本都存在系统中;
l dfs.replication.min:等待时间,缺省为0,单位秒。
6构造线程:
Daemonhbthread = null; //HeartbeatMonitor thread
public Daemonlmthread = null; // LeaseMonitorthread
Daemon smmthread = null; // SafeModeMonitor thread
public Daemonreplthread = null; // Replicationthread
NameNode上的线程,分别对应DataNode心跳检查,租约检查,安全模式检查和数据块复制。各个线程的工作模式在后边介绍。
7 DNSToSwitchMapping对象实例化:
是HDFS节点之间的网络拓扑的实现
Heartbeat线程(主要有FSNamesystem实现):
HeartbeatMonitor 有一个ArrayList<DatanodeDescriptor>heartbeats,记录的是datanode的注册信息,这个线程定时去轮询所有的心跳连接,检测这个datanode是不是超时(死亡,一个时间段内无连接),如果已经认定死亡,就删除这个节点,紧接着做如下处理:
(1) 更新全部可用空间,全部的容量,剩余容量
(2) heartbeats里删除这个心跳,删除这个node删除的所有block信息,在整个的blockMap里也删除block信息,重置这个节点描述对象的信息(应该是为了gc),
(3) 在NetworkTopology里删除这个节点的信息(在网络结构中删除这个节点,他是一个树状的网络拓扑结构,一个集群是由数据中心组成的,这个数据中心包括rack(机架),机架上有多台机器,在这个结构中,叶子节点代表了datanode,中间节点代表了交换机/路由器,他们负责管理rack/数据中心数据的传输,这个类主要负责计算两个节点之间的关系,是通过一个算法来维护的,方法就是
getDistance(Node node1, Nodenode2)
在dfs的副本文件存储的规则(下图)是HDFS’s placement policy is to putone replica on one node in the local rack, another on a different node in thelocal rack, and the last on a different node in a different rack)那么这个抽象类完美的抽象了网络top结构,是非常精妙的实现方式
租约线程:
一个租约由一个holder(客户端名),lastUpdate(上次更新时间)和paths(该客户端操作的文件集合)构成。LeaseManager对Lease进行管理。租约线程Monitor通过对Lease的最后更新时间来检测Lease是否过期,如果过期,就调用FSNamesystem的internalReleaseLease方法。
复制线程replthread:
replthread运行ReplicationMonitor,这个线程会定期调用computeDatanodeWork和processPendingReplications。
computeDatanodeWork会执行computeDatanodeWork或computeInvalidateWork。computeDatanodeWork从neededReplications中扫描,取出需要复制的项,然后:
l 检查文件不存在或者处于构造状态;如果是,从队列中删除复制项,退出对复制项的处理(接着处理下一个);
l 得到当前数据块副本数并选择复制的源DataNode,如果空,退出对复制项的处理;
l 再次检查副本数(很可能有DataNode从故障中恢复),如果发现不需要复制,从队列中删除复制项,退出对复制项的处理;
l 选择复制的目标,如果目标空,退出对复制项的处理;
l 将复制的信息(数据块和目标DataNode)加入到源目标DataNode中;在目标DataNode中记录复制请求;
l 从队列中将复制项移动到pendingReplications。
这个方法执行后,复制项从neededReplications挪到pendingReplications中。DataNode在某次心跳的应答中,可以拿到相应的信息,执行复制操作。
参考:
分享到:
相关推荐
Hadoop Namenode性能诊断及优化
hadoop NameNode 源码解析
Hadoop Namenode恢复
drbd+heartbeat+hadoop+apache配置详细奥
hadoop2.8.4源码
weekend01 192.168.1.201 jdk、hadoop NameNode、DFSZKFailoverController(zkfc) weekend02 192.168.1.202 jdk、hadoop NameNode、DFSZKFailoverController(zkfc) weekend03 192.168.1.203 jdk、hadoop ...
6.hadoop namenode format 7./hadoop/etc/slaves这个文件里必须把所有的slaves的主机名写进去。 8.mast的/etc/hosts slave1的/etc/hosts slave2 的/etc/hosts (localhost: 127.0.0.1可以去掉,只写主机名对应的IP...
Without "hadoop namenode -format" 目录结构: /data/hadoop 为工作目录,实际为一个链接(link) /data/hadoop-0.19.1 为实际0.19.1的安装目录 /data/hadoop-0.20.1 为实际0.20.1的安装目录 /data/hadoop-0.19.1的...
(4) 使用hadoop namenode -format命令格式化NameNode,使用start-all.sh命令启动所有Hadoop进程。 (5) 在各节点命令行输入jps检查是否启动成功,若成功,使用wordcount示例进行测试,Hadoop平台搭建完成。 (6)...
概念 - 何为”大数据安全” ...大数据安全策略 - 日志审计:Hadoop NameNode 日志审计 大数据安全策略 - 日志审计: Hadoop集群分析 大数据安全策略 - 日志审计: 血缘分析 大数据安全策略 - 数据保护:数字水印
增加Hadoop名称节点的高可用性(HA Enhancement of Hadoop NameNode)
/opt/hadoop$ bin/hadoop namenode -format 執行畫面如: 09/03/23 20:19:47 INFO dfs.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode...
[hadoop@a1 hadoop-0.20.2-cdh3u5]$ bin/hadoop namenode -format 开启 [hadoop@a1 hadoop-0.20.2-cdh3u5]$ bin/start-all.sh 在所有节点查看进程状态验证启动 [hadoop@a1 hadoop-0.20.2-cdh3u5]$ jps 8602 ...
格式化文件系统(仅第一次执行即可,不要重复执行):hdfs/hadoop namenode -format 启动hdfs: sbin/start-dfs.sh 验证是否启动成功: jps DataNode SecondaryNameNode NameNode 浏览器访问方式: ...
在网上搜集的以及本人自己总结的hadoop集群常见问题及解决办法,融合了网上常常搜到的一些文档以及个人自己的经验。
在Hadoop1.0时代,Hadoop的两大核心组件HDFS NameNode和JobTracker都存在着单点问题,这其中以NameNode的单点问题尤为严重。因为 NameNode保存了整个HDFS的元数据信息,一旦NameNode挂掉,整个HDFS就无法访问,同时 ...
hdfs namenode -format (hadoop namenode -format) 3.4启动hadoop 先启动HDFS sbin/start-dfs.sh 再启动YARN sbin/start-yarn.sh 3.5验证是否启动成功 使用jps命令验证 27408 NameNode 28218 Jps ...
在简述Hadoop namenode、datanode运行模式的基础上,重点介绍了Hadoop MapReduce的工作机制,并以作业提交、作业初始化、任务分配、任务执行和任务进度更新等流程介绍了Job Client、JobTracker、TaskTracker和HDFS在...
Django 的 Hadoop 集成(通过 Oozie REST API 或本地作业执行)。...NAMENODE = 'hdfs://%s:8020' % HADOOP_MAIN # Hadoop namenode JOB_USER = 'oozie' # Hadoop user for jobs & HDFS stuff JOB_MANAGER_CLASS = 'yo
单项选择题 1. 下面哪个程序负责 HDFS 数据存储。... DataNode 首次加入 cluster 的时候,如果 log 中报告不兼容文件版本,那需要 NameNode执行"Hadoop namenode -format"操作格式化磁盘。( ) 别走开,答案在后