> ## 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.

> Intégrer ClickHouse à Amazon Glue

# Intégration d’Amazon Glue à ClickHouse et 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>
            Compatible avec 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/) est un service d’intégration de données serverless entièrement géré proposé par Amazon Web Services (AWS). Il simplifie la découverte, la préparation et la transformation des données pour l’analytics, le machine learning et le développement d’applications.

<div id="installation">
  ## Installation
</div>

Pour intégrer votre code Glue à ClickHouse, vous pouvez utiliser notre connecteur Spark officiel dans Glue de l’une des façons suivantes :

* Installer le connecteur ClickHouse Glue depuis AWS Marketplace (recommandé).
* Ajouter manuellement les JARs du connecteur Spark à votre job Glue.

<Tabs>
  <Tab title="AWS Marketplace">
    <Steps titleSize="h3">
      <Step title="S’abonner au connecteur" id="subscribe-to-the-connector">
        Pour accéder au connecteur dans votre compte, abonnez-vous au ClickHouse AWS Glue Connector depuis AWS Marketplace.
      </Step>

      <Step title="Accorder les autorisations requises" id="grant-required-permissions">
        Assurez-vous que le rôle IAM de votre job Glue dispose des autorisations nécessaires, comme indiqué dans le [guide](https://docs.aws.amazon.com/glue/latest/dg/getting-started-min-privs-job.html#getting-started-min-privs-connectors) sur les privilèges minimaux.
      </Step>

      <Step title="Activer le connecteur et créer une connexion" id="activate-the-connector">
        Après vous être abonné, sélectionnez la version de Glue qui correspond aux exigences de votre job. Dans la section **Additional details**, sous **Usage instructions**, cliquez sur le lien **Open Glue Studio - Add ClickHouse connector**. Cela ouvre la page de création de connexion Glue avec les champs principaux préremplis. Donnez un nom à la connexion, puis cliquez sur create (inutile de fournir les informations de connexion à ClickHouse à ce stade).

        <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 usage instructions for ClickHouse Glue connector" width="1024" height="182" data-path="images/integrations/data-ingestion/aws-glue/marketplace-usage-instructions.png" />
      </Step>

      <Step title="Utiliser dans un job Glue" id="use-in-glue-job">
        Dans votre job Glue, sélectionnez l’onglet `Job details`, puis développez la section `Advanced properties`. Dans la section `Connections`, sélectionnez la connexion que vous venez de créer. Le connecteur injecte automatiquement les JARs requis dans l’environnement d’exécution du job.

        <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 connections config" force="true" width="877" height="742" data-path="images/integrations/data-ingestion/aws-glue/notebook-connections-config.webp" />

        <Note>
          Veillez à sélectionner la version du connecteur qui correspond à la configuration de votre job Glue :

          * **Glue 4**: Spark 3.3, Scala 2, Python 3
          * **Glue 5**: Spark 3.5, Scala 2, Python 3
        </Note>
      </Step>
    </Steps>
  </Tab>

  <Tab title="Installation manuelle">
    Pour ajouter manuellement les JARs requis, procédez comme suit :

    <Steps titleSize="h3">
      <Step title="Téléverser le JAR du connecteur">
        Téléversez le JAR le plus récent du connecteur Spark (`clickhouse-spark-runtime-3.X_2.X-0.10.X.jar`) dans un bucket S3.
      </Step>

      <Step title="Accorder l’accès au bucket S3">
        Assurez-vous que le job Glue a accès à ce bucket.
      </Step>

      <Step title="Configurer le chemin des JARs dépendants">
        Dans l’onglet `Job details`, faites défiler vers le bas et développez le menu déroulant `Advanced properties`, puis indiquez le chemin des JARs dans `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="Glue Notebook JAR path options" 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">
  ## Utiliser AWS Secrets Manager pour les identifiants
</div>

Au lieu d’inscrire en dur votre nom d’utilisateur et votre mot de passe ClickHouse dans le job, stockez-les dans [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/) et référencez le secret depuis votre connexion Glue ou le script du job. À l’exécution, Glue récupère le secret et fusionne ses paires clé-valeur avec les options de connexion du connecteur.

<div id="create-secret">
  ### Créer le secret
</div>

Dans AWS Secrets Manager, créez un secret de type **Autre type de secret** avec des paires clé-valeur dont les clés correspondent aux noms des options du connecteur :

| Clé        | Valeur                             |
| ---------- | ---------------------------------- |
| `user`     | votre nom d’utilisateur ClickHouse |
| `password` | votre mot de passe ClickHouse      |

Toute clé que vous ajoutez au secret est transmise au connecteur. Vous pouvez donc également y stocker `host`, `database` ou toute autre option si vous souhaitez ne pas les conserver dans le code.

<div id="reference-secret">
  ### Référencer le secret
</div>

Il existe deux façons d’intégrer le secret à un job.

**Option 1 : l’attacher à la connexion Glue.** Lors de la création ou de la modification de la connexion à ClickHouse dans Glue Studio, définissez le champ **AWS secret** sur le nom du secret. Tout job qui utilise cette connexion récupère automatiquement le secret — aucune modification du code n’est nécessaire.

**Option 2 : transmettre `secretId` dans les options de connexion.** Utilisez cette méthode lorsque le secret n’est pas attaché à la connexion. Ajoutez `secretId` en plus de `connectionName` :

<Tabs>
  <Tab title="Python">
    ```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">
    ```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>

Les clés `user` et `password` du secret sont fusionnées avec les options du connecteur à l’exécution, vous n’avez donc jamais besoin de les lire dans votre script.

<div id="example">
  ## Exemples
</div>

Les exemples ci-dessous utilisent `marketplace.spark` et font référence au connecteur via `connectionName`. Si vous avez installé le connecteur manuellement (onglet Installation manuelle), utilisez `connection_type="custom.spark"` et indiquez directement `className`, `host`, `http_port`, `user` et `password` dans les options.

Si vous avez associé un secret AWS à la connexion elle-même (option 1 dans [Utilisation d'AWS Secrets Manager pour les identifiants](#secrets-manager)), supprimez `secretId` des options — Glue récupère automatiquement les identifiants depuis la connexion.

<Tabs>
  <Tab title="Éditeur visuel">
    Vous pouvez utiliser le connecteur ClickHouse comme source ou comme cible dans l'éditeur visuel de Glue Studio. Faites simplement glisser le composant ClickHouse Spark Connector sur le canevas et reliez-le à votre pipeline de données.

    <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="Éditeur visuel de Glue Studio avec le connecteur ClickHouse" width="1024" height="645" data-path="images/integrations/data-ingestion/aws-glue/glue-studio-visual-editor.png" />
  </Tab>

  <Tab title="Scala">
    ```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">
    ```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>

Pour plus de détails, consultez notre [documentation Spark](/fr/integrations/connectors/data-ingestion/apache-spark).
