我以伪分布式模式在单台机器上安装了 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
但是,如果我尝试使用读取文件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.name
留给localhost
,那么NameNode服务将不会监听外部连接请求。
我不知道为什么会发生这种情况,并希望得到任何帮助。