我在一台机器上以伪分布式模式安装了Cloudera CDH4发行版并成功测试它是否正常工作(例如,可以运行MapReduce程序,在Hive服务器上插入数据等)但是,如果我偶然{ {1}}文件将core-site.xml
设置为机器名而不是fs.default.name
并重新启动NameNode服务,HDFS进入安全模式。
在更改localhost
之前,我运行以下内容来检查HDFS的状态:
fs.default.name
然后我对$ 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>
一个有趣的说明是我仍然可以执行一些HDFS命令。例如,我可以运行
$ 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
但是,如果我尝试使用$ hadoop fs -ls /tmp
读取文件或尝试将文件放入HDFS,我会被告知NameNode处于安全模式。
hadoop fs -cat
我需要将$ hadoop fs -put somefile .
put: Cannot create file/user/hadinstall/somefile._COPYING_. Name node is in safe mode.
设置为计算机名称的原因是因为我需要在端口8020(默认的NameNode端口)上与此计算机进行通信。如果fs.default.name
留给fs.default.name
,则NameNode服务将不会侦听外部连接请求。
我不知道为什么会发生这种情况,并希望得到任何帮助。
答案 0 :(得分:6)
问题源于域名解析。需要修改/etc/hosts
文件以指向hadoop
机器的localhost
机器的IP地址和完全限定的域名。
192.168.0.201 hadoop.fully.qualified.domain.com localhost
答案 1 :(得分:1)
Safemode是一种HDFS状态,其中文件系统以只读方式挂载;不执行复制,也不能创建或删除文件。在您的情况下访问文件系统元数据的文件系统操作(如“ls”)将起作用。
可以使用此命令( $ hadoop dfsadmin -safemode leave)
手动强制Namenode离开safemode。使用( $ hadoop dfsadmin -safemode get)
验证safemode的状态,然后运行dfsadmin report以查看它是否显示数据。如果退出安全模式报告仍然没有显示任何数据然后我怀疑namenode和datanode之间的通信不是hapenning。在此步骤之后检查namenode和datanode日志。
接下来的步骤可能是尝试重新启动datanode进程,最后的办法是格式化namenode,这会导致数据丢失。