8

我以伪分布式模式在单台机器上安装了 Cloudera CDH4 发行版,并成功测试了它是否正常工作(例如,可以运行 MapReduce 程序、在 Hive 服务器上插入数据等)但是,如果我偶然设置了core-site.xml文件fs.default.name到机器名而不是localhost重新启动NameNode服务,HDFS进入安全模式。

在更改之前fs.default.name,我运行以下命令检查 HDFS 的状态:

$ hadoop dfsadmin -report
...
Configured Capacity: 18503614464 (17.23 GB)
Present Capacity: 13794557952 (12.85 GB)
DFS Remaining: 13790785536 (12.84 GB)
DFS Used: 3772416 (3.60 MB)
DFS Used%: 0.03%
Under replicated blocks: 2
Blocks with corrupt replicas: 0
Missing blocks: 0

然后我对core-site.xml(机器名称为hadoop)进行了修改:

<property>
  <name>fs.default.name</name>
  <value>hdfs://hadoop:8020</value>
</property>

我重新启动了服务并重新运行了报告。

$ sudo service hadoop-hdfs-namenode restart
$ hadoop dfsadmin -report
...
Safe mode is ON
Configured Capacity: 0 (0 B)
Present Capacity: 0 (0 B)
DFS Remaining: 0 (0 B)
DFS Used: 0 (0 B)
DFS Used%: NaN%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

有趣的是,我仍然可以执行一些 HDFS 命令。例如,我可以运行

$ hadoop fs -ls /tmp

但是,如果我尝试使用 HDFS 读取文件hadoop fs -cat或尝试将文件放置在 HDFS 中,我会被告知 NameNode 处于安全模式。

$ hadoop fs -put somefile .
put: Cannot create file/user/hadinstall/somefile._COPYING_. Name node is in safe mode.

我需要fs.default.name将 设置为机器名称的原因是因为我需要在端口 8020(默认 NameNode 端口)上与这台机器通信。如果fs.default.namelocalhost,则 NameNode 服务不会监听外部连接请求。

我不知道为什么会发生这种情况,并希望得到任何帮助。

4

2 回答 2

6

问题源于域名解析。/etc/hosts需要修改该文件以指向hadoop机器的 IP 地址localhost和完全限定的域名。

192.168.0.201 hadoop.fully.qualified.domain.com localhost
于 2013-10-23T19:29:35.430 回答
1

安全模式是一种 HDFS 状态,其中文件系统以只读方式挂载;不执行复制,也不能创建或删除文件。在您的情况下,访问文件系统元数据(如“ls”)的文件系统操作将起作用。

可以使用此命令手动强制 Namenode 离开安全模式。( $ hadoop dfsadmin -safemode leave)验证安全模式的状态,( $ hadoop dfsadmin -safemode get)然后运行 ​​dfsadmin 报告以查看它是否显示数据。如果退出安全模式后报告仍然没有显示任何数据,那么我怀疑namenode 和 datanode 之间的通信没有发生。在此步骤之后检查 namenode 和 datanode 日志。

下一步可能是尝试重新启动 datanode 进程,最后的手段是格式化 namenode,这将导致数据丢失。

于 2013-10-17T03:52:05.333 回答