Blog

Spark-Pakete aus einem passwortgeschützten Repository

Aktualisiert Oktober 21, 2025
2 Minuten

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.

Contact

Let’s discuss how we can support your journey.