Перейти к основному содержимому
Перейти к основному содержимому

Интеграция Amazon Glue с ClickHouse и Spark

Amazon Glue — это полностью управляемый, безсерверный сервис интеграции данных, предоставляемый Amazon Web Services (AWS). Он упрощает процесс обнаружения, подготовки и преобразования данных для аналитики, машинного обучения и разработки приложений.

Установка

Чтобы интегрировать ваш код Glue с ClickHouse, вы можете использовать наш официальный Spark коннектор в Glue через один из следующих способов:

  • Установить ClickHouse Glue коннектор из AWS Marketplace (рекомендуется).
  • Вручную добавить JAR-файлы Spark Connector в вашу задачу Glue.
  1. Подписка на коннектор

    Чтобы получить доступ к коннектору в вашем аккаунте, подпишитесь на ClickHouse AWS Glue Connector из AWS Marketplace.

  2. Предоставьте необходимые разрешения

    Убедитесь, что IAM роль вашей задачи Glue имеет необходимые разрешения, как описано в руководстве по минимальным привилегиям.

  3. Активируйте коннектор и создайте подключение

    Вы можете активировать коннектор и создать подключение, нажав на эту ссылку, которая открывает страницу создания соединения Glue с предзаполненными ключевыми полями. Дайте соединению имя и нажмите создать (не нужно предоставлять детали подключения ClickHouse на этом этапе).

  4. Использование в задаче Glue

    В вашей задаче Glue выберите вкладку Job details и разверните окно Advanced properties. В разделе Connections выберите только что созданное соединение. Коннектор автоматически внедрит необходимые JAR-файлы в выполнение задачи.

Настройки соединений Glue Notebook
примечание

JAR-файлы, используемые в коннекторе Glue, построены для Spark 3.3, Scala 2 и Python 3. Убедитесь, что вы выбрали эти версии при настройке вашей задачи Glue.

Примеры

import com.amazonaws.services.glue.GlueContext
import com.amazonaws.services.glue.util.GlueArgParser
import com.amazonaws.services.glue.util.Job
import com.clickhouseScala.Native.NativeSparkRead.spark
import org.apache.spark.sql.SparkSession

import scala.collection.JavaConverters._
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._

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

    val sparkSession: SparkSession = SparkSession.builder
      .config("spark.sql.catalog.clickhouse", "com.clickhouse.spark.ClickHouseCatalog")
      .config("spark.sql.catalog.clickhouse.host", "<your-clickhouse-host>")
      .config("spark.sql.catalog.clickhouse.protocol", "https")
      .config("spark.sql.catalog.clickhouse.http_port", "<your-clickhouse-port>")
      .config("spark.sql.catalog.clickhouse.user", "default")
      .config("spark.sql.catalog.clickhouse.password", "<your-password>")
      .config("spark.sql.catalog.clickhouse.database", "default")
      // for ClickHouse cloud
      .config("spark.sql.catalog.clickhouse.option.ssl", "true")
      .config("spark.sql.catalog.clickhouse.option.ssl_mode", "NONE")
      .getOrCreate

    val glueContext = new GlueContext(sparkSession.sparkContext)
    Job.init(args("JOB_NAME"), glueContext, args.asJava)
    import sparkSession.implicits._

    val url = "s3://{path_to_cell_tower_data}/cell_towers.csv.gz"

    val schema = StructType(Seq(
      StructField("radio", StringType, nullable = false),
      StructField("mcc", IntegerType, nullable = false),
      StructField("net", IntegerType, nullable = false),
      StructField("area", IntegerType, nullable = false),
      StructField("cell", LongType, nullable = false),
      StructField("unit", IntegerType, nullable = false),
      StructField("lon", DoubleType, nullable = false),
      StructField("lat", DoubleType, nullable = false),
      StructField("range", IntegerType, nullable = false),
      StructField("samples", IntegerType, nullable = false),
      StructField("changeable", IntegerType, nullable = false),
      StructField("created", TimestampType, nullable = false),
      StructField("updated", TimestampType, nullable = false),
      StructField("averageSignal", IntegerType, nullable = false)
    ))

    val df = sparkSession.read
      .option("header", "true")
      .schema(schema)
      .csv(url)

    // Write to ClickHouse
    df.writeTo("clickhouse.default.cell_towers").append()


    // Read from ClickHouse
    val dfRead = spark.sql("select * from clickhouse.default.cell_towers")
    Job.commit()
  }
}

Для получения дополнительной информации, пожалуйста, посетите нашу документацию по Spark.