写过一篇 发表于 2024-12-5 04:22:41

hadoop+wsl 10.255.255.254,BlockMissingException: Could not obtain blo

起因:

我在我的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**booleantrue更改将 DNS 请求从 WSL 代理到 Windows 的方式 dnsTunnelingIpAddress**string10.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 以上可用
   
#networkingMode=mirrored # 开启镜像网络
dnsTunneling=true

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

#取消自动天生 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以为这是一个本地请求以是,返回了一个内部地点。。以后再研究这个题目

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: hadoop+wsl 10.255.255.254,BlockMissingException: Could not obtain blo