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

ops/2024/11/22 13:56:03/

起因:

我在我的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 以上可用

[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认为这是一个本地请求所以,返回了一个内部地址。。以后再研究这个问题


http://www.ppmy.cn/ops/135800.html

相关文章

我用豆包MarsCode IDE 做了一个 CSS 权重小组件

作者&#xff1a;夕水 查看效果 作为一个前端开发者&#xff0c;应该基本都会用 VSCode 来做开发&#xff0c;所以也应该见过如下这张图的效果: 以上悬浮面板分为2个部分展示内容。 <element class"hljs-attr">: 代表元素只有一个类名叫hljs-attr的类选择器&am…

使用 npm 安装 Electron 作为开发依赖

好的&#xff0c;下面是一个使用 npm pack 和 npm install 命令来打包和安装离线版本的 npm 包的具体示例。我们将以 electron 为例&#xff0c;演示如何在有网络连接的机器上打包 electron&#xff0c;然后在没有网络连接的机器上安装它。 步骤 1: 在有网络连接的机器上打包 …

计算机网络(第一章)

文章目录 概述1.1计算机网络在信息时代的作用1.2因特网概述1. 网络,互连网(互联网)和因特网2. 因特网发展的三个阶段3.因特网的标准化工作4.因特网的组成 1.3 三种交换方式电路交换 (Circuit Switching)分组交换 (Packet Switching)报文交换 (Message Switching)三个交换的对比…

js制作文字走马灯

走马灯是一种常见的网页效果&#xff0c;可以用来展示图片或文字的循环滚动。 1. 关于HTML结构 添加可视区域用户可见部分&#xff0c;给走马灯文字内容制作了个盒子来存放他 <div class"notice"><img src"./img/7.jpg" alt"通知图标&quo…

【Element Ui】el-checkbox 的 indeterminate 与 v-model 表示 “全选”、“待选”、“不选” 状态

官网链接&#xff1a; https://element-plus.org/zh-CN/component/checkbox.html indeterminate 与 v-model indeterminate 属性用以表示 checkbox 的不确定状态&#xff0c;一般用于实现全选的效果。v-model 是绑定值indeterminate 与 v-model 对应不同值的组合可以改变 che…

从0开始学习Linux——MySQL安装多种方式详解

期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开始…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库&#xff0c;用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具&#xff0c;使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码&#xff0c;并在本地进行编译。 TilesB…

【第七课】Rust所有权系统(三)

目录 前言 生命周期 生命周期的规则 总结 前言 上一节课讲述了所有权系统中的引用与借用&#xff0c;引用可以让我们对一块内存上的数据有读权限或者读写权限&#xff0c;但是不会有该内存的释放权限&#xff0c;因为释放权限只会属于所有者&#xff0c;这是所有权原则中的…