Migrace dat z Cassandry do účtu Azure Cosmos DB for Apache Cassandra pomocí Azure Databricks

PLATÍ PRO: Cassandra

Rozhraní API pro Cassandra ve službě Azure Cosmos DB se stalo skvělou volbou pro podnikové úlohy běžící na Apache Cassandře z několika důvodů:

  • Žádné režijní náklady na správu a monitorování: Eliminuje režii spojenou se správou a monitorováním nastavení v souborech OS, JVM a YAML a jejich interakcí.

  • Významné úspory nákladů: Se službou Azure Cosmos DB můžete ušetřit náklady, které zahrnují náklady na virtuální počítače, šířku pásma a všechny příslušné licence. Nemusíte spravovat datacentra, servery, úložiště SSD, sítě a náklady na elektřinu.

  • Možnost používat existující kód a nástroje: Azure Cosmos DB poskytuje kompatibilitu přenosového protokolu s existujícími sadami SDK a nástroji Cassandra. Tato kompatibilita zajišťuje, že můžete používat stávající základ kódu se službou Azure Cosmos DB for Apache Cassandra s triviálními změnami.

Existuje mnoho způsobů, jak migrovat databázové úlohy z jedné platformy na jinou. Azure Databricks je nabídka platformy jako služby (PaaS) pro Apache Spark , která nabízí způsob, jak provádět offline migrace ve velkém měřítku. Tento článek popisuje kroky potřebné k migraci dat z nativních prostorů klíčů a tabulek Apache Cassandra do služby Azure Cosmos DB for Apache Cassandra pomocí Azure Databricks.

Požadavky

Zřízení clusteru Azure Databricks

Můžete postupovat podle pokynů ke zřízení clusteru Azure Databricks. Doporučujeme vybrat modul runtime Databricks verze 7.5, který podporuje Spark 3.0.

Snímek obrazovky znázorňující vyhledání verze modulu runtime Databricks

Přidání závislostí

Abyste se mohli připojit k nativním koncovým bodům i koncovým bodům Cassandra služby Azure Cosmos DB, musíte do clusteru přidat knihovnu konektoru Apache Spark Cassandra. V clusteru vyberte Knihovny>Nainstalovat nový>Maven a pak přidejte com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 souřadnice Mavenu.

Snímek obrazovky znázorňující hledání balíčků Maven v Databricks

Vyberte Nainstalovat a po dokončení instalace restartujte cluster.

Poznámka

Po instalaci knihovny konektoru Cassandra nezapomeňte cluster Databricks restartovat.

Upozornění

Ukázky uvedené v tomto článku byly testovány s verzí Spark 3.0.1 a odpovídajícím konektorem Spark Cassandra com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0. Novější verze Sparku nebo konektoru Cassandra nemusí fungovat podle očekávání.

Vytvoření poznámkového bloku Scala pro migraci

Vytvoření poznámkového bloku Scala v Databricks Nahraďte zdrojové a cílové konfigurace Cassandra odpovídajícími přihlašovacími údaji a zdrojovými a cílovými prostory klíčů a tabulkami. Pak spusťte následující kód:

import com.datastax.spark.connector._
import com.datastax.spark.connector.cql._
import org.apache.spark.SparkContext

// source cassandra configs
val nativeCassandra = Map( 
    "spark.cassandra.connection.host" -> "<Source Cassandra Host>",
    "spark.cassandra.connection.port" -> "9042",
    "spark.cassandra.auth.username" -> "<USERNAME>",
    "spark.cassandra.auth.password" -> "<PASSWORD>",
    "spark.cassandra.connection.ssl.enabled" -> "false",
    "keyspace" -> "<KEYSPACE>",
    "table" -> "<TABLE>"
)

