Anpassa containrar med Databricks Container Services

Med Databricks Container Services kan du ange en Docker-avbildning när du skapar ett kluster. Några exempel på användningsfall är:

  • Biblioteksanpassning: du har fullständig kontroll över de systembibliotek som du vill installera.
  • Miljö för gyllene containrar: Docker-avbildningen är en låst miljö som aldrig kommer att ändras.
  • Docker CI/CD-integrering: Du kan integrera Azure Databricks med dina Docker CI/CD-pipelines.

Du kan också använda Docker-avbildningar för att skapa anpassade djupinlärningsmiljöer i kluster med GPU-enheter. Mer information om hur du använder GPU-kluster med Databricks Container Services finns i Databricks Container Services på GPU-kluster.

För uppgifter som ska köras varje gång containern startas använder du ett init-skript.

Krav

Anteckning

Databricks Runtime for Machine Learning och Databricks Runtime for Genomics stöder inte Databricks Container Services.

  • Din Azure Databricks-arbetsyta måste ha Databricks Container Services aktiverat.
  • Datorn måste köra en nyligen utförd Docker-daemon (en som har testats och fungerar med klient-/serverversion 18.03.0-ce) och docker kommandot måste vara tillgängligt på .PATH

Steg 1: Skapa din bas

Databricks rekommenderar att du skapar din Docker-bas från en bas som Databricks har skapat och testat. Du kan också skapa Docker-basen från grunden. I det här avsnittet beskrivs de två alternativen.

Alternativ 1. Använda en bas som skapats av Databricks

I det här exemplet används taggen 9.x för en avbildning som riktar sig mot ett kluster med körningsversionen Databricks Runtime 9.0 och senare:

FROM databricksruntime/standard:9.x
...

Om du vill ange ytterligare Python-bibliotek, till exempel den senaste versionen av Pandas och urllib, använder du den containerspecifika versionen av pip. För containern datatabricksruntime/standard:9.x inkluderar du följande:

RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3

För containern datatabricksruntime/standard:8.x eller lägre inkluderar du följande:

RUN /databricks/conda/envs/dcs-minimal/bin/pip install pandas
RUN /databricks/conda/envs/dcs-minimal/bin/pip install urllib3

Exempelbasavbildningar finns på Docker Hub på https://hub.docker.com/u/databricksruntime. De Dockerfiles som används för att generera dessa baser finns på https://github.com/databricks/containers.

Anteckning

Basavbildningarna databricksruntime/standard och databricksruntime/minimal ska inte förväxlas med orelaterade databricks-standard miljöer och databricks-minimal miljöer som ingår i den inte längre tillgängliga Databricks Runtime med Conda (Beta).

Alternativ 2. Skapa en egen Docker-bas

Du kan också skapa din Docker-bas från grunden. Docker-avbildningen måste uppfylla följande krav:

Om du vill skapa en egen avbildning från grunden måste du skapa den virtuella miljön. Du måste också inkludera paket som är inbyggda i Databricks-kluster, till exempel Python, R och Ganglia. För att komma igång kan du använda lämplig basavbildning (det vill databricksruntime/rbase säga för R eller databricksruntime/python Python) eller referera till dockerfiles-exemplet i GitHub. Ett annat alternativ är att börja med den minimala avbildningen som skapats av Databricks på databricksruntime/minimal.

Anteckning

Databricks rekommenderar att du använder Ubuntu Linux. Det är dock möjligt att använda Alpine Linux. Om du vill använda Alpine Linux måste du inkludera följande filer:

Dessutom måste du konfigurera Python, som du ser i det här exemplet Dockerfile.

Varning

Testa din anpassade containeravbildning noggrant i ett Azure Databricks-kluster. Containern kan fungera på en lokal dator eller en byggdator, men när containern startas i ett Azure Databricks-kluster kan det hända att klusterstarten misslyckas, vissa funktioner kan inaktiveras eller att containern slutar fungera, till och med tyst. I värsta fall kan det skada dina data eller oavsiktligt exponera dina data för externa parter.

Steg 2: Push-överföra basavbildningen

Push-överför din anpassade basavbildning till ett Docker-register. Den här processen stöds med följande register:

