Я пытаюсь настроить запланированное задание в Anaconda Python 3.7 для отправки задания pyspark через livy api в кластер Kerberoized на HDP. Я использую pycurl (PycURL / 7.43.0.3 libcurl / 7.65.2 Schannel zlib / 1.2.11 libssh2 / 1.8.2) в Windows.
Шаги, которые я сделал до сих пор:
- Установка MIT Kerberos, настройка C: \ ProgramData \ MIT \ Kerberos5 \ krb5.ini
[libdefaults]
renew_lifetime = 7d
forwardable = true
default_realm = DATALAKE
ticket_lifetime = 24h
dns_lookup_realm = false
dns_lookup_kdc = false
default_ccache_name = FILE:C:/ProgramData/MIT/Kerberos5/krb5cc_%{uid}
[logging]
default = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
kdc = FILE:/var/log/krb5kdc.log
[realms]
DATALAKE = {
admin_server = host.datalake
kdc = host.datalake
}
Системная переменная среды, KRB5CCNAME = C: \ temp \ krb5cache
TGT можно увидеть из MIT kerberos UI. Однако из консоли есть два klist.exe. Из C: \ Windows \ System32 \ klist.exe я не вижу TGT. В C: \ Program Files \ MIT \ Kerberos \ bin \ klist.exe я вижу TGT, соответствующий пользовательскому интерфейсу.
import pycurl
from io import BytesIO
url = "http://ip:port/batches"
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(pycurl.URL, url)
curl.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json'])
curl.setopt(pycurl.WRITEDATA, buffer)
curl.setopt(pycurl.USERPWD, ':')
curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_GSSNEGOTIATE)
curl.setopt(pycurl.VERBOSE, True)
curl.perform()
print(curl.getinfo(pycurl.RESPONSE_CODE))
print(buffer.getvalue())
Ошибка, которую я получил 403
HTTP ERROR: 403
Problem accessing /batches.
Reason:org.apache.hadoop.security.authentication.client.AuthenticationException:GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
Powered by Jetty://
Однако, если я выполнил вышеуказанные шаги в Mac, это будет успех. Какие параметры мне не хватает в Windows? Pycurl не использует учетные данные, хранящиеся в KRB5CCNAME = C: \ temp \ krb5cache?