spark 通过 jdbc 写入 clickhouse 需要注意的点

最近在用 spark 通过 jdbc 写入 clickhouse 的时候,遇到一些坑,这里分享下,造福人民群众。

一个 WARN

WARN JdbcUtils: Requested isolation level 1, but transactions are unsupported

这是因为 clickhouse 不支持事务造成的,解决方案,jdbc 加入 isolationLevel 等于 NONE 的选项,isolationLevel 详解

The transaction isolation level, which applies to current connection. It can be one of NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, or SERIALIZABLE, corresponding to standard transaction isolation levels defined by JDBC's Connection object, with default of READ_UNCOMMITTED. This option applies only to writing. Please refer the documentation in java.sql.Connection.

一个报错

merges are processing significantly slower than inserts

这是因为 spark 多个 partition 同时并发写引发的错误,解决方案 jdbc 加入 numPartitions 等于 1 的选项控制并发数,numPartitions 详解

The maximum number of partitions that can be used for parallelism in table reading and writing. This also determines the maximum number of concurrent JDBC connections. If the number of partitions to write exceeds this limit, we decrease it to this limit by calling coalesce(numPartitions) before writing.

完整 scala 代码

    spark.createDataFrame(data)
      .write
      .mode(SaveMode.Append)
      .option("batchsize", "50000")
      .option("isolationLevel", "NONE") // 设置事务
      .option("numPartitions", "1") // 设置并发
      .jdbc(dbUrl,
        "table",
        dbProp)

更多 spark jdbc 选项,参考 spark 官方文档 更多架构、PHP、GO相关踩坑实践技巧请关注我的公众号

转载于:https://my.oschina.net/u/222608/blog/3080008

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将数据从Spark保存到ClickHouse,可以使用ClickHouse JDBC连接器。以下是一些基本步骤: 1. 在Spark中,首先需要ClickHouse JDBC连接器添加到项目的依赖项中。可以在Maven或Gradle配置文件中添加ClickHouse JDBC依赖项。 2. 创建一个Spark DataFrame,其中包含要保存到ClickHouse的数据。 3. 在保存DataFrame之前,需要配置ClickHouse连接器。可以使用`spark.conf.set`方法设置以下连接器属性: - `spark.clickhouse.url`: ClickHouse服务器的URL。 - `spark.clickhouse.username`: 连接到ClickHouse所需的用户名。 - `spark.clickhouse.password`: 连接到ClickHouse所需的密码。 4. 使用`DataFrame.write`方法保存数据到ClickHouse。指定存储格式为ClickHouse,并指定表的名称。 以下是一个示例代码: ```scala import org.apache.spark.sql.{DataFrame, SparkSession} val spark = SparkSession.builder() .appName("Save to ClickHouse") .config("spark.clickhouse.url", "jdbc:clickhouse://<clickhouse-host>:<clickhouse-port>/<database>") .config("spark.clickhouse.username", "<username>") .config("spark.clickhouse.password", "<password>") .getOrCreate() val data: DataFrame = ... // 创建包含要保存到ClickHouse的数据的DataFrame data.write .format("jdbc") .option("driver", "ru.yandex.clickhouse.ClickHouseDriver") .option("url", "jdbc:clickhouse://<clickhouse-host>:<clickhouse-port>/<database>") .option("dbtable", "<table-name>") .mode("append") .save() ``` 请确保将 `<clickhouse-host>`,`<clickhouse-port>`,`<database>`,`<username>`,`<password>` 替换为实际的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值