Andra Docker-register som inte stöder någon autentisering eller grundläggande autentisering förväntas också fungera.

Anteckning

Om du använder Docker Hub för Docker-registret kontrollerar du att hastighetsbegränsningarna motsvarar det antal kluster som du förväntar dig att starta under en sextimmarsperiod. Dessa frekvensgränser skiljer sig åt för anonyma användare, autentiserade användare utan en betald prenumeration och betalda prenumerationer. Mer information finns i Docker-dokumentationen . Om den här gränsen överskrids får du svaret "429 för många förfrågningar".

Steg 3: Starta klustret

Du kan starta klustret med hjälp av användargränssnittet eller API:et.

Starta klustret med hjälp av användargränssnittet

  1. sidan Skapa kluster anger du en Databricks Runtime-version som stöder Databricks Container Services.

  2. Under Avancerade alternativ väljer du fliken Docker .

    Välj Databricks-körning

  3. Välj Använd din egen Docker-container.

  4. I fältet Docker Image URL (Url för Docker-avbildning ) anger du din anpassade Docker-avbildning.

    Exempel på Docker-avbildnings-URL:

    Register Taggformat
    Docker Hub <organization>/<repository>:<tag> (till exempel: databricksruntime/standard:latest)
    Azure Container Registry <your-registry-name>.azurecr.io/<repository-name>:<tag>
  5. Välj autentiseringstyp.

Starta klustret med hjälp av API:et

  1. Generera en API-token.

  2. Använd Kluster-API 2.0 för att starta ett kluster med din anpassade Docker-bas.

    curl -X POST -H "Authorization: Bearer <token>" https://<databricks-instance>/api/2.0/clusters/create -d '{
      "cluster_name": "<cluster-name>",
      "num_workers": 0,
      "node_type_id": "Standard_DS3_v2",
      "docker_image": {
        "url": "databricksruntime/standard:latest",
        "basic_auth": {
          "username": "<docker-registry-username>",
          "password": "<docker-registry-password>"
        }
      },
      "spark_version": "7.3.x-scala2.12",
    }'
    

    basic_auth kraven beror på typen av Docker-avbildning:

    • Ta inte med fältet för offentliga Docker-avbildningar basic_auth .
    • För privata Docker-avbildningar måste du inkludera fältet basic_auth med ett ID för tjänstens huvudnamn och lösenord som användarnamn och lösenord.
    • För Azure Container Registry måste du ange basic_auth fältet till ID och lösenord för tjänstens huvudnamn. Information om hur du skapar tjänstens huvudnamn finns i Azure Container Registry autentiseringsdokumentation för tjänstens huvudnamn.

Använda ett init-skript

Med Databricks Container Services-kluster kan kunder inkludera init-skript i Docker-containern. I de flesta fall bör du undvika init-skript och i stället göra anpassningar via Docker direkt (med Dockerfile). Vissa uppgifter måste dock utföras när containern startas, i stället för när containern skapas. Använd ett init-skript för dessa uppgifter.

Anta till exempel att du vill köra en säkerhetsdaemon i en anpassad container. Installera och skapa daemonen i Docker-avbildningen via din pipeline för avbildningsskapande. Lägg sedan till ett init-skript som startar daemonen. I det här exemplet skulle init-skriptet innehålla en rad som systemctl start my-daemon.

I API:et kan du ange init-skript som en del av klusterspecifikationen på följande sätt. Mer information finns i InitScriptInfo.

"init_scripts": [
    {
        "file": {
            "destination": "file:/my/local/file.sh"
        }
    }
]

För Databricks Container Services-avbildningar kan du också lagra init-skript i DBFS eller molnlagring.

Följande steg utförs när du startar ett Databricks Container Services-kluster:

  1. Virtuella datorer hämtas från molnleverantören.
  2. Den anpassade Docker-avbildningen laddas ned från lagringsplatsen.
  3. Azure Databricks skapar en Docker-container från avbildningen.
  4. Databricks Runtime-kod kopieras till Docker-containern.
  5. Init-scrips körs. Se Körningsordning för Init-skript.

Azure Databricks ignorerar Docker CMD och ENTRYPOINT primitiver.