Azure Databricks-fürtök regionális vészhelyreállítása

Ez a cikk az Azure Databricks-fürtök számára hasznos vészhelyreállítási architektúrát és a tervezés lépéseit ismerteti.

Az Azure Databricks architektúrája

Amikor Azure Databricks-munkaterületet hoz létre az Azure Portalról, a felügyelt alkalmazás Azure-erőforrásként lesz üzembe helyezve az előfizetésében, a kiválasztott Azure-régióban (például az USA nyugati régiójában). Ez a berendezés egy Azure-beli virtuális hálózaton van üzembe helyezve egy hálózati biztonsági csoporttal és egy Azure Storage-fiókkal, amely elérhető az előfizetésében. A virtuális hálózat szegélyszintű biztonságot biztosít a Databricks-munkaterület számára, és hálózati biztonsági csoporton keresztül védi. A munkaterületen databricks-fürtöket hozhat létre a feldolgozó és illesztőprogram virtuálisgép-típusának és a Databricks futtatókörnyezet verziójának megadásával. A tárolt adatok a tárfiókban érhetők el. A fürt létrehozása után a feladatokat jegyzetfüzeteken, REST API-kon vagy ODBC/JDBC-végpontokon keresztül futtathatja úgy, hogy egy adott fürthöz csatolja őket.

A Databricks vezérlősík kezeli és figyeli a Databricks-munkaterület környezetét. Minden felügyeleti művelet( például fürt létrehozása) a vezérlősíkról indul el. Az összes metaadat, például az ütemezett feladatok egy Azure Database-ben vannak tárolva, és az adatbázis biztonsági másolatai automatikusan georeplikálva lesznek a párosított régiókba , ahol implementálva van.

Databricks architecture

Az architektúra egyik előnye, hogy a felhasználók az Azure Databrickset a fiókjukban lévő bármely tárolási erőforráshoz csatlakoztathatják. A legfontosabb előnye, hogy a számítás (Azure Databricks) és a tárolás egymástól függetlenül skálázható.

Regionális vészhelyreállítási topológia létrehozása

Az előző architektúra leírásában számos összetevőt használunk egy Big Data-folyamathoz az Azure Databricks használatával: Azure Storage, Azure Database és más adatforrások. Az Azure Databricks a Big Data-folyamat számítása . Ez rövides természetű, ami azt jelenti, hogy amíg az adatok továbbra is elérhetők az Azure Storage-ban, a számítás (Azure Databricks-fürt) leállhat, hogy ne kelljen fizetnie a számításért, ha nincs rá szüksége. A számítási (Azure Databricks) és a tárolási forrásoknak ugyanabban a régióban kell lenniük, hogy a feladatok ne tapasztalják a nagy késést.

Saját regionális vészhelyreállítási topológia létrehozásához kövesse az alábbi követelményeket:

  1. Több Azure Databricks-munkaterület kiépítése külön Azure-régiókban. Például hozza létre az elsődleges Azure Databricks-munkaterületet az USA keleti régiójában. Hozza létre a másodlagos vészhelyreállítási Azure Databricks-munkaterületet egy külön régióban, például az USA nyugati régiójában. A párosított Azure-régiók listájáért tekintse meg a régiók közötti replikációt. Az Azure Databricks-régiókkal kapcsolatos részletekért lásd a támogatott régiókat.

  2. Georedundáns tárolás használata. Alapértelmezés szerint az Azure Databrickshez társított adatok az Azure Storage-ban vannak tárolva, a Databricks-feladatok eredményei pedig az Azure Blob Storage-ban vannak tárolva, így a feldolgozott adatok tartósak, és a fürt leállítása után is magas rendelkezésre állásúak maradnak. A fürttároló és a feladattároló ugyanabban a rendelkezésre állási zónában található. A regionális elérhetetlenség elleni védelem érdekében az Azure Databricks-munkaterületek alapértelmezés szerint georedundáns tárolást használnak. Georedundáns tárolás esetén az adatok replikálódnak egy Azure-párosított régióba. A Databricks azt javasolja, hogy tartsa meg a georedundáns tárolás alapértelmezett értékét, de ha ehelyett helyileg redundáns tárolást kell használnia, beállíthatja storageAccountSkuNameStandard_LRS a munkaterület ARM-sablonjában .

  3. A másodlagos régió létrehozása után át kell telepítenie a felhasználókat, a felhasználói mappákat, a jegyzetfüzeteket, a fürtkonfigurációt, a feladatok konfigurációját, a tárakat, a tárakat, az inicializálási szkripteket és a hozzáférés-vezérlés újrakonfigurálását. A további részleteket a következő szakaszban ismertetjük.

