1

我正在使用以下 python 代码将文件从本地系统上传到远程 HDFSpyhdfs

from pyhdfs import HdfsClient
client = HdfsClient(hosts='1.1.1.1',user_name='root')
client.mkdirs('/jarvis')
client.copy_from_local('/my/local/file,'/hdfs/path')

使用python3.5/。Hadoop 在默认端口中运行:50070 1.1.1.1 是我的远程 Hadoop url

创建目录“jarvis”工作正常,但复制文件不起作用。我收到以下错误

回溯(最后一次调用):
文件“test_hdfs_upload.py”,第 14 行,在 client.copy_from_local('/tmp/data.json','/test.json')
文件“/Library/Frameworks/Python.framework/ Versions/3.6/lib/python3.6/site-packages/pyhdfs.py”,第 753 行,在 copy_from_local self.create(dest, f, **kwargs)
文件“/Library/Frameworks/Python.framework/Versions/3.6 /lib/python3.6/site-packages/pyhdfs.py”,第 426 行,在创建 metadata_response.headers['location'], data=data, **self._requests_kwargs)
文件“/Library/Frameworks/Python.framework /Versions/3.6/lib/python3.6/site-packages/requests/api.py”,第 99 行,输入返回请求('put',url,data=data,**kwargs)
请求返回 session.request(method=method, url=url, **kwargs)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py”,第 383 行,在请求中 resp = self.send(prep, * *send_kwargs)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py”,第 486 行,发送 r = adapter.send(request, **夸格斯)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py”,第 378 行,在发送中引发 ConnectionError(e) requests.exceptions.ConnectionError: HTTPConnectionPool( host='ip-1-1-1-1', port=50075): 最大重试次数超出 url: /webhdfs/v1/test.json?op=CREATE&user.name=root&namenoderpcaddress=ip-1-1-1- 1:9000&overwrite=false(由:[Errno 8] 节点名或服务名提供,或未知)

4

1 回答 1

4

首先,检查是否webhdfs为您的 HDFS 集群启用。PyHDFS 库使用 webhdfs,因此需要在 HDFS 配置中启用 webhdfs。要启用 webhdfs,修改hdfs-site.xml如下:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/path/to/namenode/dir/</value>
    </property>
    <property>
        <name>dfs.checkpoint.dir</name>
        <value>file:/path/to/checkpoint/dir/</value>
    </property>
    <property>
        <name>dfs.checkpoints.edits.dir</name>
        <value>file:/path/to/checkpoints-ed/dir/</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/path/to/datanode/dir/</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
</configuration>

此外,当copy_from_local()从 PyHDFS 库进行 API 调用时,HDFS 节点管理器会从 HDFS 集群中随机选择并分配一个节点,当它这样做时,它可能只返回一个与该节点关联的域名。然后尝试与该域建立 HTTP 连接以执行操作。这是因为您的主机不理解(无法解析)该域名而失败。

要解析域,您需要在/etc/hosts文件中添加适当的域映射。

例如,如果您有一个 HDFS 集群,其中包含一个名称节点和 2 个数据节点,具有以下 IP 地址和主机名:

  • 192.168.0.1 (NameNode1)
  • 192.168.0.2 (DataNode1)
  • 192.168.0.3 (DataNode2)

您将需要/etc/hosts按如下方式更新您的文件:

127.0.0.1     localhost
::1           localhost
192.168.0.1   NameNode1
192.168.0.2   DataNode1
192.168.0.3   DataNode2

这将启用从主机到 HDFS 集群的域名解析,并且您可以通过 PyHDFS 进行 webhdfs API 调用。

于 2018-01-04T20:01:02.140 回答