hadoop hdfs空间满后重启不了

本文详细记录了在Hadoop集群中遇到文件无法同步、日志空间不足导致的故障排查过程,包括日志分析、空间清理、数据恢复等步骤。通过一系列操作最终解决了集群重启失败的问题,并在数据丢失的情况下利用异地备份成功恢复了数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


            服务器检查的时候,发现存在HDFS上的文件无法同步,再发现hadoop停掉了。进行重启,重启不成功。


           查看hadoop日志:

2014-07-30 14:15:42,025 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Roll Edit Log from 192.168.206.133
<span style="color:#ff0000;">2014-07-30 14:15:42,026 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Cannot roll edit log, edits.new files already exists in all healthy directories:
  /home/hadoop/hdfs/name/current/edits.new</span>

<span style="color:#ff0000;">2014-07-30 14:17:17,853 ERROR org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Unable to sync edit log.
java.io.IOException: No space left on device</span>
	at sun.nio.ch.FileChannelImpl.force0(Native Method)
	at sun.nio.ch.FileChannelImpl.force(FileChannelImpl.java:348)
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog$EditLogFileOutputStream.flushAndSync(FSEditLog.java:215)
	at org.apache.hadoop.hdfs.server.namenode.EditLogOutputStream.flush(EditLogOutputStream.java:89)
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog.logSync(FSEditLog.java:1017)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:1190)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:628)
	at sun.reflect.GeneratedMethodAccessor300.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:563)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1388)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1384)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:396)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1382)
2014-07-30 14:17:17,853 FATAL org.apache.hadoop.hdfs.server.namenode.FSNamesystem: No edit streams are accessible
java.lang.Exception: No edit streams are accessible
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog.fatalExit(FSEditLog.java:388)
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog.exitIfNoStreams(FSEditLog.java:407)
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog.removeEditsAndStorageDir(FSEditLog.java:432)
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog.removeEditsStreamsAndStorageDirs(FSEditLog.java:470)
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog.logSync(FSEditLog.java:1030)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:1190)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:628)
	at sun.reflect.GeneratedMethodAccessor300.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:563)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1388)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1384)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:396)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1382)

空间满了。

使用命令df -h查看其中一个datanode,果然


但使用du -s查看,但显示只使用几百G,并没有满


这个实候确实让人费解,只好重启datanode所在的服务器,并重新挂载,回复原样,容量显示正常。


但是这个时候hadoop集群依然无法重启,一直报错:

014-07-30 16:27:46,610 ERROR org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem initialization failed.
java.io.IOException: Incorrect data format. logVersion is -32 but writables.length is 0. 
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog.loadFSEdits(FSEditLog.java:560)
	at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSEdits(FSImage.java:1026)
	at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:839)
	at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:377)
	at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:100)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:388)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:362)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:276)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:496)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1279)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1288)
2014-07-30 16:27:46,612 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.io.IOException: Incorrect data format. logVersion is -32 but writables.length is 0. 
	at org.apache.hadoop.hdfs.server.namenode.FSEditLog.loadFSEdits(FSEditLog.java:560)
	at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSEdits(FSImage.java:1026)
	at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:839)
	at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:377)
	at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:100)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:388)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:362)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:276)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:496)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1279)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1288)

不得解,只好从secondrynamenode尝试恢复

1. 先备份namenode和secondrynamenode的数据

2. 执行checkpoint数据:hadoop namenode –importCheckpoint

    失败……


最后查了网上的方法(有一个是修改代码并重新编译的,就算了):
printf "\xff\xff\xff\xee\xff" > edits

重启失败,继续:
printf "\xff\xff\xff\xee\xff" > edits.new

重启成功。


但是问题来了,数据丢失,因为清空了edits文件最新的日志内容。

一般来说,到这份上是没有办法了。

但是,幸好我们有两地同步和备份,将别一个数据中心HDFS集群的数据同步过来,恢复成功。

如果没有异地备份的话,上面的操作我也会慎之又慎的。




     

