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.