[HADOOP] 어떻게 읽기 및 파이썬을 사용하여 HDFS에 서면으로 프록시 오류를 해결하려면?
HADOOP어떻게 읽기 및 파이썬을 사용하여 HDFS에 서면으로 프록시 오류를 해결하려면?
나는 HDFS가있는 내가 읽고 파이썬 스크립트를 사용하여 작성하고자합니다.
import requests
import json
import os
import kerberos
import sys
node = os.getenv("namenode").split(",")
print (node)
local_file_path = sys.argv[1]
remote_file_path = sys.argv[2]
read_or_write = sys.argv[3]
print (local_file_path,remote_file_path)
def check_node_status(node):
for name in node:
print (name)
request = requests.get("%s/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus"%name,
verify=False).json()
status = request["beans"][0]["State"]
if status =="active":
nnhost = request["beans"][0]["HostAndPort"]
splitaddr = nnhost.split(":")
nnaddress = splitaddr[0]
print(nnaddress)
break
return status,name,nnaddress
def kerberos_auth(nnaddress):
__, krb_context = kerberos.authGSSClientInit("HTTP@%s"%nnaddress)
kerberos.authGSSClientStep(krb_context, "")
negotiate_details = kerberos.authGSSClientResponse(krb_context)
headers = {"Authorization": "Negotiate " + negotiate_details,
"Content-Type":"application/binary"}
return headers
def kerberos_hdfs_upload(status,name,headers):
print("running upload function")
if status =="active":
print("if function")
data=open('%s'%local_file_path, 'rb').read()
write_req = requests.put("%s/webhdfs/v1%s?op=CREATE&overwrite=true"%(name,remote_file_path),
headers=headers,
verify=False,
allow_redirects=True,
data=data)
print(write_req.text)
def kerberos_hdfs_read(status,name,headers):
if status == "active":
read = requests.get("%s/webhdfs/v1%s?op=OPEN"%(name,remote_file_path),
headers=headers,
verify=False,
allow_redirects=True)
if read.status_code == 200:
data=open('%s'%local_file_path, 'wb')
data.write(read.content)
data.close()
else :
print(read.content)
status, name, nnaddress= check_node_status(node)
headers = kerberos_auth(nnaddress)
if read_or_write == "write":
kerberos_hdfs_upload(status,name,headers)
elif read_or_write == "read":
print("fun")
kerberos_hdfs_read(status,name,headers)
코드는 프록시 뒤에 있지 내 자신의 컴퓨터에서 작동합니다. 프록시 뒤에 사무실 기계에서 실행하는 경우, 그것은 다음과 같은 프록시 오류를주고있다 :
$ python3 python_hdfs.py ./1.png /user/testuser/2018-02-07_1.png write
['https://<servername>:50470', 'https:// <servername>:50470']
./1.png /user/testuser/2018-02-07_1.png
https://<servername>:50470
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 555, in urlopen
self._prepare_proxy(conn)
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 753, in _prepare_proxy
conn.connect()
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 230, in connect
self._tunnel()
File "/usr/lib/python3.5/http/client.py", line 832, in _tunnel
message.strip()))
OSError: Tunnel connection failed: 504 Unknown Host
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 376, in send
timeout=timeout
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 610, in urlopen
_stacktrace=sys.exc_info()[2])
File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 273, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
requests.packages.urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='<servername>', port=50470): Max retries exceeded with url: /jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 504 Unknown Host',)))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "python_hdfs.py", line 68, in <module>
status, name, nnaddress= check_node_status(node)
File "python_hdfs.py", line 23, in check_node_status
verify=False).json()
File "/usr/lib/python3/dist-packages/requests/api.py", line 67, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python3/dist-packages/requests/api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 437, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='<server_name>', port=50470): Max retries exceeded with url: /jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 504 Unknown Host',)))
그래서 같은 코드에서 프록시 정보를 제공했습니다 :
proxies = {
"http": "<proxy_username>:<proxy_password>@<proxy_IP>:<proxy_port>",
"https": "<proxy_username>:<proxy_password>@<proxy_IP>:<proxy_port>",
}
node = os.getenv("namenode").split(",")
print (node)
local_file_path = sys.argv[1]
remote_file_path = sys.argv[2]
print (local_file_path,remote_file_path)
local_file_path = sys.argv[1]
remote_file_path = sys.argv[2]
read_or_write = sys.argv[3]
print (local_file_path,remote_file_path)
def check_node_status(node):
for name in node:
print (name)
request = requests.get("%s/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus"%name,proxies=proxies,
verify=False).json()
status = request["beans"][0]["State"]
if status =="active":
nnhost = request["beans"][0]["HostAndPort"]
splitaddr = nnhost.split(":")
nnaddress = splitaddr[0]
print(nnaddress)
break
return status,name,nnaddress
### Rest of the code is the same
이제 다음과 같은 오류를주고있다 :
$ python3 python_hdfs.py ./1.png /user/testuser/2018-02-07_1.png write
['https://<servername>:50470', 'https:// <servername>:50470']
./1.png /user/testuser/2018-02-07_1.png
https://<servername>:50470
Traceback (most recent call last):
File "python_hdfs.py", line 73, in <module>
status, name, nnaddress= check_node_status(node)
File "python_hdfs.py", line 28, in check_node_status
verify=False).json()
File "/usr/lib/python3/dist-packages/requests/api.py", line 67, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python3/dist-packages/requests/api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 343, in send
conn = self.get_connection(request.url, proxies)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 254, in get_connection
proxy_manager = self.proxy_manager_for(proxy)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 160, in proxy_manager_for
**proxy_kwargs)
File "/usr/lib/python3/dist-packages/urllib3/poolmanager.py", line 281, in proxy_from_url
return ProxyManager(proxy_url=url, **kw)
File "/usr/lib/python3/dist-packages/urllib3/poolmanager.py", line 232, in __init__
raise ProxySchemeUnknown(proxy.scheme)
requests.packages.urllib3.exceptions.ProxySchemeUnknown: Not supported proxy scheme <proxy_username>
그것이 작동하는 그래서, 내 질문은, 내가 커버 로스에서 프록시를 설정해야합니까? 그렇다면, 어떻게? 나는 Kerberos를 너무 익숙하지입니다. 나는 잘 실행하고 프록시없이 적절한 HDFS 서버에 연결하는 Kerberos 영역으로 입력하기 위해, 파이썬 코드를 실행하기 전에 kinit를 실행합니다. 읽거나 같은 HDFS 서버에 기록 할 때이 오류가 발생하는 이유 그래서 나는 모른다. 어떤 도움에 감사드립니다.
나는 또한과 같이 /etc/apt/apt.conf에서 설정 한 프록시를 가지고 :
Acquire::http::proxy "http://<proxy_username>:<proxy_password>@<proxy_IP>:<proxy_port>/";
Acquire::https::proxy "https://<proxy_username>:<proxy_password>@<proxy_IP>:<proxy_port>/";
나는 또한 다음을 시도했다 :
$ export http_proxy="http://<user>:<pass>@<proxy>:<port>"
$ export HTTP_PROXY="http://<user>:<pass>@<proxy>:<port>"
$ export https_proxy="http://<user>:<pass>@<proxy>:<port>"
$ export HTTPS_PROXY="http://<user>:<pass>@<proxy>:<port>"
import os
proxy = 'http://<user>:<pass>@<proxy>:<port>'
os.environ['http_proxy'] = proxy
os.environ['HTTP_PROXY'] = proxy
os.environ['https_proxy'] = proxy
os.environ['HTTPS_PROXY'] = proxy
#rest of the code is same
그러나 오류가 지속됩니다.
업데이트 : 나는 또한 다음을 시도했다.
파이썬 스크립트에서 프록시를 정의하지 않고 (I), 또한 (ⅱ) 파이썬 스크립트에 정의 된 프록시와 - 그리고 다시 파이썬 스크립트를 실행. 나는 두 경우 모두 같은 원래 프록시 오류가 발생했습니다.
우리는 jar 파일, HDFS.jar을하고 HDFS에서 실행되는 자바 프로그램을 사용하려면 다음 쉘 스크립트를 실행해야합니다.
nano run.sh
# contents of the run.sh file:
/tmp/sc3_temp/jre1.8.0_161/bin/java -Djavax.net.ssl.trustStore=/tmp/sc3_temp/cacerts -Djavax.net.ssl.trustStorePassword=changeit -jar /tmp/sc3_temp/HDFS.jar $1
그래서 나는 그것에게 HDFS에서 Java 프로그램을 실행할 수있는 액세스 권한을 부여 인수로 / 사용자 / testuser를이 쉘 스크립트를 실행할 수 있습니다 :
./run.sh /user/testuser/test2
이는 다음과 같은 출력을 제공한다 :
Debug is true storeKey false useTicketCache false useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false
Kerberos username [testuser]: testuser
Kerberos password for testuser:
[Krb5LoginModule] user entered username: testuser
principal is testuser@KRB.REALM
Commit Succeeded
login
2018-02-08 14:09:30,020 WARN [main] util.NativeCodeLoader (NativeCodeLoader.java:<clinit>(62)) - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Hello!
This is the end.
그래서, 내가 생각 일하고있다. 하지만 어떻게 파이썬 코드를 실행하기 위해 해당 쉘 스크립트를 작성하려면 어떻게해야합니까?
해결법
-
==============================
1.나는 해결책을 찾아 냈다. 내가 잘못된 장소에서 찾고 있던, 밝혀졌습니다. 사용자 계정이 잘못 설정 한 것 같다. 나는 서버에 웹 페이지를 다운로드하는 것처럼, 간단한 뭔가를 시도했다. 그리고 나는 그것이 페이지를 다운로드하는 것을 발견,하지만 그것을 해결 할 권한이 없었다. 그래서 좀 더 탐구하고 사용자 계정을 만들 때, 그것은 적절한 소유권을 할당되지 않았 음을 발견했다. 나는 사용자 계정에 적절한 소유자를 할당하면 그래서, 프록시 오류가 사라졌다. (한숨, 너무 많은 시간을 낭비.)
나는 해결책을 찾아 냈다. 내가 잘못된 장소에서 찾고 있던, 밝혀졌습니다. 사용자 계정이 잘못 설정 한 것 같다. 나는 서버에 웹 페이지를 다운로드하는 것처럼, 간단한 뭔가를 시도했다. 그리고 나는 그것이 페이지를 다운로드하는 것을 발견,하지만 그것을 해결 할 권한이 없었다. 그래서 좀 더 탐구하고 사용자 계정을 만들 때, 그것은 적절한 소유권을 할당되지 않았 음을 발견했다. 나는 사용자 계정에 적절한 소유자를 할당하면 그래서, 프록시 오류가 사라졌다. (한숨, 너무 많은 시간을 낭비.)
여기 자세한 내용에 대해 작성했습니다.
from https://stackoverflow.com/questions/48676514/how-to-resolve-proxy-error-in-reading-writing-to-hdfs-using-python by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하둡 하이브 카운트 동시성 (0) | 2019.09.29 |
---|---|
[HADOOP] "찾거나 메인 클래스를로드 할 수 없습니다"때문에 jar 파일을 실행할 수 없습니다 (0) | 2019.09.29 |
[HADOOP] Sqoop을 - 날짜 -timestamp (0) | 2019.09.29 |
[HADOOP] 탄성 검색 - 검색은 정확한 쿼리 UI를 사용하여 문자열을 일치 (0) | 2019.09.29 |
[HADOOP] 가능한 네이티브 물어 라이브러리하지 : libhadoop이 버전의 스마트 한 지원없이 지어졌습니다. 하이브 throgh 쿼리를 runnig 동안 (0) | 2019.09.29 |