外网无法访问hdfs文件系统

由于本地测试和服务器不在一个局域网,安装的hadoop配置文件是以内网ip作为机器间通信的ip.

在这种情况下,我们能够访问到namenode机器,

namenode会给我们数据所在机器的ip地址供我们访问数据传输服务,

但是返回的的是datanode内网的ip,我们无法根据该IP访问datanode服务器.

报错如下

2018-06-06 17:01:44,555 [main] WARN  [org.apache.hadoop.hdfs.BlockReaderFactory] - I/O error constructing remote block reader.
java.net.ConnectException: Connection timed out: 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.hdfs.DFSClient.newConnectedPeer(DFSClient.java:3450)
    at org.apache.hadoop.hdfs.BlockReaderFactory.nextTcpPeer(BlockReaderFactory.java:777)
    at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReaderFromTcp(BlockReaderFactory.java:694)
    at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:355)
    at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:665)
    at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:874)
    at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:926)
    at java.io.DataInputStream.read(DataInputStream.java:149)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at com.feiyangshop.recommendation.HdfsHandler.main(HdfsHandler.java:36)
2018-06-06 17:01:44,560 [main] WARN  [org.apache.hadoop.hdfs.DFSClient] - Failed to connect to /192.168.1.219:50010 for block, add to deadNodes and continue. java.net.ConnectException: Connection timed out: no further information
java.net.ConnectException: Connection timed out: 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.hdfs.DFSClient.newConnectedPeer(DFSClient.java:3450)
    at org.apache.hadoop.hdfs.BlockReaderFactory.nextTcpPeer(BlockReaderFactory.java:777)

为了能够让开发机器访问到hdfs,我们可以通过域名访问hdfs.

namenode返回给我们datanode的域名,在开发机器的hosts文件中配置datanode对应的外网ip和域名,并且在与hdfs交互的程序中添加如下代码即可

import org.apache.hadoop.conf.Configuration;

Configuration conf = new Configuration();
//设置通过域名访问datanode
conf.set("dfs.client.use.datanode.hostname", "true");

windows bug

还有一个就是比较常见的bug

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSums(IILjava/nio/ByteBuffer;ILjava/nio/ByteBuffer;IILjava/lang/String;JZ)V
    at org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSums(Native Method)
    at org.apache.hadoop.util.NativeCrc32.verifyChunkedSums(NativeCrc32.java:59)
    at org.apache.hadoop.util.DataChecksum.verifyChunkedSums(DataChecksum.java:301)
    at org.apache.hadoop.hdfs.RemoteBlockReader2.readNextPacket(RemoteBlockReader2.java:231)
    at org.apache.hadoop.hdfs.RemoteBlockReader2.read(RemoteBlockReader2.java:152)
    at org.apache.hadoop.hdfs.DFSInputStream$ByteArrayStrategy.doRead(DFSInputStream.java:767)
    at org.apache.hadoop.hdfs.DFSInputStream.readBuffer(DFSInputStream.java:823)
    at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:883)
    at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:926)
    at java.io.DataInputStream.read(DataInputStream.java:149)

windows中的HADOOP_HOME里的bin目录下的脚本是32位的,应该替换成支持windows版本的64位的,我这有编译好的windows64位版本的hadoop包,如果缺少可以通过下面的链接下载.

这个应该是win7-64位版本的,但是我使用win10-64位机器也可以使用.

链接:https://pan.baidu.com/s/13Mf3m2fXt0TnXwgsiDejEg 密码:pajo

还需要在idea中配置环境参数

HADOOP_HOME=E:\hadoop\hadoop-2.6.1
PATH=%PATH%;E:\hadoop\hadoop-2.6.1\bin

FIN

原文地址:https://www.cnblogs.com/krcys/p/9146329.html

时间: 2024-08-28 22:14:16

外网无法访问hdfs文件系统的相关文章

用小米路由搭建外网可访问的个人网站

家里的小米路由R1D用了近一年,只是做一个普通的路由器使用,实在太浪费了.最近学习移动端编程,感觉和PC时代最大的不同就在于移动端产品更重云和端的配合.于是就花了一晚上捣鼓捣鼓,在小米路由上搭建了一套可从外网访问的web 服务,以便手机上做的玩意儿可以随时随地获得私有云的支持.把搭建路径备案记录下来: 第一步.先把小米路由刷到开发版ROM. 后面ssh登录需要开发版ROM支持.注意:先保存路由器上的所有数据!!!比如宽带账号.密码信息,这些信息一般在装完宽带后就很少用到了,一定确保先找到这些数据

