尝试从 HDFS 读取文件时由于连接超时,无法连接到位于 192.168.99.100:50070 的 Hadoop NameNode

问题描述 投票:0回答:1

尝试从 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) 来访问容器。

python docker hadoop hdfs docker-network
1个回答
0
投票

您无法跨网络边界进行连接。使用“边缘节点”或WebHDFS / HUE容器读取文件

或者使用 Ozone/MinIO 而不是 HDFS

© www.soinside.com 2019 - 2024. All rights reserved.