أصبح Apache Iceberg بسرعة المعيار لمصطلحات الجداول المفتوحة في منظومة البيانات الضخمة. من خلال توفير معاملات ACID، وتطور المخطط، والإصدارات مباشرة فوق بحيرات البيانات، يربط Iceberg الفجوة بين مرونة بحيرة البيانات وموثوقية مستودع البيانات. ومع ذلك، قد يكون البدء مع Iceberg أمرًا مبالغًا فيه بسبب المكونات والتبعيات المختلفة المعنية.
يوفر هذا الدليل شرحًا شاملًا للمطورين من المستوى المتوسط والمتقدم حول كيفية تثبيت وتكوين Apache Iceberg باستخدام Apache Spark، وهو أحد أكثر المحركات شيوعًا لمعالجة جداول Iceberg. سنغطي المتطلبات المسبقة، وتثبيت التبعيات، وإنشاء جدولك الأول.
المتطلبات المسبقة وإعداد البيئة
قبل الغوص في التثبيت، تأكد من أن بيئتك تلبي المتطلبات التالية:
- JDK 1.8 أو أحدث: يدعم Iceberg إصدار Java 8 فأعلى، لكن يُوصى باستخدام Java 11 أو 17 للأداء.
- Apache Spark 3.x: سنستخدم Spark 3.3+ في هذا المثال، لأنه يتمتع بتكامل أصلي أفضل مع Iceberg.
- نظام ملفات متوافق: نظام ملفات محلي للتطوير، أو S3/GCS/HDFS للإنتاج.
- Maven أو Gradle: لإدارة التبعيات في مشروع Java/Scala.
إضافة تبعيات Iceberg
الخطوة الأولى في تثبيت Iceberg هي إضافة المكتبات اللازمة إلى مشروعك. Iceberg ذو طبيعة معيارية، لذا تحتاج إلى المكتبة الأساسية ومكتبة تكامل المحرك المحددة (في هذه الحالة، Spark).
فيما يلي مقتطف pom.xml لـ Maven. لاحظ الإصدار 1.2.0؛ يجب عليك التحقق من صفحة الإصدار الرسمية للحصول على أحدث إصدار مستقر.
<dependency>
<groupId>org.apache.iceberg</groupId>
<artifactId>iceberg-core</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.iceberg</groupId>
<artifactId>iceberg-spark-runtime-3.3_2.12</artifactId>
<version>1.2.0</version>
</dependency>
ملاحظة مهمة حول التظليل (Shading): عنصر iceberg-spark-runtime مُظلَّل، مما يعني أنه يعيد تغليف التبعيات الداخلية لتجنب التعارض مع مكتبات Spark الموجودة لديك. هذه هي الطريقة الموصى بها لتطبيقات Spark.
تكوين جلسة Spark
بمجرد إضافة التبعيات، تحتاج إلى تكوين جلسة Spark لتعترف بفهرس Iceberg. يدعم Iceberg فهارس متعددة، بما في ذلك hive، وjdbc، وrest، وhadoop. من أجل البساطة والاختبار المحلي، سنستخدم HadoopCatalog الذي يخزن البيانات الوصفية في نظام الملفات نفسه.
إليك مثال بلغة Scala لتكوين جلسة Spark:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.execution.datasources.v2.V2SessionCatalog
val spark = SparkSession.builder()
.appName("IcebergInstallationGuide")
.master("local[*]")
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
.config("spark.sql.catalog.iceberg", "org.apache.iceberg.spark.SparkCatalog")
.config("spark.sql.catalog.iceberg.type", "hadoop")
.config("spark.sql.catalog.iceberg.warehouse", "/tmp/iceberg-warehouse")
.getOrCreate()
شرح التكوينات الرئيسية:
spark.sql.extensions: يسجل امتدادات SQL الخاصة بـ Iceberg.spark.sql.catalog.iceberg: يعرّف فهرسًا باسم "iceberg".spark.sql.catalog.iceberg.type: يحدد تنفيذ الفهرس.hadoopهو الأسهل للتطوير المحلي. للإنتاج، استخدمhiveأوrest.spark.sql.catalog.iceberg.warehouse: المجلد الجذر حيث سيتم تخزين بيانات الجدول والبيانات الوصفية.
إنشاء واستعلام أول جدول Iceberg لك
مع تكوين الفهرس، يمكنك الآن إنشاء جدول Iceberg. دعنا ننشئ جدولًا بسيطًا باسم user_events في مساحة اسم تسمى analytics.
import org.apache.spark.sql.functions._
// Create namespace
spark.sql("CREATE NAMESPACE IF NOT EXISTS iceberg.analytics")
// Create table
spark.sql("""
CREATE TABLE IF NOT EXISTS iceberg.analytics.user_events (
id INT,
name STRING,
action STRING,
timestamp TIMESTAMP
)
USING ICEBERG
""")
// Insert sample data
val data = spark.createDataFrame(Seq(
(1, "Alice", "login", "2023-10-27 10:00:00".toTimestamp),
(2, "Bob", "purchase", "2023-10-27 10:05:00".toTimestamp)
)).toDF("id", "name", "action", "timestamp")
data.writeTo("iceberg.analytics.user_events").append()
// Query the table
spark.sql("SELECT * FROM iceberg.analytics.user_events").show()
التحقق وأفضل الممارسات
بعد تشغيل الكود أعلاه، يجب أن ترى البيانات النموذجية مطبوعة في وحدة التحكم. للتحقق من نجاح التثبيت، افحص نظام الملفات في /tmp/iceberg-warehouse/analytics/user_events. يجب أن ترى مجلدات للبيانات والبيانات الوصفية واللقطات (snapshots).
أفضل الممارسات للإنتاج:
- استخدم مخزن بيانات وصفية (Metastore): بينما يكون فهرس
hadoopمناسبًا للاختبار، استخدم Hive Metastore أو فهرس REST في الإنتاج لدعم المحركات المتعددة وإدارة البيانات الوصفية. - تكرار الالتزام (Commit): يمكن أن تكون عمليات الالتزام في Iceberg مكلفة. قم بترميز عمليات الكتابة بالدفعة لتقليل عدد اللقطات (snapshots) المُنشأة.
- انتهاء صلاحية اللقطات (Snapshot Expiration): قم بتكوين سياسات انتهاء صلاحية اللقطات لإدارة تكاليف التخزين. تستهلك اللقطات القديمة مساحة القرص حتى يتم إزالتها صراحةً.
الخلاصة
تثبيت Apache Iceberg عملية مباشرة بمجرد فهم نظام الفهارس وإدارة التبعيات. من خلال الاستفادة من عناصر وقت التشغيل المُظلَّلة وتكوين جلسة Spark بشكل صحيح، يمكنك البدء بسرعة في بناء خطوط أنابيب بيانات موثوقة ومتوافقة مع ACID على بحيرة البيانات الحالية لديك. عند الانتقال إلى الإنتاج، فكر في الانتقال من فهرس Hadoop إلى فهارس Hive أو REST لفتح ميزات متقدمة مثل الوصول المتزامن وإدارة البيانات الوصفية المركزية.