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
异常如下图:
记录一下解决方案,希望可以帮到和我遇到相同问题的人。
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.defaultFSname>
<value>hdfs://localhost:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/hadoop/tmpvalue>
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.defaultFSname>
<value>hdfs://localhost:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/hadoop/tmpvalue>
property>
configuration>
配置文件中,我采用的是localhost的形式!!!问题就出现在这里了,如果对外提供服务,写成localhost,外部请求是不识别的!
修改其核心配置文件,将localhost改为ip地址:
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://192.168.1.102:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/hadoop/tmpvalue>
property>
configuration>
去服务端用命令查看下是否创建成功:
#可以迭代看到hadoop根目录的文件夹
hadoop fs -ls -R /
可以看到上图已经有刚刚创建的hdfsapi/test目录了!
哎,总之程序员这个行业真是需要细心!否则会各种被坑。。。当然本次的排错思路也少不了hadoop官方wiki,人家写的更加权威一些。链接如下:
https://wiki.apache.org/hadoop/ConnectionRefused