Hadoop运行错误 - Output directory hdfs://master:9000/output already exists

本文介绍在运行Hadoop WordCount作业时遇到“FileAlreadyExistsException”错误的原因及解决办法,通过删除已存在的输出目录,成功解决该问题。

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

 运行hadoop出现以下问题:

[its312@master bin]$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.0.jar wordcount /input /output
2018-11-06 21:31:12,192 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://master:9000/output already exists
	at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:164)
	at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:280)
	at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146)
	at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1570)
	at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1567)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1682)
	at org.apache.hadoop.mapreduce.Job.submit(Job.java:1567)
	at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1588)
	at org.apache.hadoop.examples.WordCount.main(WordCount.java:87)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:71)
	at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:144)
	at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:74)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.util.RunJar.run(RunJar.java:308)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:222)

 

问题分析:

hdfs的output目录已经存在。

 

解决方案:

删除相应文件或文件夹:

/usr/loca/hadoop/bin/hadoop fs -rm -r output

 

### 解决HDFS输出目录已存在错误 当尝试在已经存在的HDFS输出路径上执行写入操作时,Spark作业会抛出`hdfs output directory already exists error hadoop141 phone_output`异常。为了避免此问题,在编写数据之前应先检查并删除目标路径。 #### 使用PySpark处理已有输出目录的方法 为了防止覆盖重要数据,建议首先确认要删除的目标路径确实是可以安全移除的数据集。下面是一个完整的解决方案: ```python from pyspark.sql import SparkSession import subprocess spark = SparkSession.builder.appName("RemoveOutputDir").getOrCreate() output_path = "hdfs://namenode:8020/user/hadoop/phone_output" def check_hdfs_directory_exists(path): """Check if an HDFS path exists.""" command = f"hdfs dfs -test -e {path}" result = subprocess.run(command, shell=True) return result.returncode == 0 if check_hdfs_directory_exists(output_path): delete_command = f"hdfs dfs -r {output_path}" process = subprocess.Popen(delete_command.split(), stdout=subprocess.PIPE) _, _ = process.communicate() else: print(f"The specified output path does not exist.") dfJSON.write.json(output_path) ``` 上述脚本通过调用命令行工具来检测指定的HDFS路径是否存在,并在必要时将其删除[^1]。 对于生产环境中的批处理任务来说,通常会在每次运行前清理旧的结果文件夹;而对于交互式的查询分析,则可以考虑采用临时表的方式保存中间结果,从而绕过这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值