> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> تكامل ClickHouse مع Amazon Glue

# تكامل Amazon Glue مع ClickHouse وSpark

export const ClickHouseSupportedBadge = () => {
  return <div className="ClickHouseSupportedBadge">
            <div className="ClickHouseSupportedIcon">
                <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <path d="M1.30762 1.39073C1.30762 1.3103 1.37465 1.22986 1.46849 1.22986H2.64824C2.72868 1.22986 2.80912 1.29689 2.80912 1.39073V14.4886C2.80912 14.5691 2.74209 14.6495 2.64824 14.6495H1.46849C1.38805 14.6495 1.30762 14.5825 1.30762 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M4.2832 1.39073C4.2832 1.3103 4.35023 1.22986 4.44408 1.22986H5.62383C5.70427 1.22986 5.7847 1.29689 5.7847 1.39073V14.4886C5.7847 14.5691 5.71767 14.6495 5.62383 14.6495H4.44408C4.36364 14.6495 4.2832 14.5825 4.2832 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M7.25977 1.39073C7.25977 1.3103 7.3268 1.22986 7.42064 1.22986H8.60039C8.68083 1.22986 8.76127 1.29689 8.76127 1.39073V14.4886C8.76127 14.5691 8.69423 14.6495 8.60039 14.6495H7.42064C7.3402 14.6495 7.25977 14.5825 7.25977 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M10.2354 1.39073C10.2354 1.3103 10.3024 1.22986 10.3962 1.22986H11.576C11.6564 1.22986 11.7369 1.29689 11.7369 1.39073V14.4886C11.7369 14.5691 11.6698 14.6495 11.576 14.6495H10.3962C10.3158 14.6495 10.2354 14.5825 10.2354 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M13.2256 6.6057C13.2256 6.52526 13.2926 6.44482 13.3865 6.44482H14.5662C14.6466 6.44482 14.7271 6.51186 14.7271 6.6057V9.27354C14.7271 9.35398 14.6601 9.43442 14.5662 9.43442H13.3865C13.306 9.43442 13.2256 9.36739 13.2256 9.27354V6.6057Z" fill="currentColor" />
                </svg>
            </div>
            متوافق مع ClickHouse
        </div>;
};

export const Image = ({img, alt, size = "lg"}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} />
      </Frame>
    </div>;
};

<ClickHouseSupportedBadge />

