尝试从 Python 脚本连接到 Docker 容器内运行的 Hadoop HDFS 实例时,遇到 ConnectTimeout 错误。该脚本应该使用 WebHDFS 从 HDFS 读取文件,但在尝试建立与 NameNode 的连接时超时。这是我看到的错误消息:
requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='192.168.99.100', port=50070): Max retries exceeded with url: /webhdfs/v1/user/hadoop/real_estate_data/Real_Estate_Sales.csv?user.name=modhv&offset=0&op=OPEN (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001E77F4D7B30>, 'Connection to 192.168.99.100 timed out. (connect timeout=None)'))
环境: Python版本:3.12 库:requests、urllib3、hdfs、pandas Docker 镜像:suhothayan/hadoop-spark-pig-hive:2.9.2 泊坞窗版本:4.37.1 操作系统:Windows 11
采取的步骤: 我正在 Docker 容器内运行 Hadoop 集群,并尝试通过 WebHDFS 访问 HDFS。 容器正在运行,并暴露以下端口: 名称节点 50070 50075 用于数据节点 我已确认 Hadoop 服务(NameNode 和 DataNode)已在容器内启动并运行。 我在Python脚本中使用了Docker IP 172.17.0.2甚至localhost来连接到HDFS。 当尝试运行 Python 脚本时,它始终失败并出现 ConnectTimeoutError。当在浏览器中使用 https://localhost/50070 和 https://172.17.0.2/50070 时,它很好。代码:
from hdfs import InsecureClient
import pandas as pd
# Connect to HDFS using the container's IP address
client = InsecureClient('http://localhost:50070') # Use the container IP
# Correct HDFS file path
hdfs_file_path = '/user/hadoop/real_estate_data/Real_Estate_Sales.csv'
# Read the file from HDFS
with client.read(hdfs_file_path) as reader:
df = pd.read_csv(reader)
# Display the first few rows of the DataFrame
print(df.head())
错误信息:
requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='192.168.99.100', port=50070): Max retries exceeded with url: /webhdfs/v1/user/hadoop/real_estate_data/Real_Estate_Sales.csv?user.name=modhv&offset=0&op=OPEN (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001E77F4D7B30>, 'Connection to 192.168.99.100 timed out. (connect timeout=None)'))
故障排除完成: 1.Hadoop服务:我已经验证HDFS和YARN都在Docker容器内运行。 2.端口暴露:50070和50075端口通过Docker正确暴露并映射到主机。 3.防火墙:Windows防火墙已暂时禁用以测试连接。 4.测试连接:我尝试从浏览器访问NameNode Web UI,网址为http://192.168.99.100:50070,但超时。 5.Docker网络模式:我也检查了容器的网络模式,设置为bridge。我尝试使用 Docker VM 的 IP (192.168.99.100) 来访问容器。
您无法跨网络边界进行连接。使用“边缘节点”或WebHDFS / HUE容器读取文件
或者使用 Ozone/MinIO 而不是 HDFS