pyhdfs从本地复制\u,导致提供了nodename或servname,或者出现未知错误

rta7y2nd  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(429)

我使用下面的python代码从本地系统上传一个文件到远程hdfs pyhdfs ```
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
创建dir“jarvis”工作正常,但复制文件不起作用。我得到以下错误
回溯(最近一次呼叫):
文件“test\hdfs\u upload.py”,第14行,在client.copy\u from\u local('/tmp/data.json','/test.json')中
文件“/library/frameworks/python.framework/versions/3.6/lib/python3.6/site packages/pyhdfs.py”,第753行,从本地self.create复制(dest,f,**kwargs)
文件“/library/frameworks/python.framework/versions/3.6/lib/python3.6/site packages/pyhdfs.py”,第426行,在create metadata\u response.headers['location'],data=data,**self.\u requests\u kwargs)
file“/library/frameworks/python.framework/versions/3.6/lib/python3.6/site packages/requests/api.py”,第99行,输入返回请求('put',url,data=data,**kwargs)
文件“/library/frameworks/python.framework/versions/3.6/lib/python3.6/site packages/requests/api.py”,第44行,请求返回session.request(method=method,url=url,**kwargs)
file“/library/frameworks/python.framework/versions/3.6/lib/python3.6/site packages/requests/sessions.py”,第383行,请求resp=self.send(prep,**send\u kwargs)
文件“/library/frameworks/python.framework/versions/3.6/lib/python3.6/site packages/requests/sessions.py”,第486行,在send r=adapter.send(request,**kwargs)中
file“/library/frameworks/python.framework/versions/3.6/lib/python3.6/site packages/requests/adapters.py”,第378行,在send-raise-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:9000&overwrite=false超出了最大重试次数(原因:[errno 8]提供了节点名或服务名,或未知)
2ul0zpep

2ul0zpep1#

首先,检查 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() api调用来自pyhdfs库,hdfs节点管理器从hdfs集群随机挑选和分配一个节点,当它这样做时,它可能只返回一个与该节点关联的域名。然后尝试与该域建立http连接以执行操作。这是因为您的主机无法理解(无法解析)该域名而失败。
要解析域,您需要在 /etc/hosts 文件。
例如,如果您有一个hdfs集群,其中有一个namenode和两个datanode,具有以下ip地址和主机名:
192.168.0.1(名称节点1)
192.168.0.2(数据节点1)
192.168.0.3(数据节点2)
您需要更新您的 /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进行webhdfsapi调用。

相关问题