تُعد [Amazon Glue](https://aws.amazon.com/glue/) خدمة تكامل بيانات مُدارة بالكامل وبدون خوادم تقدّمها Amazon Web Services ‏(AWS). وهي تُبسّط عملية اكتشاف البيانات وإعدادها وتحويلها لأغراض التحليلات والتعلّم الآلي وتطوير التطبيقات.

<div id="installation">
  ## التثبيت
</div>

لدمج شيفرة Glue الخاصة بك مع ClickHouse، يمكنك استخدام موصل Spark الرسمي الخاص بنا في Glue بإحدى الطريقتين التاليتين:

* تثبيت موصل ClickHouse Glue من AWS Marketplace (موصى به).
* إضافة ملفات JAR الخاصة بـ موصل Spark يدويًا إلى مهمة Glue.

<Tabs>
  <Tab title="AWS Marketplace">
    <Steps titleSize="h3">
      <Step title="الاشتراك في الـ موصل" id="subscribe-to-the-connector">
        للوصول إلى الـ موصل في حسابك، اشترك في موصل ClickHouse AWS Glue من AWS Marketplace.
      </Step>

      <Step title="منح الأذونات المطلوبة" id="grant-required-permissions">
        تأكد من أن دور IAM الخاص بمهمة Glue لديه الأذونات اللازمة، كما هو موضح في [دليل](https://docs.aws.amazon.com/glue/latest/dg/getting-started-min-privs-job.html#getting-started-min-privs-connectors) الحد الأدنى من الامتيازات.
      </Step>

      <Step title="تفعيل الـ موصل وإنشاء اتصال" id="activate-the-connector">
        بعد الاشتراك، حدِّد إصدار Glue الذي يطابق متطلبات مهمتك. في قسم **Additional details**، ضمن **Usage instructions**، انقر على الرابط **Open Glue Studio - Add ClickHouse connector**. سيؤدي ذلك إلى فتح صفحة إنشاء اتصال في Glue مع تعبئة الحقول الأساسية مسبقًا. امنح الـ اتصال اسمًا ثم اضغط على create (ولا حاجة إلى إدخال تفاصيل الاتصال الخاصة بـ ClickHouse في هذه المرحلة).

        <Image img="https://mintcdn.com/private-7c7dfe99-trino-dialect/zkBy8QRjLpx6BosZ/images/integrations/data-ingestion/aws-glue/marketplace-usage-instructions.png?fit=max&auto=format&n=zkBy8QRjLpx6BosZ&q=85&s=d7eb0a5c56bb6478043408c7f043abaf" size="md" alt="إرشادات الاستخدام في AWS Marketplace لـ موصل ClickHouse Glue" width="1024" height="182" data-path="images/integrations/data-ingestion/aws-glue/marketplace-usage-instructions.png" />
      </Step>

      <Step title="الاستخدام في مهمة Glue" id="use-in-glue-job">
        في مهمة Glue، حدِّد علامة التبويب `Job details`، ثم وسِّع نافذة `Advanced properties`. ضمن قسم `Connections`، حدِّد الـ اتصال الذي أنشأته للتو. يضيف الـ موصل تلقائيًا ملفات JAR المطلوبة إلى runtime الخاص بالمهمة.

        <Image img="https://mintcdn.com/private-7c7dfe99-trino-dialect/zkBy8QRjLpx6BosZ/images/integrations/data-ingestion/aws-glue/notebook-connections-config.webp?fit=max&auto=format&n=zkBy8QRjLpx6BosZ&q=85&s=37ac0c0187108958739175644e161f4a" size="md" alt="إعدادات اتصالات Glue Notebook" force="true" width="877" height="742" data-path="images/integrations/data-ingestion/aws-glue/notebook-connections-config.webp" />

        <Note>
          تأكد من تحديد إصدار الـ موصل الذي يطابق تكوين مهمة Glue الخاصة بك:

          * **Glue 4**: Spark 3.3، سكالا 2، بايثون 3
          * **Glue 5**: Spark 3.5، سكالا 2، بايثون 3
        </Note>
      </Step>
    </Steps>
  </Tab>

  <Tab title="التثبيت اليدوي">
    لإضافة ملفات JAR المطلوبة يدويًا، يُرجى اتباع ما يلي:

    <Steps titleSize="h3">
      <Step title="رفع ملف JAR الخاص بالـ موصل">
        ارفع أحدث ملف JAR لـ موصل Spark (`clickhouse-spark-runtime-3.X_2.X-0.10.X.jar`) إلى S3 bucket.
      </Step>

      <Step title="منح حق الوصول إلى S3 bucket">
        تأكد من أن مهمة Glue لديها حق الوصول إلى هذا الـ bucket.
      </Step>

      <Step title="تكوين مسار JAR التابع">
        ضمن علامة التبويب `Job details`، مرِّر إلى الأسفل ووسِّع القائمة المنسدلة `Advanced properties`، ثم أدخل مسار ملفات JAR في `Dependent JARs path`:

        <Image img="https://mintcdn.com/private-7c7dfe99-trino-dialect/zkBy8QRjLpx6BosZ/images/integrations/data-ingestion/aws-glue/dependent_jars_path_option.webp?fit=max&auto=format&n=zkBy8QRjLpx6BosZ&q=85&s=b9e7143669a8e5d7ffa10ea0e105307c" size="md" alt="خيارات مسار JAR في Glue Notebook" force="true" width="954" height="753" data-path="images/integrations/data-ingestion/aws-glue/dependent_jars_path_option.webp" />
      </Step>
    </Steps>
  </Tab>
</Tabs>

<div id="secrets-manager">
  ## استخدام AWS Secrets Manager لبيانات الاعتماد
</div>

بدلاً من تضمين مستخدم ClickHouse وكلمة المرور مباشرةً في المهمة، خزّنهما في [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/) وأشِر إلى السر من اتصال Glue أو البرنامج النصي للمهمة. أثناء التشغيل، يجلب Glue السر ويدمج أزواج المفتاح والقيمة الخاصة بها ضمن خيارات اتصال الموصّل.

<div id="create-secret">
  ### أنشئ السر
</div>

في AWS Secrets Manager، أنشئ سرًا من النوع **نوع آخر من الأسرار** يتضمن أزواجًا من المفتاح والقيمة تكون مفاتيحها مطابقة لأسماء خيارات الموصّل:

| المفتاح    | القيمة                         |
| ---------- | ------------------------------ |
| `user`     | اسم مستخدم ClickHouse الخاص بك |
| `password` | كلمة مرور ClickHouse الخاصة بك |

أي مفتاح تضيفه إلى السر يُمرَّر إلى الموصّل، لذلك يمكنك أيضًا تخزين `host` أو `database` أو أي خيار آخر هناك إذا أردت إبقاءها خارج الشيفرة.

<div id="reference-secret">
  ### الإشارة إلى السر
</div>

هناك طريقتان لربط السر بالمهمة.

**الخيار 1: إرفاقه باتصال Glue.** عند إنشاء أو تحرير اتصال ClickHouse في Glue Studio، اضبط الحقل **AWS secret** على اسم السر. أي مهمة تستخدم هذا الاتصال ستتعرف على السر تلقائيًا — من دون الحاجة إلى أي تغييرات في الشيفرة.

**الخيار 2: تمرير `secretId` ضمن خيارات الاتصال.** استخدم هذا عندما لا يكون السر مرفقًا بالاتصال. أضف `secretId` إلى جانب `connectionName`:

<Tabs>
  <Tab title="بايثون">
    ```python theme={null}
    source = glueContext.create_dynamic_frame.from_options(
        connection_type="marketplace.spark",
        connection_options={
            "connectionName": "<your-connection-name>",
            "secretId": "clickhouse/glue/credentials",
            "database": "default",
            "table": "example_table"
        },
        transformation_ctx="clickhouse_source"
    )
    ```
  </Tab>

  <Tab title="سكالا">
    ```scala theme={null}
    val source = glueContext.getSource(
      connectionType = "marketplace.spark",
      connectionOptions = JsonOptions(Map(
        "connectionName" -> "<your-connection-name>",
        "secretId" -> "clickhouse/glue/credentials",
        "database" -> "default",
        "table" -> "example_table"
      )),
      transformationContext = "clickhouseSource"
    )
    ```
  </Tab>
</Tabs>

تُدمَج المفتاحان `user` و`password` الخاصان بالسر ضمن خيارات الموصل في وقت التشغيل، لذلك لن تحتاج مطلقًا إلى قراءتهما في برنامجك النصي.

<div id="example">
  ## أمثلة
</div>

تستخدم الأمثلة أدناه `marketplace.spark` وتشير إلى الموصل عبر `connectionName`. إذا ثبّتَّ الموصل يدويًا (علامة تبويب التثبيت اليدوي)، فاستخدم `connection_type="custom.spark"` ومرّر `className` و`host` و`http_port` و`user` و`password` مباشرةً ضمن الخيارات بدلًا من ذلك.

إذا كنت قد أرفقت سرًا من AWS بالاتصال نفسه (الخيار 1 في [استخدام AWS Secrets Manager لبيانات الاعتماد](#secrets-manager))، فاحذف `secretId` من الخيارات — إذ يستخرج Glue بيانات الاعتماد من الاتصال تلقائيًا.

<Tabs>
  <Tab title="المحرر المرئي">
    يمكنك استخدام موصل ClickHouse إما كمصدر أو كهدف في المحرر المرئي لـ Glue Studio. ما عليك سوى سحب مكوّن ClickHouse Spark Connector إلى لوحة العمل وربطه بخط أنابيب البيانات لديك.

    <Image img="https://mintcdn.com/private-7c7dfe99-trino-dialect/zkBy8QRjLpx6BosZ/images/integrations/data-ingestion/aws-glue/glue-studio-visual-editor.png?fit=max&auto=format&n=zkBy8QRjLpx6BosZ&q=85&s=7cd32932dec2893a03442470e201b034" size="md" alt="المحرر المرئي لـ Glue Studio مع موصل ClickHouse" width="1024" height="645" data-path="images/integrations/data-ingestion/aws-glue/glue-studio-visual-editor.png" />
  </Tab>

  <Tab title="سكالا">
    ```java theme={null}
    import com.amazonaws.services.glue.GlueContext
    import com.amazonaws.services.glue.util.{GlueArgParser, Job, JsonOptions}
    import org.apache.spark.SparkContext
    import scala.collection.JavaConverters._

    object ClickHouseGlueExample {
      def main(sysArgs: Array[String]): Unit = {
        val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)

        val sc = new SparkContext()
        val glueContext = new GlueContext(sc)
        Job.init(args("JOB_NAME"), glueContext, args.asJava)

        val readOptions = JsonOptions(Map(
          "connectionName" -> "<your-connection-name>",
          "secretId" -> "clickhouse/glue/credentials",
          "database" -> "default",
          "table" -> "example_table"
        ))

        val source = glueContext.getSource(
          connectionType = "marketplace.spark",
          connectionOptions = readOptions,
          transformationContext = "clickhouseSource"
        )
        val dyf = source.getDynamicFrame()

        val writeOptions = JsonOptions(Map(
          "connectionName" -> "<your-connection-name>",
          "secretId" -> "clickhouse/glue/credentials",
          "database" -> "default",
          "table" -> "target_table"
        ))

        glueContext.getSink(
          connectionType = "marketplace.spark",
          connectionOptions = writeOptions
        ).writeDynamicFrame(dyf)

        Job.commit()
      }
    }
    ```
  </Tab>

  <Tab title="بايثون">
    ```python theme={null}
    import sys
    from awsglue.utils import getResolvedOptions
    from pyspark.context import SparkContext
    from awsglue.context import GlueContext
    from awsglue.job import Job

    args = getResolvedOptions(sys.argv, ['JOB_NAME'])

    sc = SparkContext()
    glueContext = GlueContext(sc)
    logger = glueContext.get_logger()
    job = Job(glueContext)
    job.init(args['JOB_NAME'], args)

    read_options = {
        "connectionName": "<your-connection-name>",
        "secretId": "clickhouse/glue/credentials",
        "database": "default",
        "table": "example_table"
    }

    source = glueContext.create_dynamic_frame.from_options(
        connection_type="marketplace.spark",
        connection_options=read_options,
        transformation_ctx="clickhouse_source"
    )
    dyf = source

    logger.info(f"Read {dyf.count()} rows from ClickHouse")

    write_options = {
        "connectionName": "<your-connection-name>",
        "secretId": "clickhouse/glue/credentials",
        "database": "default",
        "table": "target_table"
    }

    glueContext.write_dynamic_frame.from_options(
        frame=dyf,
        connection_type="marketplace.spark",
        connection_options=write_options,
        transformation_ctx="clickhouse_sink"
    )

    job.commit()
    ```
  </Tab>
</Tabs>

لمزيد من التفاصيل، يُرجى زيارة [وثائق Spark](/ar/integrations/connectors/data-ingestion/apache-spark).
