踩坑 java调用hadoop api 连接拒绝
java.net.ConnectException: Call *** to master:** failed on connection exception: java.net.ConnectException: Connection refused: no further information;
##要使用宿主机中的 java 代码访问客户机中的 hdfs,需要保证以下几点:
1.确保宿主机与客户机的网络是互通的
2.确保宿主机和客户机的防火墙都关闭,因为很多端口需要通过,为了减少防火墙配置,直接关闭
3.确保宿主机与客户机使用的 jdk 版本一致。如果客户机使用 jdk7,宿主机使用 jdk8,那么代码运行时会报不支持的版本的错误
4.宿主机的登录用户名必须与客户机的用户名一直。比如我们 linux 使用的是 hadoop 用户,那么 windows 也要使用 hadoop 用户,否则会报权限异常
##问题解决办法:
1.检查hadoop安装路径下etc/hadoop/core-site.xml
vim etc/hadoop/core-site.xml 查看fs.defaultFS中配置的名称和端口是否一致 我的是8020
2. 检查防火墙是否关闭 root用户(普通用户切换sudo root)
#查看防火墙状态
service iptables status
#关闭防火墙
service iptables stop
#查看防火墙开机启动状态
chkconfig iptables --list
#关闭防火墙开机启动
chkconfig iptables off
3.先用windows的cmd窗口 看是否能ping同 不能ping同
检查C:\Windows\System32\Drivers\etc\hosts 是否配置了依赖
4.解决无权限访问 设置Configuration中的属性 Configuration相当于hadoop的配置文件
下边是代码配置
public class testUtil {
/**
* HDFS的路径,core-site.xml中配置的端口号
*/
public static final String HDFS_PATH = "hdfs://master:8020/";
/**
* 解决无权限访问,设置远程hadoop的linux用户名称
*/
public static final String USER = "hadoop";
/**
* 先执行
* @throws Exception
*/
Configuration conf =null;
FileSystem fs=null;
@Before
public void init() throws Exception{
//读取classpath下的xxx-site.xml 配置文件,并解析其内容,封 装到conf对象中
conf =new Configuration();
//也可以在代码中对conf中的配置信息进行手动设置,会覆盖掉配置 文件中的读取的值
conf.set("fs.defaultFS", HDFS_PATH);
//根据配置信息,去获取一个具体文件系统的客户端操作实例对象
fs=FileSystem.get(new URI(HDFS_PATH), conf, USER);
System.out.println("HDFSApp is setUp.....");
}
/**
* 最后执行
* @throws Exception
*/
@After
public void tearDown() throws Exception {
conf= null;
fs = null;
System.out.println("HDFSApp is tearDown....");
}
/**
* 创建目录
* @throws Exception
*/
@Test
public void mkdir() throws Exception{
fs.mkdirs(new Path(HDFS_PATH+"/999"));
System.err.println("HDFS DIR MAKE TURE");
}
}