java - 尽管服务已经启动,但不允许远程访问namenode。

标签 java ubuntu hadoop hdfs netstat

我在ip为192.168.1.109的单台计算机上成功安装并运行了Hadoop(实际上,它实际上是在虚拟机上运行的Ubuntu实例)。
键入jps时显示

2473数据节点

2765 TaskTracker

3373 Jps

2361名称节点

2588 SecondaryNameNode

2655 JobTracker

这应该意味着Hadoop已启动并正在运行。
运行./hadoop fs -ls之类的命令很好,并且可以产生预期的结果。

但是如果我尝试通过写从IP为192.168.1.80的Windows盒连接它
Java代码的HDFS API连接它的方法如下:

配置conf = new Configuration();

文件系统hdfs = null;

路径filenamePath =新路径(FILE_NAME);

hdfs = FileSystem.get(conf); <-此行出现问题

当我运行代码时,错误显示如下:

2007年11月12日20:37:24信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了0次。

2007年11月12日20:37:26信息ipc.Client:重试连接到服务器:/192.168.1.109:9000。已尝试1次。

2007年11月12日20:37:28信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了2次。

2007年11月12日20:37:30信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了3次。

2007年11月12日20:37:32信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了4次。

2007年11月12日20:37:33信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了5次。

2007年11月12日20:37:35信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了6次。

2007年11月12日20:37:37信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了7次。

2007年11月12日20:37:39信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了8次。

2007年11月12日20:37:41信息ipc。客户端:重试连接到服务器:/192.168.1.109:9000。已经尝试了9次。

java.net.ConnectException:在发生连接异常时对/192.168.1.109:9000的调用失败:java.net.ConnectException:连接被拒绝:无更多信息

为了确保套接字是否已经打开并等待hadoop serer上的传入连接,我在ubuntu框上使用netstat
结果显示如下:

tcp 0 0本地主机:51201:LISTEN 2765/java
tcp 0 0 *:50020:LISTEN 2473/java
tcp 0 0本地主机:9000:LISTEN 2361/java
tcp 0 0本地主机:9001:LISTEN 2655/java
tcp 0 0 *:mysql:LISTEN-
tcp 0 0 *:50090:LISTEN 2588/java
tcp 0 0 *:11211:LISTEN-
tcp 0 0 *:40843:LISTEN 2473/java
tcp 0 0 *:58699:LISTEN-
tcp 0 0 *:50060:LISTEN 2765/java
tcp 0 0 *:50030:LISTEN 2655/java
tcp 0 0 *:53966:LISTEN 2655/java
tcp 0 0 *:www:LISTEN-
tcp 0 0 *:epmd:LISTEN-
tcp 0 0 *:55826:LISTEN 2588/java
tcp 0 0 *:ftp:LISTEN-
tcp 0 0 *:50070:LISTEN 2361/java
tcp 0 0 *:52822:LISTEN 2361/java
tcp 0 0 *:ssh:LISTEN-
tcp 0 0 *:55672:LISTEN-
tcp 0 0 *:50010:LISTEN 2473/java
tcp 0 0 *:50075:LISTEN 2473/java

我注意到,如果本地地址列类似于localhost:9000(以localhost:开头,而不是* :)
在某些情况下,它将无法从远程主机甚至在自己的盒子中进行连接。
我尝试使用telnet localhost 9000可以工作,我的意思是它可以连接到端口,但是如果我使用telnet 192.168.1.109 9000
错误显示如下

$ telnet 192.168.1.109 9000
正在尝试192.168.1.109 ...
telnet:无法连接到远程主机:连接被拒绝


我花了将近一个星期的时间来弄清我现在已经筋疲力尽的问题,希望有人可以帮助我。

注意:我不确定namenode默认情况下是否拒绝远程连接。我是否需要更改某些设置才能允许
远程连接?

最佳答案

对于客户端和NameNode,将core-site.xml中fs.default.name的值从hdfs://106.77.211.187:9000更改为hdfs://localhost:9000。将IP地址替换为运行NameNode的节点的IP地址或主机名。

能够telnet 106.77.211.187 9000,这是netstat -a | grep 9000的输出

tcp6 0 0 106.77.211.187:9000 [::]:* LISTEN
tcp6 0 0 106.77.211.187:50753 106.77.211.187%819:9000 ESTABLISHED
tcp6 0 0 106.77.211.187:9000 106.77.211.187%81:50753 ESTABLISHED



至于为什么,将fs.default.name设置为localhost的源代码如下所示

ServerSocket socket = new ServerSocket(9000);
socket.bind(localhost);



由于绑定(bind)地址已分配给localhost,因此namenode进程只能接受来自localhost的连接。如果将绑定(bind)地址分配给计算机名称或IP地址,则namenode进程可以接受来自远程计算机的任何连接。

关于java - 尽管服务已经启动,但不允许远程访问namenode。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8693723/

相关文章:

apache-spark - 找不到pyspark.zip,应用程序application_1558064260263_0001由于AM容器而失败了2次

java - 映射 Java 的接口(interface)方法

java - 无法将 JSON 对象提交到 JSP

java - 请求大小为 0 的 Android Java Sqlite 异常索引 0

java - 单击应用程序菜单中的 Eclipse 图标后,Linux 上的 Eclipse JEE 未启动。它仅从已安装的目录中打开

java - 如何从 MapReduce 中引用本地 HDFS 文件?

java - 为什么这个 Java 正则表达式与我的字符串不匹配?

linux - 制作-j 8 g++ : internal compiler error: Killed (program cc1plus)

python - 使用 python 和 R 最小化 docker 镜像

java - 有没有可能从Java API启动我的hbase?