从MySQL导入数据到Hadoop遇连接异常,请求技术支持
问题分析与解决方案
从你的错误日志里能看到两个核心问题:
java.net.UnknownHostException: host: host: unknown error:主机名解析失败,Hadoop无法正确识别你的机器主机名java.net.ConnectException: Connection refused:无法连接到HDFS的NameNode端口(默认9000)
下面是一步步的排查和修复步骤:
1. 修复主机名解析问题
首先,确保你的机器主机名能正确解析到127.0.0.1或者你的实际IP:
- 编辑
/etc/hosts文件(Linux/macOS)或者C:\Windows\System32\drivers\etc\hosts(Windows) - 添加一行:
127.0.0.1 your-hostname(把your-hostname换成你机器的实际主机名,可通过hostname命令查看) - 保存文件后,执行
ping your-hostname验证是否能解析到正确的IP
2. 检查HDFS服务状态
连接被拒绝通常是因为NameNode没启动,或者端口配置不对:
- 执行
jps命令,查看是否有NameNode进程在运行 - 如果没有,启动HDFS服务:
start-dfs.sh(Linux/macOS)或者对应的Windows启动脚本 - 验证NameNode是否正常:访问
http://localhost:50070(Hadoop 2.x)或者http://localhost:9870(Hadoop 3.x),确认服务正常
3. 确认HDFS端口配置
检查Hadoop的core-site.xml文件(通常在$HADOOP_HOME/etc/hadoop目录下),确认以下配置是否正确:
<property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property>
如果你的NameNode用了其他端口,要同步修改这个配置项,然后重启HDFS服务。
4. 处理HDFS目标路径问题
Sqoop默认不允许写入已存在的目录,你可以二选一:
- 先手动删除目标目录:
hadoop fs -rm -r /sqoopout - 或者在Sqoop命令里添加
--delete-target-dir参数强制覆盖:
sqoop import --connect jdbc:mysql://localhost/sqoopdb --username 'root' -P --table 'company' --target-dir '/sqoopout' --delete-target-dir -m 1
另外,要确保执行Sqoop的用户有HDFS的写入权限,可通过hadoop fs -mkdir /sqoopout先手动创建目录测试权限。
5. 验证MySQL连接(可选)
虽然错误主要在HDFS这边,但可以先确认MySQL连接是否正常:
sqoop eval --connect jdbc:mysql://localhost/sqoopdb --username 'root' -P --query "SELECT * FROM company LIMIT 1"
如果这个命令能正常返回数据,说明MySQL连接没问题,问题确实在Hadoop侧。
按照上面的步骤排查下来,应该能解决你的导入问题。如果还有疑问,把排查过程中的结果补充上来,我再帮你分析。
内容的提问来源于stack exchange,提问作者Saurabh P
相关产品推荐
相关产品推荐

