0
点赞
收藏
分享

微信扫一扫

记一次hadoop Connection refused: no further information排错


前言

music:

border="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=139774&auto=1&height=66">

这两天在研究hadoop的hdfs,用本地java api远程调用hdfs时出现了连接被拒绝的问题,具体异常如下:

Caused by: java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)
at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:687)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:790)
at org.apache.hadoop.ipc.Client$Connection.access$3500(Client.java:411)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1554)
at org.apache.hadoop.ipc.Client.call(Client.java:1385)
... 48 more

异常如下图:

记一次hadoop Connection refused: no further information排错_apache


记录一下解决方案,希望可以帮到和我遇到相同问题的人。

客户端代码调用

package com.sy.hadoop;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.net.URI;

/**
* @author suyu
* @version 1.0.0
* @ClassName HadoopApp
* @Description Java Api操作Hadoop的 HDFS 文件
* @Date 2018/7/28 16:15
*/
public class HadoopApp {

FileSystem fileSystem = null;
Configuration configuration = null;

/**
* HDFS的路径,core-site.xml中配置的端口号
*/
public static final String HDFS_PATH = "hdfs://192.168.1.102:8082";
/**
* 解决无权限访问,设置远程hadoop的linux用户名称
*/
public static final String USER = "weblogic";

/**
* 单元测试之前的准备工作,准备环境,加载配置
*
* @throws Exception
*/
@Before
public void setUp() throws Exception {
System.out.println("HDFSApp is setUp.....");
configuration = new Configuration();
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, USER);

}

/**
* 创建目录
*
* @throws Exception
*/
@Test
public void mkDir() throws Exception {
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}

/**
* 单元测试之后的工作,清理环境,释放资源等等
*
* @throws Exception
*/
@After
public void tearDown() throws Exception {
configuration = null;
fileSystem = null;
System.out.println("HDFSApp is tearDown....");
}
}

​在调用单元测试的时候,想模拟创建一下目录,结果发生异常!​

解决方案

下面的排错步骤,是建立在hadoop的服务端防火墙关闭的情况下(这点注意一下!)

第一步

1.查看你的hadoop Api提供的地址 + 端口!
如何查看正确的地址呢?
打开你的hadoop家目录!然后进入etc/hadoop比如我的就是:

/hadoop/hadoop-2.9.0/etc/hadoop

然后查看core-site.xml:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
</property>
</configuration>

其中第一个property的fs.defalutFS节点下的value,便是你​​本地api调用的地址加端口!​

第二步

2.在hadoop的服务端调用如下命令,检查是否打开:

telnet 192.168.1.102 8020

若看到如下文本,说明服务端是没有问题的!

Trying 192.168.1.102...
Connected to test (192.168.1.102).
Escape character is '^]'.
Connection closed by foreign host.

在本地的windows端,检查客户端是否可以调通服务端ip端口:
​​​tips:windows下的cmd命令中,调用telnet 是需要单独开启服务端,默认系统telnet命令在cmd中是调用是找不到的!​​​
打开windows—–telnet服务链接教程:​​​https://jingyan.baidu.com/article/3ea51489ba79e252e61bba97.html​​

telnet 192.168.1.102 8020

执行完毕,如果你看到的是跳入一个黑框,什么内容也没有,说明客户端也是可以调通服务端的!!!

第三步

3.查看你java代码本地的API中​​连接远程服务的ip以及端口是否正确HDFS_PATH(我代码中的变量)​

先说我的第一步,就已经自己把自己坑了一次,我写的ip地址是对的但是端口号是错的!!!
因为是手打的,所以不小心看成了8082…..(一定要心细啊!程序猿!!!~~)

"hdfs://192.168.1.102:8082";

好了,修改完这一步现在是正确的了!

/**
* HDFS的路径,core-site.xml中配置的端口号
*/
public static final String HDFS_PATH = "hdfs://192.168.1.102:8020";

​本以为可以成功,然而事实是残酷的!!​​ 依然报出Connection refused: no further information。

继续排错!!

第四步

想了想,为什么会网络被拒绝呢!无非就是找不到服务端的ip地址!!为什么找不到呢!!!
再来看下hadoop服务端的核心配置文件!

cd /hadoop/hadoop-2.9.0/etc/hadoop

然后查看core-site.xml:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
</property>
</configuration>

​配置文件中,我采用的是localhost的形式!!!问题就出现在这里了,如果对外提供服务,写成localhost,外部请求是不识别的!​

修改其核心配置文件,将localhost改为ip地址:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.1.102:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
</property>
</configuration>

再试一次!成功如下:

记一次hadoop Connection refused: no further information排错_hadoop_02

去服务端用命令查看下是否创建成功:

#可以迭代看到hadoop根目录的文件夹
hadoop fs -ls -R /

记一次hadoop Connection refused: no further information排错_hadoop排错_03

可以看到上图已经有刚刚创建的hdfsapi/test目录了!

总结

哎,总之程序员这个行业真是需要细心!否则会各种被坑。。。当然本次的排错思路也少不了hadoop官方wiki,人家写的更加权威一些。链接如下:
​​​https://wiki.apache.org/hadoop/ConnectionRefused​​


举报

相关推荐

0 条评论