Regionális katasztrófa

A regionális katasztrófákra való felkészüléshez explicit módon fenn kell tartania egy másik Azure Databricks-munkaterületet egy másodlagos régióban. Lásd: Vészhelyreállítás.

A vészhelyreállításhoz ajánlott eszközök elsősorban a Terraform (az infrareplikációhoz) és a Delta Deep Clone (adatreplikációhoz).

Részletes migrálási lépések

  1. A Databricks parancssori felületének beállítása a számítógépen

    Ez a cikk számos olyan kódpéldát mutat be, amelyek a parancssori felületet használják az automatizált lépések többségéhez, mivel ez egy könnyen kezelhető burkoló az Azure Databricks REST API-val.

    A migrálási lépések végrehajtása előtt telepítse a databricks-cli-t az asztali számítógépre vagy egy olyan virtuális gépre, ahol el szeretné végezni a munkát. További információ: A Databricks parancssori felület telepítése

    pip install databricks-cli
    

    Feljegyzés

    A cikkben szereplő python-szkriptek várhatóan a Python 2.7+ < 3.x-et is használhatják.

  2. Konfiguráljon két profilt.

    Konfiguráljon egyet az elsődleges munkaterülethez, egy másikat a másodlagos munkaterülethez:

    databricks configure --profile primary --token
    databricks configure --profile secondary --token
    

    A cikkben szereplő kódblokkok a megfelelő munkaterületi paranccsal váltanak a profilok között minden további lépésben. Győződjön meg arról, hogy a létrehozott profilok nevei minden kódblokkra fel lesznek cserélve.

    EXPORT_PROFILE = "primary"
    IMPORT_PROFILE = "secondary"
    

    Szükség esetén manuálisan is válthat a parancssorban:

    databricks workspace ls --profile primary
    databricks workspace ls --profile secondary
    
  3. Microsoft Entra-azonosító (korábbi nevén Azure Active Directory) felhasználóinak migrálása

    Adja hozzá manuálisan ugyanazokat a Microsoft Entra-azonosítót (korábbi nevén Azure Active Directory-felhasználókat) az elsődleges munkaterületen található másodlagos munkaterülethez.

  4. A felhasználói mappák és jegyzetfüzetek migrálása

    A következő Python-kóddal migrálhatja a tesztkörnyezeteket, amelyek tartalmazzák a beágyazott mappastruktúrát és a felhasználónkénti jegyzetfüzeteket.

    Feljegyzés

    Ebben a lépésben a kódtárak nem lesznek átmásolva, mivel a mögöttes API nem támogatja ezeket.

    Másolja és mentse a következő Python-szkriptet egy fájlba, majd futtassa a Databricks parancssorában. Például: python scriptname.py.

    import sys
    import os
    import subprocess
    from subprocess import call, check_output
    
    EXPORT_PROFILE = "primary"
    IMPORT_PROFILE = "secondary"
    
    # Get a list of all users
    user_list_out = check_output(["databricks", "workspace", "ls", "/Users", "--profile", EXPORT_PROFILE])
    user_list = (user_list_out.decode(encoding="utf-8")).splitlines()
    
    print (user_list)
    
    # Export sandboxed environment(folders, notebooks) for each user and import into new workspace.
    #Libraries are not included with these APIs / commands.
    
    for user in user_list:
      #print("Trying to migrate workspace for user ".decode() + user)
      print (("Trying to migrate workspace for user ") + user)
    
      subprocess.call(str("mkdir -p ") + str(user), shell = True)
      export_exit_status = call("databricks workspace export_dir /Users/" + str(user) + " ./" + str(user) + " --profile " + EXPORT_PROFILE, shell = True)
    
      if export_exit_status==0:
        print ("Export Success")
        import_exit_status = call("databricks workspace import_dir ./" + str(user) + " /Users/" + str(user) + " --profile " + IMPORT_PROFILE, shell=True)
        if import_exit_status==0:
          print ("Import Success")
        else:
          print ("Import Failure")
      else:
        print ("Export Failure")
    print ("All done")
    
  5. A fürtkonfigurációk migrálása

    A jegyzetfüzetek migrálása után igény szerint áttelepítheti a fürtkonfigurációkat az új munkaterületre. Ez szinte teljesen automatizált lépés a databricks-cli használatával, hacsak nem szeretne szelektív fürtkonfigurációs migrálást végezni, nem pedig mindenki számára.

    Feljegyzés

    Sajnos nincs fürtkonfigurációs végpont, és ez a szkript azonnal megpróbálja létrehozni az egyes fürtöket. Ha nem áll rendelkezésre elegendő mag az előfizetésben, a fürt létrehozása meghiúsulhat. A hiba figyelmen kívül hagyható, amíg a konfiguráció sikeresen át lesz helyezve.

    A következő szkript a régi és az új fürtazonosítók közötti leképezést nyomtatja ki, amelyek később a feladatmigráláshoz használhatók (meglévő fürtök használatára konfigurált feladatok esetén).

    Másolja és mentse a következő Python-szkriptet egy fájlba, majd futtassa a Databricks parancssorában. Például: python scriptname.py.

    import sys
    import os
    import subprocess
    import json
    from subprocess import call, check_output
    
    EXPORT_PROFILE = "primary"
    IMPORT_PROFILE = "secondary"
    
    # Get all clusters info from old workspace
    clusters_out = check_output(["databricks", "clusters", "list",    "--profile", EXPORT_PROFILE])
    clusters_info_list = str(clusters_out.decode(encoding="utf-8")).   splitlines()
    print("Printting Cluster info List")
    print(clusters_info_list)
    
    # Create a list of all cluster ids
    clusters_list = []
    ##for cluster_info in clusters_info_list: clusters_list.append   (cluster_info.split(None, 1)[0])
    
    for cluster_info in clusters_info_list:
       if cluster_info != '':
          clusters_list.append(cluster_info.split(None, 1)[0])
    
    # Optionally filter cluster ids out manually, so as to create only required ones in new workspace
    
    # Create a list of mandatory / optional create request elements
    cluster_req_elems = ["num_workers","autoscale","cluster_name","spark_version","spark_conf","node_type_id","driver_node_type_id","custom_tags","cluster_log_conf","spark_env_vars","autotermination_minutes","enable_elastic_disk"]
    print("Printing Cluster element List")
    print (cluster_req_elems)
    print(str(len(clusters_list)) + " clusters found in the primary site" )
    
    print ("---------------------------------------------------------")
    # Try creating all / selected clusters in new workspace with same config as in old one.
    cluster_old_new_mappings = {}
    i = 0
    for cluster in clusters_list:
       i += 1
       print("Checking cluster " + str(i) + "/" + str(len(clusters_list)) + " : " +str(cluster))
       cluster_get_out_f = check_output(["databricks", "clusters", "get", "--cluster-id", str(cluster), "--profile", EXPORT_PROFILE])
       cluster_get_out=str(cluster_get_out_f.decode(encoding="utf-8"))
       print ("Got cluster config from old workspace")
       print (cluster_get_out)
        # Remove extra content from the config, as we need to build create request with allowed elements only
       cluster_req_json = json.loads(cluster_get_out)
       cluster_json_keys = cluster_req_json.keys()
    
       #Don't migrate Job clusters
       if cluster_req_json['cluster_source'] == u'JOB' :
          print ("Skipping this cluster as it is a Job cluster : " + cluster_req_json['cluster_id'] )
          print ("---------------------------------------------------------")
          continue
    
          #cluster_req_json.pop(key, None)
          for key in cluster_json_keys:
            if key not in cluster_req_elems:
             print (cluster_req_json)
             #cluster_del_item=cluster_json_keys .keys()
             cluster_req_json.popitem(key, None)
    
       # Create the cluster, and store the mapping from old to new cluster ids
    
       #Create a temp file to store the current cluster info as JSON
       strCurrentClusterFile = "tmp_cluster_info.json"
    
       #delete the temp file if exists
       if os.path.exists(strCurrentClusterFile) :
          os.remove(strCurrentClusterFile)
    
       fClusterJSONtmp = open(strCurrentClusterFile,"w+")
       fClusterJSONtmp.write(json.dumps(cluster_req_json))
       fClusterJSONtmp.close()
    
       #cluster_create_out = check_output(["databricks", "clusters", "create", "--json", json.dumps(cluster_req_json), "--profile", IMPORT_PROFILE])
       cluster_create_out = check_output(["databricks", "clusters", "create", "--json-file", strCurrentClusterFile , "--profile", IMPORT_PROFILE])
       cluster_create_out_json = json.loads(cluster_create_out)
       cluster_old_new_mappings[cluster] = cluster_create_out_json['cluster_id']
    
       print ("Cluster create request sent to secondary site workspace successfully")
       print ("---------------------------------------------------------")
    
       #delete the temp file if exists
       if os.path.exists(strCurrentClusterFile) :
          os.remove(strCurrentClusterFile)
    
    print ("Cluster mappings: " + json.dumps(cluster_old_new_mappings))
    print ("All done")
    print ("P.S. : Please note that all the new clusters in your secondary site are being started now!")
    print ("       If you won't use those new clusters at the moment, please don't forget terminating your new clusters to avoid charges")
    
  6. A feladatok konfigurációjának migrálása

    Ha az előző lépésben migrálta a fürtkonfigurációkat, a feladatkonfigurációkat áttelepítheti az új munkaterületre. Ez egy teljesen automatizált lépés a databricks-cli használatával, hacsak nem szeretne szelektív feladatkonfigurációs migrálást végezni ahelyett, hogy minden feladathoz elvégezné.

    Feljegyzés

    Az ütemezett feladatok konfigurációja tartalmazza az "ütemezési" információkat is, így alapértelmezés szerint a migrálás után a konfigurált időzítésnek megfelelően fog működni. Ezért a következő kódblokk eltávolít minden ütemezési információt az áttelepítés során (a régi és az új munkaterületek ismétlődő futtatásainak elkerülése érdekében). Ha készen áll az átállásra, konfigurálja az ilyen feladatok ütemezését.

    A feladatkonfigurációhoz új vagy meglévő fürt beállításaira van szükség. Meglévő fürt használata esetén az alábbi szkript /kód megpróbálja lecserélni a régi fürtazonosítót új fürtazonosítóra.

    Másolja és mentse a következő Python-szkriptet egy fájlba. Cserélje le az és new_cluster_id, értéket old_cluster_id az előző lépésben elvégzett fürtmigrálás kimenetére. Futtassa például a databricks-cli parancssorban python scriptname.py.

    import sys
    import os
    import subprocess
    import json
    from subprocess import call, check_output
    
    
    EXPORT_PROFILE = "primary"
    IMPORT_PROFILE = "secondary"
    
    # Please replace the old to new cluster id mappings from cluster migration output
    cluster_old_new_mappings = {"0227-120427-tryst214": "0229-032632-paper88"}
    
    # Get all jobs info from old workspace
    try:
      jobs_out = check_output(["databricks", "jobs", "list", "--profile", EXPORT_PROFILE])
      jobs_info_list = jobs_out.splitlines()
    except:
      print("No jobs to migrate")
      sys.exit(0)
    
    # Create a list of all job ids
    jobs_list = []
    for jobs_info in jobs_info_list:
      jobs_list.append(jobs_info.split(None, 1)[0])
    
    # Optionally filter job ids out manually, so as to create only required ones in new workspace
    
    # Create each job in the new workspace based on corresponding settings in the old workspace
    
    for job in jobs_list:
      print("Trying to migrate ") + job
    
      job_get_out = check_output(["databricks", "jobs", "get", "--job-id", job, "--profile", EXPORT_PROFILE])
      print("Got job config from old workspace")
    
      job_req_json = json.loads(job_get_out)
      job_req_settings_json = job_req_json['settings']
    
      # Remove schedule information so job doesn't start before proper cutover
      job_req_settings_json.pop('schedule', None)
    
      # Replace old cluster id with new cluster id, if job configured to run against an existing cluster
      if 'existing_cluster_id' in job_req_settings_json:
        if job_req_settings_json['existing_cluster_id'] in cluster_old_new_mappings:
          job_req_settings_json['existing_cluster_id'] = cluster_old_new_mappings[job_req_settings_json['existing_cluster_id']]
        else:
          print("Mapping not available for old cluster id ") + job_req_settings_json['existing_cluster_id']
          continue
    
      call(["databricks", "jobs", "create", "--json", json.dumps(job_req_settings_json), "--profile", IMPORT_PROFILE])
      print("Sent job create request to new workspace successfully")
    
    print("All done")
    
  7. Kódtárak migrálása

    Jelenleg nem lehet egyszerűen áttelepíteni a kódtárakat egyik munkaterületről a másikra. Ehelyett telepítse újra ezeket a kódtárakat manuálisan az új munkaterületre. A DBFS CLI kombinációjával automatizálható az egyéni kódtárak feltöltése a munkaterületre és a Kódtárak parancssori felületére.

  8. Azure Blob Storage- és Azure Data Lake Storage-csatlakoztatások migrálása

    Az Azure Blob Storage és az Azure Data Lake Storage (Gen 2) csatlakoztatási pontjainak manuális csatlakoztatása jegyzetfüzetalapú megoldással. A tárolóerőforrások az elsődleges munkaterületen lettek volna csatlakoztatva, és ezt meg kell ismételni a másodlagos munkaterületen. A csatlakoztatásokhoz nincs külső API.

  9. Fürt init szkriptjeinek migrálása

    A fürt inicializálási szkriptjei a DBFS parancssori felületével migrálhatók a régiről az új munkaterületre. Először másolja a szükséges szkripteket dbfs:/dat abricks/init/.. a helyi asztalra vagy virtuális gépre. Ezután másolja ezeket a szkripteket az új munkaterületre ugyanazon az útvonalon.

    // Primary to local
    dbfs cp -r dbfs:/databricks/init ./old-ws-init-scripts --profile primary
    
    // Local to Secondary workspace
    dbfs cp -r old-ws-init-scripts dbfs:/databricks/init --profile secondary
    
  10. Manuálisan konfigurálja újra és alkalmazza újra a hozzáférés-vezérlést.

    Ha a meglévő elsődleges munkaterület a Prémium vagy a Nagyvállalati szint (SKU) használatára van konfigurálva, akkor valószínűleg a Hozzáférés-vezérlés funkciót is használja.

    Ha a Hozzáférés-vezérlés funkciót használja, manuálisan alkalmazza újra a hozzáférés-vezérlést az erőforrásokhoz (jegyzetfüzetek, fürtök, feladatok, táblák).

Azure-ökoszisztéma vészhelyreállítása

Ha más Azure-szolgáltatásokat használ, mindenképpen implementáljon vészhelyreállítási ajánlott eljárásokat ezekhez a szolgáltatásokhoz is. Ha például külső Hive-metaadattár-példányt használ, érdemes megfontolnia az Azure SQL Database, az Azure HDInsight és/vagy az Azure Database for MySQL vészhelyreállítását. A vészhelyreállítással kapcsolatos általános információkért tekintse meg az Azure-alkalmazások vészhelyreállítását ismertető témakört.

Következő lépések

További információkért tekintse meg az Azure Databricks dokumentációját.