Hadoop 源码解析 No.1 NameNode

本文介绍了Hadoop 2.9版本中NameNode的启动过程及核心功能,详细解析了NameNode如何管理文件系统的命名空间和数据块分配。

Hadoop 源码解析 No.1 NameNode

注:本人使用的版本是 2.9,并且确保你的机器上已经安装了Source

在新版的Hadoop 当中 启动模式已经从

$bin/hadoop  ⇒  $bin/hdfs

我们打开这个文件:

if [ "$COMMAND" = "namenode" ] ; then
CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"

可以看到最终指向的是 org.apache.hadoop.hdfs.server.namenode.NameNode 方法。

打开对应的文件,可以看到官方给的注释。


每一个HDFS系统都包含有一个单一的 “namenode” (在这里备份的 namenode 不算)。 NameNode 可以作为HDFS中文件目录和文件分配的管理者,保存最重要的东西,主要有这两个:

 1. 文件名    ⇒  块序列(命名空间)
 2. 数据块    ⇒  机器列表(inode)

其中 文件到数据块 映射保存在 namenode 当中,而 数据块到机器 映射关系则由 DataNode 上报之后建立起来。

未完待续

<think>嗯,用户遇到了Hadoop NameNode启动失败的问题,具体错误是“Multiple shared edits directories are not yet supported”。我得先理解这个错误的原因。根据引用[3],这个错误出现在配置了多个共享编辑目录的情况下,而Hadoop目前还不支持这样的配置。用户可能在hdfs-site.xml中设置了多个edits目录,导致NameNode无法启动。 首先,我应该建议用户检查他们的hdfs-site.xml文件,特别是dfs.namenode.edits.dir这个配置项。如果有多个路径被指定,需要改成单个目录。比如,如果有逗号分隔的多个路径,应该只保留一个,或者将多余的去掉。这可能解决当前的问题。 然后,用户提到他们可能通过复制文件到其他虚拟机导致的问题,如引用[3]中的解决方法是用scp传输文件后重启zk。这可能涉及到Hadoop集群的配置一致性,需要确保所有节点的配置文件都正确,尤其是NameNode的配置。如果用户是在格式化之后将目录复制到其他节点,可能需要确认是否每个节点都使用相同的配置,或者是否有冗余的配置导致多个edits目录被引用。 另外,格式化NameNode的步骤是否正确也很重要。根据引用[1],第一次启动HDFS时需要格式化NameNode,但多次格式化可能导致不一致的状态。用户可能之前多次尝试格式化,导致存储目录中存在冲突。需要确保在格式化之后没有残留的旧数据,并正确配置目录权限。 还有,用户可能在配置高可用(HA)环境时错误地配置了共享存储。Hadoop的HA通常需要JournalNodes来管理edits,而不是多个共享目录。如果用户试图手动配置多个edits路径而没有使用JournalNodes,就会出现这个问题。应该建议用户检查是否启用了HA,并正确配置JournalNodes,而不是多个共享目录。 此外,查看日志文件是诊断问题的关键。错误信息通常会指出具体的配置问题所在,用户应该查看NameNode的日志,找到具体的错误行,从而更准确地定位问题。例如,引用[2]中提到在启动namenode之前格式化步骤已经出错,所以用户需要确认格式化是否成功完成,并且没有遗留错误状态。 最后,确保所有节点的Hadoop版本和配置一致,避免因版本差异导致的兼容性问题。同时,文件系统的权限问题也可能导致启动失败,需要检查目录的所属用户和组是否正确,以及是否有读写权限。</think>### Hadoop NameNode启动失败问题解决方案 #### 1. 错误原因分析 出现`java.io.IOException: Multiple shared edits directories are not yet supported`错误,是由于在Hadoop配置中指定了多个共享编辑目录(edits目录),而当前版本Hadoop不支持此功能。此问题常见于以下场景: - `hdfs-site.xml`中`dfs.namenode.edits.dir`配置了多个路径 - 手动复制元数据目录导致配置冲突[^3] #### 2. 解决步骤 **步骤 1:检查核心配置文件** ```xml <!-- hdfs-site.xml --> <property> <name>dfs.namenode.edits.dir</name> <value>file:///usr/local/src/hadoop/tmp/hdfs/nn</value> <!-- 仅保留单一路径 --> </property> ``` 若发现多个路径(如逗号分隔的多个值),需删除冗余路径,仅保留一个有效目录[^3]。 **步骤 2:清理残留文件** ```bash # 停止所有Hadoop服务 stop-dfs.sh # 删除所有节点的元数据目录 rm -rf /usr/local/src/hadoop/tmp/hdfs/nn/* # 重新格式化NameNode(仅在首次部署时执行) hdfs namenode -format ``` 格式化成功后应显示`Storage directory ... has been successfully formatted`。 **步骤 3:验证权限配置** ```bash chown -R hadoop:hadoop /usr/local/src/hadoop/tmp chmod 755 /usr/local/src/hadoop/tmp/hdfs ``` **步骤 4:启动服务** ```bash start-dfs.sh ``` #### 3. 高级配置建议 若需高可用(HA)方案,应使用JournalNodes替代多edits目录: ```xml <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value> </property> ``` #### 4. 验证方法 ```bash hdfs haadmin -getServiceState nn1 jps # 确认NameNode进程存在 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值