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" работает нормально, но копирование файла не работает. Я получаю следующую ошибку

Отслеживание (последний вызов последним):
Файл "test_hdfs_upload.py", строка 14, в client.copy_from_local ('/ tmp / data.json', '/ test.json')
Файл "/ Библиотека / 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) < br> 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)
Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/session s.py ", строка 383, в запросе resp = self.send (prepare, ** send_kwargs)
Файл" /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ request / 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, при отправке вызывает ошибку 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] имя узла или имя сервера указаны или неизвестны)


person Sunil Rao    schedule 14.12.2017    source источник


Ответы (1)


Сначала проверьте, включен ли webhdfs для вашего кластера HDFS. Библиотека PyHDFS использует файлы webhdf, поэтому файлы webhdf необходимо включить в конфигурации HDFS. Чтобы включить файлы webhdf, измените 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 с узлом имени и двумя узлами данных, со следующими 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, и вы сможете делать вызовы API webhdfs через PyHDFS.

person Amith Koujalgi    schedule 04.01.2018