//target cassandra configs
val cosmosCassandra = Map( 
    "spark.cassandra.connection.host" -> "<USERNAME>.cassandra.cosmos.azure.com",
    "spark.cassandra.connection.port" -> "10350",
    "spark.cassandra.auth.username" -> "<USERNAME>",
    "spark.cassandra.auth.password" -> "<PASSWORD>",
    "spark.cassandra.connection.ssl.enabled" -> "true",
    "keyspace" -> "<KEYSPACE>",
    "table" -> "<TABLE>",
    //throughput related settings below - tweak these depending on data volumes. 
    "spark.cassandra.output.batch.size.rows"-> "1",
    "spark.cassandra.output.concurrent.writes" -> "1000",
    //"spark.cassandra.connection.remoteConnectionsPerExecutor" -> "1", // Spark 3.x
    "spark.cassandra.connection.connections_per_executor_max"-> "1", // Spark 2.x
    "spark.cassandra.concurrent.reads" -> "512",
    "spark.cassandra.output.batch.grouping.buffer.size" -> "1000",
    "spark.cassandra.connection.keep_alive_ms" -> "600000000"
)

//Read from native Cassandra
val DFfromNativeCassandra = sqlContext
  .read
  .format("org.apache.spark.sql.cassandra")
  .options(nativeCassandra)
  .load
  
//Write to CosmosCassandra
DFfromNativeCassandra
  .write
  .format("org.apache.spark.sql.cassandra")
  .options(cosmosCassandra)
  .mode(SaveMode.Append) // only required for Spark 3.x
  .save

Poznámka

spark.cassandra.output.batch.size.rows Hodnoty a spark.cassandra.output.concurrent.writes a počet pracovních procesů v clusteru Spark jsou důležité konfigurace, které je potřeba ladit, abyste se vyhnuli omezování rychlosti. K omezování rychlosti dochází, když požadavky na službu Azure Cosmos DB překračují zřízenou propustnost nebo jednotky žádostí (RU). Tato nastavení může být potřeba upravit v závislosti na počtu exekutorů v clusteru Spark a potenciální velikosti (a tedy nákladů na RU) jednotlivých záznamů zapisovaných do cílových tabulek.

Řešení potíží

Omezování rychlosti (chyba 429)

Může se zobrazit kód chyby 429 nebo text "frekvence požadavků je vysoká", i když nastavení omezíte na minimální hodnoty. Omezování rychlosti můžou způsobit následující scénáře:

  • Propustnost přidělená tabulce je menší než 6 000 jednotek žádostí. I při minimálním nastavení může Spark zapisovat rychlostí přibližně 6 000 nebo více jednotek žádostí. Pokud jste zřídili tabulku v prostoru klíčů se sdílenou propustností, je možné, že má tato tabulka k dispozici méně než 6 000 RU za běhu.

    Ujistěte se, že tabulka, do které migrujete, má při spuštění migrace k dispozici alespoň 6 000 RU. V případě potřeby přidělte k této tabulce vyhrazené jednotky žádostí.

  • Nadměrná nerovnoměrná distribuce dat s velkým objemem dat Pokud do dané tabulky chcete migrovat velké množství dat, ale dochází k významné nerovnoměrné distribuci dat (to znamená, že se pro stejnou hodnotu klíče oddílu zapisuje velký počet záznamů), může stále docházet k omezování rychlosti, i když máte v tabulce zřízeno několik jednotek žádostí . Jednotky žádostí jsou rovnoměrně rozdělené mezi fyzické oddíly a velká nerovnoměrná distribuce dat může způsobit kritický bod požadavků na jeden oddíl.

    V tomto scénáři snižte nastavení propustnosti sparku na minimální a vynuťte, aby migrace běžela pomalu. Tento scénář může být častější při migraci referenčních nebo řídicích tabulek, kde je přístup méně častý a může být vysoká nerovnoměrná distribuce. Pokud je však v jakémkoli jiném typu tabulky výrazná nerovnoměrná distribuce, můžete zkontrolovat datový model, abyste se vyhnuli problémům s horkými oddíly úloh během operací stabilního stavu.

Další kroky