外网主机访问虚拟机下的web服务器(NAT端口转发)

主机:系统win7,ip地址172.18.186.210 虚拟机:VMware Workstation 7,虚拟机下安装了Centos操作系统,ip地址是192.168.202.128,部署了LAMP,成为一个web服务器 网络环境:校园网(有认证服务器,需要账号认证才能上网),虚拟机采用NAT的方式联网 在校园网的环境下,可以把校园网内的其他主机看成是外网的主机.其实,虚拟机采用NAT联网的方式,可以让我们联想到计算机网络的相关知识,可以把我们的主机看成是一部路由器,然后虚拟机就是处在一个局域

将电脑变成外网可访问的服务器

一 前言 很多时候需要让别人能直接看到你布署在本机的网站或者服务时,通常是买空间或者服务器把网站布署发布上去,如此一来即花钱又麻烦,有没有更简单点的方法可以实现,直接把本机的网站公开到外网去呢? 这个就是今天要讲一东西 二 资源 路由器  花生壳 2.1  注册花生壳 然后生成一个免费的域名,因为是免费的所以一般都是无规则的 如 t14x528135.imwork.net 2.2  需要一个路由器并设置DNS服务,并在 服务提供商 选花生壳 并输入花生壳的 用户名 密码  域名 如下图 因为我的

tomcat外网无法访问80和8080端口,其他端口可以访问

tomcat外网无法访问80和8080端口,其他端口都可以访问,很明显地看出这是运营商的问题,他们把80和8080端口对外访问屏蔽了. 解释:这两个端口是常用的HTTP协议端口,目的是防止未备案的网站对外发布. 解决办法:修改tomcat端口号或申请一个已经备案的域名指向该服务器并且向运营商要求开通.

Windows Server 2008上MYSQL外网无法访问有关问题解决

公司断网了 网络恢复之后 一直提示连不上MySQL服务器 本地能连接 远程不行 解决方法如下:选择:网络->windows 防火墙->高级设置->入站规则然后点击右上角的新建规则选择"端口" 下一步,输入3306端口,加入规则,然后再次点击新建规则选择"程序" 找到mysql bin下的启动路径,加入规则 然后外部访问mysql.成功!!!! 这个是防火墙的问题 Windows Server 2008上MYSQL外网无法访问有关问题解决,布布扣,b

外网无法访问tomcat

最近遇到外网无法访问tomcat的问题.我没开防火墙,所以不是防火墙的问题.最后才知道电信把80(全国范围)和8080端口(部分地区)禁掉了,而我刚好尝试映射了这2个端口,结果无法访问.最后将端口设为8888,问题解决! 外网无法访问tomcat,布布扣,bubuko.com

nat123外网SSH访问内网LINUX的N种方法

一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限,LINUX主机部署在路由内网.如何实现外网SSH访问内网LINUX主机? 2,解决方案: 使用nat123动态域名解析,解决动态公网IP问题. 3,实现过程: 方法一:在同局域网下另一台windows主机中使用动态解析windows版. 动态域名解析windows版,实现步骤参考<外网访问内网LINUX-动态公网IP动态域名解析-windows版> 方法二:在被访问端Linux主机中使用动态域名解析Linux版

如何在外网中访问自己在另一个局域网中的某个机器(SSH为例)

UBUNTU 14.04 LTS 为例 如何在外网中访问自己在另一个局域网中的某个机器(SSH为例) 2013-05-01 16:02 2693人阅读 评论(0) 收藏 举报 情景描述: 计算机C1放置在局域网LN1中,LN1中的所有计算机都链接到了路由器R1上. 计算机C2放置在另一个局域网LN2中,并且LN1与LN2不属于同一个基于网. 要实现的功能: 使用C2通过SSH链接到C1上. 要求: 必须要从C1端操作.(这里假设C1为Linux) 步骤: C1端配置 1, ifconfig 来获

win10内网外网智能访问

当电脑同时连接有线和WiFi时(有线连接为内网,WiFi为外网),会出现内网和外网内容无法同时访问的情况. 本方法实现内网和外网的同时访问. 第一步: 输入指令 “route print ” 查看路由表: 第二步: 输入“route delete 0.0.0.0” 删除默认路由: 第三步: 输入“route add 10.0.0.0 mask 255.0.0.0 10.1.9.1” 添加路由: 输入“route add 0.0.0.0 mask 0.0.0.0 192.168.199.1” 添加