Pyhdfs copy_from_local, вызывающий имя узла или имя сервера, или неизвестная ошибка

Я использую следующий код 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 - это мой удаленный URL Hadoop

Создание каталога "jarvis" работает нормально, но копирование файла не работает. Я получаю следующую ошибку

Traceback (последний вызов был последним):
Файл "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, в create 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)
Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/api.py", строка 44, в запросе возвращает 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, в send r = adaptor.send(запрос, ** kwargs)
Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py", строка 378, в файле send, вызывает ConnectionError(e) запросы. 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] имя узла или имя сервера указаны или неизвестны)

1 ответ

Решение

Во-первых, проверьте, если 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 и 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, и вы сможете делать вызовы webhdfs API через PyHDFS.

Другие вопросы по тегам