<think>首先,用户的问题是关于HadoopAgent在写入HDFS指定目录的临时文件失败的问题。用户提供了多个引用,我应该根据引用来提取相关信息,并参考之前的上下文,但由于这是第一次用户提问这个问题,我假设这是新的查询。用户的问题:"我想解决在Hadoop中启动Agent时无法将采集数据写入HDFS指定目录临时文件的问题"。用户明确说:"请问hadoopagent数据写入hdfs指定目录临时文件失败解决方案"。根据引用:-引用[1]:展示如何访问HDFS查看数据。-引用[2]:描述HDFS特点和Kafka与HDFS集成。-引用[3]:演示如何使用命令行操作HDFS,如上传和下载文件。-引用[4]:讨论FlumeAgent采集数据到HDFS,提到需要支持库。-引用[5]:介绍Flume系统,说明它用于采集日志数据到HDFS。关键点是"hadoopagent",结合引用[4]和[5],我推断"Agent"指的是FlumeAgent,因为引用[4]标题是"Hadoop-19FlumeAgent",引用[5]是"Flume采集日志数据并写入HDFS"。所以,用户可能在讨论FlumeAgent无法写入HDFS临时文件的问题。用户提到"临时文件",可能是在Flume写入过程中,数据被写入临时位置然后移动到目标目录时失败。我需要提供解决方案。解决方案应基于Hadoop和Flume的知识,并结合引用。从引用中提取相关信息:-引用[4]:提到需要支持库,如commons-configuration-1.6.jar等,放在特定目录下。这提示可能缺少jar文件或配置问题。-引用[5]:描述Flume的功能和配置。可能的失败原因和解决方案:1.**权限问题**:HDFS目录的权限问题。引用[1]中展示了命令`sudo-uhdfs`,指示以hdfs用户身份运行命令。FlumeAgent需要有写入HDFS目录的权限。-解决方案:检查目录权限。使用`hadoopfs-chmod`或`hadoopfs-chown`设置正确权限。确保Agent运行的用户有写入权限。2.**路径不存在或配置错误**:Flume配置文件可能指定的HDFS路径不存在或拼写错误。-解决方案:使用`hadoopfs-mkdir-p`创建目录。确保路径正确。3.**支持库缺失**:引用[4]提到需要一些jar文件放在`$HADOOP_HOME/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib`目录。如果FlumeAgent运行时缺少HDFS相关库,可能导致失败。-解决方案:确保Flume安装中包含HDFSsink所需的库。引用[4]列出了jar文件:commons-configuration-1.6.jar,commons-io-2.4.jar,hadoop-auth-2.9.0.jar,hadoop-common-2.9.0.jar,hadoop-hdfs-2.9.0.jar,htrace-core4-4.1.0-incubating.jar。需要验证这些jar存在于Flume的lib目录或相关路径。4.**配置问题**:Flume的配置可能不正确。例如,sink类型是hdfs,参数如hdfs.path,hdfs.filePrefix等设置不当。-解决方案:检查Flume配置文件(如flume.conf)。确保hdfssink相关参数正确设置,特别是hdfs.path指向指定目录。5.**网络或集群问题**:HDFS服务可能不可达或存在问题。-解决方案:检查HDFS服务状态。使用`hdfsdfsadmin-report`查看集群健康状况。6.**临时文件问题**:Flume在写入HDFS时会创建临时文件(.tmp后缀),然后重命名。如果权限问题或重命名失败,可能导致问题。-解决方案:检查hdfs.rollInterval,hdfs.rollSize等参数,确保文件正确关闭和重命名。结构化回答:-以中文回答,因为系统指令指定中文。-结构清晰:逐步解释原因和解决方案。-参考引用:在相关部分末尾添加引用标识,例如[^4]。-生成相关问题:在最后生成相关问题,帮助用户深入。相关问题:1.FlumeAgent配置最佳实践有哪些?2.如何监控Flume写入HDFS的性能?3.HDFS写入失败时的常见日志错误是什么?完整回答框架:1.**介绍问题**:解释用户的问题,指出可能原因。2.**步骤解决方案**:列出检查和修复步骤。3.**总结**:建议最佳实践。4.**相关问题**:生成相关问题。</think> ### 在Hadoop中启动Agent时写入HDFS指定目录临时文件失败的解决方案 您的查询涉及到在使用Flume Agent(如引用[4]和[5]所述)采集数据并写入HDFS指定目录时,临时文件(通常以`.tmp`后缀存储)失败的问题。这通常由权限、配置错误、库缺失或HDFS路径问题引起。我将基于Hadoop和Flume的机制,结合您提供的引用内容,提供结构化解决方案。解决方案将分步说明,帮助您诊断和修复问题。在步骤中,我会引用相关内容以增强可靠性。 --- ### 问题可能的原因分析 Flume Agent在写入HDFS时,数据先写入临时文件(例如 `/log/20121022_14/access.log.dev.tmp`),然后重命名为目标文件(如 `/log/20121022_14/access.log.dev`)。失败常见原因包括: - **权限不足**: Agent运行用户没有HDFS目录的写入权限。 - **HDFS路径无效**: 指定目录未创建或配置错误。 - **支持库缺失**: Flume缺少HDFS相关的JAR文件(如引用[4]所述)。 - **Flume配置错误**: `hdfs.path`参数设置不当或临时文件处理参数不合理。 - **集群问题**: HDFS服务不可用或存储空间不足。 以下解决方案基于最佳实践和相关引用内容。 --- ### 分步解决方案 #### 步骤1: 检查并修复HDFS目录权限 Flume Agent写入HDFS时,需要Agent运行用户(如`flume`或`hdfs`用户)有目标目录的读写权限。引用[1]中展示了使用 `sudo -u hdfs` 命令访问HDFS,这强调了权限的重要性。 - **操作步骤**: 1. 确保HDFS目标目录存在,并用 `hadoop fs -mkdir -p /指定目录` 创建(如 `/log/20121022_14`)。 ```bash hadoop fs -mkdir -p /log/20121022_14 ``` 2. 设置目录权限为Agent用户可写。例如,如果Agent以`flume`用户运行: ```bash hadoop fs -chown flume:supergroup /log/20121022_14 hadoop fs -chmod 775 /log/20121022_14 ``` 3. 验证权限: 使用 `hadoop fs -ls /log/20121022_14` 检查输出,确认用户组有写权限。 - **为什么有效**: Flume写入临时文件时需创建和重命名.tmp文件,权限不足是最常见失败原因[^4]。 #### 步骤2: 验证Flume配置文件的关键参数 Flume的配置文件(如 `flume.conf`)需正确设置HDFS sink参数。引用[5]提到Flume "提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力",但配置错误会导致写入失败。 - **操作步骤**: 1. 编辑Flume配置文件(通常位于 `/etc/flume/conf/flume.conf`),检查HDFS sink部分: ```properties agent.sinks = hdfs-sink agent.sinks.hdfs-sink.type = hdfs agent.sinks.hdfs-sink.hdfs.path = hdfs://namenode-host:8020/log/20121022_14 # 替换为您的NameNode地址和路径 agent.sinks.hdfs-sink.hdfs.filePrefix = access.log.dev agent.sinks.hdfs-sink.hdfs.inUseSuffix = .tmp # 确保临时文件后缀正确 agent.sinks.hdfs-sink.hdfs.rollInterval = 3600 # 文件滚动时间,避免临时文件过大 agent.sinks.hdfs-sink.hdfs.rollSize = 1048576 # 文件大小阈值(1MB) agent.sinks.hdfs-sink.hdfs.batchSize = 1000 # 批量写入大小 ``` 2. 确认 `hdfs.path` 包含完整URI(如 `hdfs://namenode-host:8020`),而非相对路径,以避免路径解析错误。 3. 重启Flume Agent应用配置:`sudo service flume-agent restart`。 - **为什么有效**: 参数如 `hdfs.inUseSuffix` 控制临时文件行为,设置不当会导致写入中断。合理的 `rollInterval` 和 `rollSize` 能减少临时文件锁争用[^5]。 #### 步骤3: 确保支持库完整(关键步骤) 引用[4]明确指出:"要将数据写入到 HDFS 中,我们需要一些支持库",并列出所需JAR文件(如 `hadoop-hdfs-*.jar`)。Flume依赖这些库与HDFS交互,缺失会导致写入失败。 - **操作步骤**: 1. 检查Flume的lib目录(通常为 `/usr/lib/flume/lib/`)是否包含以下JAR文件(参考引用[4]列表): - `commons-configuration-1.6.jar` - `commons-io-2.4.jar` - `hadoop-auth-*.jar` - `hadoop-common-*.jar` - `hadoop-hdfs-*.jar` - `htrace-core4-*.jar` 2. 如果缺少任何JAR,从Hadoop安装目录复制(如 `$HADOOP_HOME/share/hadoop/common/` 和 `$HADOOP_HOME/share/hadoop/hdfs/`)或从Maven仓库下载。 ```bash # 示例:从Hadoop目录复制到Flume lib目录 cp $HADOOP_HOME/share/hadoop/common/*.jar /usr/lib/flume/lib/ cp $HADOOP_HOME/share/hadoop/hdfs/*.jar /usr/lib/flume/lib/ ``` 3. 添加Hadoop配置文件到Flume类路径:确保 `core-site.xml` 和 `hdfs-site.xml` 被Flume读取(通常放在 `/etc/flume/conf/`)。 4. 重启Flume Agent。 - **为什么有效**: 支持库处理HDFS通信,缺失时Agent无法生成或重命名临时文件[^4]。 #### 步骤4: 检查HDFS集群状态 HDFS自身问题(如NameNode宕机或磁盘)会导致写入失败。引用[3]中提到 "运行上述代码后,可以在指定的HDFS路径下创建目录并上传文件",说明HDFS操作依赖集群健康。 - **操作步骤**: 1. 验证HDFS服务运行:`jps` 命令查看是否 `NameNode`, `DataNode` 等进程活跃。 2. 检查HDFS存储空间: ```bash hdfs dfsadmin -report # 查看DataNode的存储使用情况 hadoop fs -df -h / # 检查根目录剩余空间 ``` 3. 测试手动写入HDFS:使用引用[3]所示命令上传文件到目标目录: ```bash echo "test" > test.txt hadoop fs -put test.txt /log/20121022_14/test.txt hadoop fs -ls /log/20121022_14 # 验证写入 ``` 如果手动写入也失败,优先修复HDFS问题(如重启HDFS服务或扩容)。 - **为什么有效**: Flume Agent写入本质是HDFS操作,集群问题直接影响临时文件处理[^3]。 #### 步骤5: 审查Flume日志以诊断具体错误 Flume Agent日志提供详细错误信息,帮助定位临时文件写入失败的原因。 - **操作步骤**: 1. 查看Flume日志:通常位于 `/var/log/flume/flume.log`。 2. 搜索错误关键词: ```bash grep "failed to rename" /var/log/flume/flume.log grep "Permission denied" /var/log/flume/flume.log grep "FileNotFoundException" /var/log/flume/flume.log ``` 常见错误示例: - `java.io.IOException: Failed to rename ...`: 临时文件重命名失败,通常是权限问题。 - `org.apache.hadoop.security.AccessControlException`: 用户权限不足。 3. 根据日志内容调整修复(如修改权限或配置)。 - **为什么有效**: 日志能揭示失败根本原因,加速问题解决[^5]。 #### 预防最佳实践 - **使用高可用模式**: 如引用[2]所述"HDFS具有高容错性",确保Flume Agent与HA HDFS集成。 - **测试环境验证**: 在开发环境中测试配置。 - **版本兼容**: 确保Hadoop和Flume版本匹配(如Hadoop 3.x 与 Flume 1.9.x)。 --- ### 总结 通过上述步骤(重点是权限修复、配置验证和库管理),您应能解决Flume Agent写入HDFS指定目录临时文件失败的问题。引用[4]和[5]强调支持库和Flume配置的核心作用,确保这些部分正确是成功的关键。如果问题仍然存在,提供Flume日志片段有助于进一步诊断。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值