Bei meinem derzeitigen Kunden verwenden wir Sonatype Nexus, um unsere Artefakte zu speichern. Das Repository ist mit einem Benutzernamen/Passwort gesichert, sowohl für die Veröffentlichung als auch für das Herunterladen von Artefakten.
Spark bietet Unterstützung für bestimmte Repositories mit der Konfiguration --repositories.
Wir verwenden es so:
pyspark --Repositorien https://readonly:secret_password@nexus/repository/maven-public/ --packages com.example:foobar:1.0.0
Leider sind wir auf das folgende Problem gestoßen:
==== repo-1: versucht https://readonly:secret_password@nexus/repository/maven-public/com/example/foobar/1.0.0/foobar-1.0.0.pom -- Artefakt com.example#foobar;1.0.0!foobar.jar: https://readonly:secret_password@nexus/repository/maven-public/com/example/foobar/1.0.0/foobar-1.0.0.jar :::::::::::::::::::::::::::::::::::::::::::::: :: NICHT AUFGELÖSTE ABHÄNGIGKEITEN :: :::::::::::::::::::::::::::::::::::::::::::::: :: com.example#foobar;1.0.0: nicht gefunden ::::::::::::::::::::::::::::::::::::::::::::::
Das Seltsame: Die Url ist korrekt. Mit curl können wir die Abhängigkeit herunterladen:
curl -s -o /dev/null -v https://readonly:secret_password@nexus/repository/maven-public/com/example/foobar/1.0.0/foobar-1.0.0.pom * Hostname wurde NICHT im DNS-Cache gefunden * Versuchen Sie 35... * Verbunden mit foobar.com (35.xxx.xxx.x) Hafen 443 (#0) * erfolgreich einstellen. Zertifikat Standorte überprüfen: * CAfile: keine CApfad: /etc/ssl/certs ... ... 200 OK
Okay, lassen Sie uns diese Sache debuggen, indem wir Ivy direkt verwenden.
Ivy verwendet eine Konfigurationsdatei, um das Nexus-Repository zu konfigurieren, also habe ich es versucht:
defaultResolver="nexus"/> name="nexus-öffentlich" value="https://nexus/repository/maven-public"/> name="nexus" m2compatible="true" root="${nexus-public}"/>
curl -L -O http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar
java -jar ivy-2.4.0.jar -settings ivy.settings -dependency com.example foobar 1.0.0 -debug
Hier haben wir das gleiche Problem. Das Problem hat also nichts mit Spark zu tun, sondern mit Ivy.
==== nexus: versucht https://readonly:secret_password@nexus/repository/maven-public/com/example/foobar/1.0.0/foobar-1.0.0.pom -- Artefakt com.example#foobar;1.0.0!foobar.jar: https://readonly:secret_password@nexus/repository/maven-public/com/example/foobar/1.0.0/foobar-1.0.0.jar :::::::::::::::::::::::::::::::::::::::::::::: :: NICHT AUFGELÖSTE ABHÄNGIGKEITEN :: :::::::::::::::::::::::::::::::::::::::::::::: :: com.example#foobar;1.0.0: nicht gefunden ::::::::::::::::::::::::::::::::::::::::::::::
Mit der Option -debug finden wir Folgendes:
HTTP-Antwortstatus: 401 url=https://readonly:secret_password@nexus/repository/maven-public/com/example/foobar/1.0.0/foobar-1.0.0.jar CLIENT FEHLER: Nicht autorisiert url=https://readonly:secret_password@nexus/repository/maven-public/com/example/foobar/1.0.0/foobar-1.0.0.jar nexus: Ressource nicht erreichbar für com/example#foobar;1.0.0: res=https://readonly:secret_password@nexus/repository/maven-public/com/example/foobar/1.0.0/foobar-1.0.0.jar
Jetzt, wo wir das Problem verstanden haben, können wir anfangen zu googeln. Ich habe dieses StackOverflow-Problem gefunden
Ändern wir also die Basisauthentifizierung in der URL in einen credentials Block.
defaultResolver="nexus"/> name="nexus-öffentlich" value="https://nexus/repository/maven-public"/> host="nexus" realm="Sonatype Nexus Repository Manager" benutzername="schreibgeschützt" passwd="geheimes_passwort" /> name="nexus" m2compatible="true" root="${nexus-public}"/>
Jetzt funktioniert alles wie am Schnürchen. Zeit, den Befehl pyspark zu reparieren.
pyspark
--packages com.example:foobar:1.0.0
--conf spark.jars.ivySettings=/tmp/ivy.settings
Jetzt kann Spark die Pakete auch herunterladen. Ich bin wieder ein glücklicher Camper. Jetzt müssen wir dies nur noch in unser Init-Skript aufnehmen, um neue Dataproc-Cluster mit dieser Einrichtung zu initialisieren.
Unsere Ideen
Weitere Blogs
Contact



