ترحيل البيانات من Cassandra إلى Azure Cosmos DB لحساب Apache Cassandra باستخدام Azure Databricks

ينطبق على: كاساندرا

أصبحت واجهة برمجة التطبيقات ل Cassandra في Azure Cosmos DB خيارا رائعا لأحمال عمل المؤسسات التي تعمل على Apache Cassandra لعدة أسباب:

  • لا توجد نفقات عامة للإدارة والمراقبة: إنها تقضي على النفقات العامة لإدارة الإعدادات ومراقبتها عبر ملفات OS وJVM وYAML وتفاعلاتها.

  • وفورات كبيرة في التكلفة: يمكنك توفير التكاليف باستخدام Azure Cosmos DB، والتي تتضمن تكلفة الأجهزة الظاهرية والنطاق الترددي وأي تراخيص قابلة للتطبيق. لا يتعين عليك إدارة مركز البيانات والخوادم وتخزين SSD والشبكات وتكاليف الكهرباء.

  • القدرة على استخدام التعليمات البرمجية والأدوات الموجودة: توفر خدمة Azure Cosmos DB توافق مستوى بروتوكول سلكي مع حزمة أدوات تطوير برمجيات Cassandra وأدواته الموجودة. يضمن هذا التوافق أنه يمكنك استخدام قاعدة التعليمات البرمجية الموجودة مع Azure Cosmos DB ل Apache Cassandra مع تغييرات بسيطة.

هناك طرق متعددة لترحيل أحمال عمل قاعدة البيانات من نظام أساسي إلى آخر. Azure Databricks عبارة عن نظام أساسي كخدمة (PaaS) يقدم Apache Spark يوفر طريقة لأداء عمليات الترحيل دون اتصال بالإنترنت على نطاق واسع. توضح هذه المقالة الخطوات المطلوبة لترحيل البيانات من مساحات مفاتيح وجداول Apache Cassandra الأصلية إلى Azure Cosmos DB ل Apache Cassandra باستخدام Azure Databricks.

المتطلبات الأساسية

توفير مجموعة Azure Databricks

يمكنك اتباع الإرشادات لتوفير مجموعة Azure Databricks. نوصي بتحديد Databricks runtime الإصدار 7.5، والذي يدعم Spark 3.0.

لقطة شاشة توضح العثور على نسخة وقت تشغيل Databricks.

إضافة تبعيات

تحتاج إلى إضافة مكتبة Apache Spark Cassandra Connector إلى نظام مجموعتك للاتصال بنقاط النهاية الأصلية وAzure Cosmos DB Cassandra. في نظام المجموعة، حدد Libraries>Install New>Maven ثم أضف com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 إحداثيات Maven.

توضح لقطة شاشة البحث عن حزم Maven في Databricks.

حدد Install، ثم أعد تشغيل نظام المجموعة عند اكتمال التثبيت.

إشعار

تأكد من إعادة تشغيل كتلة Databricks بعد تثبيت مكتبة Cassandra Connector.

تحذير

تم اختبار العينات الموضحة في هذه المقالة باستخدام Spark الإصدار 3.0.1 وموصل Cassandra Spark المقابل com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0. قد لا تعمل الإصدارات اللاحقة من Spark و/ أو موصل Cassandra كما هو متوقع.

إنشاء Scala Notebook للترحيل

قم بإنشاء Scala Notebook في Databricks. استبدل المصدر والهدف تكوينات Cassandra ببيانات الاعتماد المقابلة، ومسافات المفاتيح والجداول المصدر والهدف. ثم قم بتشغيل الكود التالي:

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

إشعار

تعد قيم spark.cassandra.output.batch.size.rows وspark.cassandra.output.concurrent.writes وعدد العمال في مجموعة Spark الخاصة بك تكوينات مهمة لضبطها لتجنب تقييد المعدل. يحدث تقييد المعدل عندما تتجاوز الطلبات إلى Azure Cosmos DB الإنتاجية المتوفرة أو وحدات الطلب (RUs). قد تحتاج إلى ضبط هذه الإعدادات، اعتمادًا على عدد المنفذين في مجموعة Spark وربما الحجم (وبالتالي تكلفة RU) لكل سجل تتم كتابته في الجداول المستهدفة.

استكشاف الأخطاء وإصلاحها

تحديد المعدل (خطأ 429)

قد ترى رمز خطأ 429 أو نص خطأ "معدل الطلب كبير" حتى إذا خفّضت الإعدادات إلى قيمها الدنيا. يمكن أن تتسبب السيناريوهات التالية في تحديد المعدل:

  • الإنتاجية المخصصة للجدول أقل من 6,000 وحدة طلب. حتى في الحد الأدنى من الإعدادات، يمكن لـ Spark الكتابة بمعدل نحو 6,000 وحدة طلب أو أكثر. إذا قمت بتزويد جدول في مساحة مفاتيح بإنتاجية مشتركة، فمن المحتمل أن يكون هذا الجدول يحتوي على أقل من 6,000 وحدة RU متاحة في وقت التشغيل.

    تأكد من أن الجدول الذي تقوم بالترحيل إليه يحتوي على 6,000 وحدة RU على الأقل متوفرة عند تشغيل الترحيل. إذا لزم الأمر، قم بتخصيص وحدات طلب مخصصة لهذا الجدول.

  • انحراف مفرط في البيانات بسبب حجم البيانات الكبير. إذا كان لديك قدر كبير من البيانات للترحيل إلى جدول معين ولكن لديك انحراف كبير في البيانات (أي، يتم كتابة عدد كبير من السجلات لنفس قيمة مفتاح القسم)، فقد لا تزال تواجه قيودًا على المعدل حتى إذا كان لديك العديد من وحدات الطلب المتوفرة في الجدول الخاص بك. يتم تقسيم وحدات الطلب بالتساوي بين الأقسام المادية ويمكن أن يؤدي انحراف البيانات بشكل كبير إلى ازدحام الطلبات في قسم واحد.

    في هذا السيناريو، قلّل إعدادات الإنتاجية إلى الحد الأدنى في Spark وفرض الترحيل للعمل ببطء. يمكن أن يكون هذا السيناريو أكثر شيوعًا عندما تقوم بترحيل جداول مرجعية أو تحكم، حيث يكون الوصول أقل تكرارًا ويمكن أن يكون الانحراف مرتفعًا. ومع ذلك، في حالة وجود انحراف كبير في أي نوع آخر من الجداول، فقد ترغب في مراجعة نموذج البيانات لتجنب مشكلات التقسيم الساخنة لأعباء العمل أثناء عمليات الحالة المستقرة.

الخطوات التالية