Java连不上HDFS出现UnknownHostException,主因是core-site.xml未正确配置或未加载:fs.defaultFS值需可解析,须检查DNS/hosts、classpath路径、Spring Boot手动加载、版本匹配、Kerberos依赖、Configuration加载顺序及Windows下winutils.exe配置。

Java 连不上 HDFS:java.net.UnknownHostException 怎么办
不是代码写错了,大概率是 core-site.xml 没配对或没加载进 classpath。Hadoop 客户端不读环境变量或系统 hosts,只认配置文件里 fs.defaultFS 的值,且必须能被 DNS 解析或本地 /etc/hosts 映射到真实 IP。
-
fs.defaultFS值写成hdfs://hadoop-cluster:9000?确认hadoop-cluster能被 Java 进程解析——用InetAddress.getByName("hadoop-cluster")测试 - 别把
core-site.xml和hdfs-site.xml放在src/main/resources就以为万事大吉;Maven 构建后检查target/classes/下是否存在这两个文件 - Spring Boot 项目容易踩坑:默认不加载
hadoop-*配置,得手动用Configuration.addResource()加载,不能只靠 classpath 扫描
maven 依赖版本和 Hadoop 集群不匹配的典型表现
连上去了但 listStatus() 报 RemoteException: Server IPC version 9 does not match client IPC version 7,这是最直白的版本错位信号。Hadoop RPC 协议版本硬绑定,客户端 jar 必须和集群主版本一致(比如 Hadoop 3.3.6 就得用 hadoop-client 3.3.6)。
- 不要用
hadoop-client的2.x版本连3.x集群,反之亦然;3.2.x和3.3.x之间也不保证兼容 - 排除传递依赖里的旧版 hadoop:检查
mvn dependency:tree -Dincludes=org.apache.hadoop,用<exclusions></exclusions>干掉冲突项 - 如果集群启用了 Kerberos,还得额外加
hadoop-auth,且版本必须和hadoop-client一致,否则LoginException: No LoginModules configured
FileSystem.get() 返回的是 LocalFileSystem 而不是 DistributedFileSystem
说明 fs.defaultFS 没生效,或者配置被覆盖了。JVM 启动时会按顺序加载多个 Configuration 实例,后加载的会覆盖前者的同名属性。
- 别在代码里 new Configuration() 后直接调用
get()—— 这个空实例默认走file:///,得先addResource("core-site.xml") - 避免同时使用
new Configuration(true)(加载默认资源)和手动 addResource,容易因加载顺序导致fs.defaultFS被重置 - 验证方法:打印
fs.getUri(),如果是file:///或file://,说明根本没连上 HDFS;正确应为hdfs://xxx:9000
Windows 下运行 HDFS 客户端报 java.io.IOException: Could not locate executable nullinwinutils.exe
Hadoop Java 客户端在 Windows 上需要 winutils.exe 提供本地文件操作支持,但这个二进制文件不在官方发行包里,得单独下载适配版本。
立即学习“Java免费学习笔记(深入)”;
- 别用网上随便搜的
winutils.exe,必须和你引用的hadoop-client主版本号一致(例如用 3.3.6 就得下 Hadoop 3.3.6 编译的 winutils) - 设置系统环境变量
HADOOP_HOME指向包含bin/winutils.exe的目录,并确保该目录在 PATH 中 - 更稳妥的做法:代码里提前执行
System.setProperty("hadoop.home.dir", "C:\hadoop");,绕过环境变量查找逻辑










