最近在初学hadoop时,用java往hdfs中写入文件时报错,现把报错问题整理,以免今后出现一样的问题。
先上简单的代码,代码只是简单的往hdfs中写入文件和判断文件是否存在:
package com.xiaoxing.hadoop;import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataOutputStream;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;public class HdfsDemo { public static void main(String[] args) throws IOException { writeFile("helloWorldTest","hello world,hadoop!"); if (exist("helloWorldTest")) { System.out.println("文件存在"); } else { System.out.println("文件不存在"); } } /** * 写入往fileName中写入数据 * @param fileName * @param context * @throws IOException */ private static void writeFile(String fileName,String context) throws IOException { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://192.168.1.109:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); byte[] buffer = context.getBytes(); FSDataOutputStream os = fs.create(new Path(fileName)); os.write(buffer,0,buffer.length); os.close(); fs.close(); } /** * 判断文件是否存在 * @param fileName * @return * @throws IOException */ private static boolean exist(String fileName) throws IOException { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://192.168.1.109:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); boolean isExist = fs.exists(new Path(fileName)); fs.close(); return isExist; } }
执行碰到的第一个问题:连接被拒。我的环境是在一台Unbutu机器上装了一个hadoop的伪分布式集群(ip为192.168.1.109),本机是win10(ip为192.168.1.109)。
Exception in thread "main" java.net.ConnectException: Call From AFAAW-704030720/192.168.1.108 to 192.168.1.109:9000 failed on connection exception: java.net.ConnectException: Connection refused: no further information; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
发现是在hadoop中配置的core-site.xml文件中配置fs.defaultFS值为的是hdfs://localhost:9000,把其修改为对应集群的IP即可,如我的Hadoop机器的IP是192.168.1.109就修改为hdfs://192.168.1.109:9000即可,这个问题就解决了。
第二个问题:
解决方法:
1.在执行eclipse的机器上增加系统变量:HADOOP_USER_NAME=hadoop(hadoop为有权限执行hadoop集群的用户)
2.修改权限:hadoop fs -chmod 777 /user/hadoop,/user/hadoop这个路径为HDFS中的文件路径 。
上面二种方法选择一种,建议选择第一种,每二种修改权限会引起安全问题。
第三个问题:There are 0 datanode(s) running and no node(s) are excluded in this operation
解决方法 :
1.执行./stop-dfs.sh停掉hadoop
2.删除core-site.xml文件中配置的dfs.namenode.name.dir设置的文件夹下的current文件夹
3.执行格式化:./bin/hdfs namenode -format
4.重启:./start-dfs.sh