hadoop+wsl 10.255.255.254,BlockMissingException: Could not obtain block: 踩坑

起因:

我在我的wsl中启动一个hadoop

用java客户端连接hadoop,读取某个文件的内容异常,但是读取文件名,文件路径好用

问题:

复制代码
BlockMissingException: Could not obtain block:BP-xxx

显示缺少文件块,因此我检查block块,也显示没有问题

复制代码
hdfs fsck [-options] <path> [...]

也试过初始化namenode、datanode, 都不好使

复制代码
# 格式化NameNode
hdfs namenode -format

# 删除datanode数据
rm -rf $HADOOP_HOME/data/data

最后我给代码加了log4j配置,打印debug日志,发现,请求了namenode后,他返回了一个很奇怪的datanode ip【10.255.255.254】,然后我在wsl中 ip a 发现了这个奇怪的ip,这个ip在wsl内部是可以访问的,但是我的windows访问wsl是不能通过这个ip进行访问的。

root@wsl01:~# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet 10.255.255.254/32 brd 10.255.255.254 scope global lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

link/ether 00:15:5d:23:8c:a2 brd ff:ff:ff:ff:ff:ff

inet 172.17.211.34/20 brd 172.17.223.255 scope global eth0

valid_lft forever preferred_lft forever

inet6 fe80::215:5dff:fe23:8ca2/64 scope link

valid_lft forever preferred_lft forever

相关文档

经过研究发现,这是wsl dns隧道开启的一个内部ip。

WSL 中的高级设置配置 | Microsoft Learn

|--------------------|---------|--------|---------------------------------|
| dnsTunneling** | boolean | true | 更改将 DNS 请求从 WSL 代理到 Windows 的方式 |

|-----------------------------|--------|------------------|----------------------------------------------------------------------------------------------|
| dnsTunnelingIpAddress** | string | 10.255.255.254 | 仅当 wsl2.dnsTunneling 设置为 true 时才适用。 指定启用 DNS 隧道的情况下将在 Linux resolv.conf 文件中配置的 nameserver。 |

解决方案

1、将dnsTunneling改成false,镜像网络直接设置成false,没啥影响 Windows 11 以上可用

2、新增dnsTunnelingIpAddress配置,设置成你的windows能认识的wsl ip(镜像网络不会弄。)

配置文件,文件路径为 C:\Users\<UserName>\.wslconfig Windows 11 版本 22H2以上可用

wsl2

#networkingMode=mirrored # 开启镜像网络

dnsTunneling=true

experimental

dnsTunnelingIpAddress=172.17.211.34

这样之后,就没有inet 10.255.255.254/32 brd 10.255.255.254 scope global lo

root@wsl01:~# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

link/ether 00:15:5d:23:8c:4f brd ff:ff:ff:ff:ff:ff

inet 172.17.211.34/20 brd 172.17.223.255 scope global eth0

valid_lft forever preferred_lft forever

inet6 fe80::215:5dff:fe23:8c4f/64 scope link

valid_lft forever preferred_lft forever

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default

link/ether 02:42:05:a2:d6:a5 brd ff:ff:ff:ff:ff:ff

inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

valid_lft forever preferred_lft forever

补充一点

ubuntu,/etc/resolv.conf 这个文件每次重启wsl都会变,可以加一个配置

vi /etc/wsl.conf

network

#取消自动生成 resolv.conf

generateResolvConf = false

或者直接暴力一点

mv /etc/resolv.conf /etc/resolv.conf_bak

echo 'nameserver 8.8.8.8' > /etc/resolv.conf

直接物理禁止修改 readonly,再重启也没办法改

chattr +i /etc/resolv.conf

取消readonly

chattr -i /etc/resolv.conf

其实就是两个问题

1:java访问hdfs时,获取文件元数据信息是访问的namenode,如果想访问文件内容,需要访问先namenode,然后返回文件所在的datanode的信息,然后拿到地址再去访问datanode,所以当你发现能访问文件元数据,但是没法获取文件内容的时候,考虑是不是不认识namenode返回的datanode地址(会返回hostsname),另外出问题,可以加log4j 看debug级别的报错内容。

2:wsl dns隧道会默认加一个172.17.255.255内部通信地址,但是这个地址windows不认识,要么删掉他,要么改掉他

但是为什么 我有这么多ip,他偏偏返回10.255.255.254这个ip呢?我也不懂,感觉是hadoop认为这是一个本地请求所以,返回了一个内部地址。。以后再研究这个问题

相关推荐
瑞熙贝通实验室综合管理平台40 分钟前
实验动物管理系统|以痛点为核心 构建动物房数字化管理新体系
linux
黄筱筱筱筱筱筱筱3 小时前
LINUX-防火墙
linux·服务器·网络
сокол3 小时前
【网安-Web渗透测试-靶场系列】AWD-Platform(ctf-hub)
linux·服务器·ubuntu·网络安全·docker
utf8mb4安全女神4 小时前
Linux系统服务相关命令【定时任务设置】【任务进程管理】【防火墙区域应用】
linux·运维·服务器
不吃土豆的马铃薯7 小时前
Spdlog 进阶:日志基本控制、日志格式控制、异步记录器
linux·服务器·开发语言·前端·c++
疯狂成瘾者7 小时前
常见的 Linux 版本
linux·运维·服务器
szxinmai主板定制专家7 小时前
基于ZYNQ MPSOC图像采集与压缩系统总体设计方案
linux·arm开发·人工智能·嵌入式硬件·fpga开发
liulilittle8 小时前
TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法
linux·网络·c++·tcp/ip·算法·c·通讯
tianrun12348 小时前
Ubuntu 24.04 安装 Fcitx5 + Rime + 搜狗词库(替代 IBus 与 Linux 搜狗输入法)
linux·运维·ubuntu
wxytxdy9 小时前
通过猜数字游戏学习Shell脚本的分支、循环编写
linux·学习