Flink 如何读取和写入 Clickhouse?

点击上方 "zhisheng"关注, 星标或置顶一起成长

Flink 从入门到精通 系列文章

问题导读:
1.Flink读写Clickhouse支持哪个版本?
2.ClickHouse读写Clickhouse有哪些参数?
3.ClickHouse读写Clickhouse参数都有哪些说明?

ClickHouse 读取

一、插件名称

名称:clickhousereader

二、支持的数据源版本

ClickHouse 19.x及以上

三、参数说明

「jdbcUrl」

  • 描述:针对关系型数据库的jdbc连接字符串

  • jdbcUrl参考文档:clickhouse-jdbc官方文档

  • 必选:是

  • 默认值:无

「username」

  • 描述:数据源的用户名

  • 必选:是

  • 默认值:无

「password」

  • 描述:数据源指定用户名的密码

  • 必选:是

  • 默认值:无

「where」

  • 描述:筛选条件,reader插件根据指定的column、table、where条件拼接SQL,并根据这个SQL进行数据抽取。在实际业务场景中,往往会选择当天的数据进行同步,可以将where条件指定为gmt_create > time。

  • 注意:不可以将where条件指定为limit 10,limit不是SQL的合法where子句。

  • 必选:否

  • 默认值:无

「splitPk」

  • 描述:当speed配置中的channel大于1时指定此参数,Reader插件根据并发数和此参数指定的字段拼接sql,使每个并发读取不同的数据,提升读取速率。注意:推荐splitPk使用表主键,因为表主键通常情况下比较均匀,因此切分出来的分片也不容易出现数据热点。目前splitPk仅支持整形数据切分,不支持浮点、字符串、日期等其他类型。如果用户指定其他非支持类型,FlinkX将报错!如果channel大于1但是没有配置此参数,任务将置为失败。

  • 必选:否

  • 默认值:无

「fetchSize」

  • 描述:读取时每批次读取的数据条数。

  • 注意:此参数的值不可设置过大,否则会读取超时,导致任务失败。

  • 必选:否

  • 默认值:1000

「queryTimeOut」

  • 描述:查询超时时间,单位秒。

  • 注意:当数据量很大,或者从视图查询,或者自定义sql查询时,可通过此参数指定超时时间。

  • 必选:否

  • 默认值:1000

「customSql」

  • 描述:自定义的查询语句,如果只指定字段不能满足需求时,可通过此参数指定查询的sql,可以是任意复杂的查询语句。注意:只能是查询语句,否则会导致任务失败;查询语句返回的字段需要和column列表里的字段严格对应;当指定了此参数时,connection里指定的table无效;当指定此参数时,column必须指定具体字段信息,不能以*号代替;

  • 必选:否

  • 默认值:无

「column」

  • 描述:需要读取的字段。

  • 格式:支持3种格式

1.读取全部字段,如果字段数量很多,可以使用下面的写法:

"column":["*"]

2.只指定字段名称:

"column":["id","name"]

3.指定具体信息:

"column": [{
    "name": "col",
    "type": "datetime",
    "format": "yyyy-MM-dd hh:mm:ss",
    "value": "value"
}]

属性说明:

name:字段名称
type:字段类型,可以和数据库里的字段类型不一样,程序会做一次类型转换
format:如果字段是时间字符串,可以指定时间的格式,将字段类型转为日期格式返回
value:如果数据库里不存在指定的字段,则会报错。如果指定的字段存在,当指定字段的值为null时,会以此value值作为默认值返回

  • 必选:是

  • 默认值:无

「polling」

  • 描述:是否开启间隔轮询,开启后会根据pollingInterval轮询间隔时间周期性的从数据库拉取数据。开启间隔轮询还需配置参数pollingInterval,increColumn,可以选择配置参数startLocation。若不配置参数startLocation,任务启动时将会从数据库中查询增量字段最大值作为轮询的开始位置。

  • 必选:否

  • 默认值:false

「pollingInterval」

  • 描述:轮询间隔时间,从数据库中拉取数据的间隔时间,默认为5000毫秒。

  • 必选:否

  • 默认值:5000

「requestAccumulatorInterval」

  • 描述:发送查询累加器请求的间隔时间。

  • 必选:否

  • 默认值:2

配置示例

1、基础配置

{
  "job": {
    "content": [{
      "reader": {
        "parameter" : {
          "column" : [ {
            "name" : "id",
            "type" : "bigint",
            "key" : "id"
          }, {
            "name" : "user_id",
            "type" : "bigint",
            "key" : "user_id"
          }, {
            "name" : "name",
            "type" : "varchar",
            "key" : "name"
          } ],
          "username" : "username",
          "password" : "password",
          "connection" : [ {
            "jdbcUrl" : [ "jdbc:clickhouse://0.0.0.1:8123/dtstack" ],
            "table" : [ "tableTest" ]
          } ],
          "where": "id > 1",
          "splitPk": "id",
          "fetchSize": 1000,
          "queryTimeOut": 1000,
          "customSql": "",
          "requestAccumulatorInterval": 2
        },
        "name" : "clickhousereader"
      },
      "writer": {
        "name": "streamwriter",
        "parameter": {
          "print": true
        }
      }
    }],
    "setting": {
      "speed": {
        "channel": 1,
        "bytes": 0
      },
      "errorLimit": {
        "record": 100
      }
    }
  }
}

2、多通道

{
  "job": {
    "content": [{
      "reader": {
        "parameter" : {
          "column" : [ {
            "name" : "id",
            "type" : "bigint",
            "key" : "id"
          }, {
            "name" : "user_id",
            "type" : "bigint",
            "key" : "user_id"
          }, {
            "name" : "name",
            "type" : "varchar",
            "key" : "name"
          } ],
          "username" : "username",
          "password" : "password",
          "connection" : [ {
            "jdbcUrl" : [ "jdbc:clickhouse://0.0.0.1:8123/dtstack" ],
            "table" : [ "tableTest" ]
          } ],
          "where": "id > 1",
          "splitPk": "id",
          "fetchSize": 1000,
          "queryTimeOut": 1000,
          "customSql": "",
          "requestAccumulatorInterval": 2
        },
        "name" : "clickhousereader"
      },
      "writer": {
        "name": "streamwriter",
        "parameter": {
          "print": true
        }
      }
    }],
    "setting": {
      "speed": {
        "channel": 3,
        "bytes": 0
      },
      "errorLimit": {
        "record": 100
      }
    }
  }
}

3、指定customSql

{
  "job": {
    "content": [{
      "reader": {
        "parameter" : {
          "column" : [ {
            "name" : "id",
            "type" : "bigint",
            "key" : "id"
          }, {
            "name" : "user_id",
            "type" : "bigint",
            "key" : "user_id"
          }, {
            "name" : "name",
            "type" : "varchar",
            "key" : "name"
          } ],
          "username" : "username",
          "password" : "password",
          "connection" : [ {
            "jdbcUrl" : [ "jdbc:clickhouse://0.0.0.1:8123/dtstack" ],
            "table" : [ "tableTest" ]
          } ],
          "where": "id > 1",
          "splitPk": "id",
          "fetchSize": 1000,
          "queryTimeOut": 1000,
          "customSql": "select id from tableTest",
          "requestAccumulatorInterval": 2
        },
        "name" : "clickhousereader"
      },
      "writer": {
        "name": "streamwriter",
        "parameter": {
          "print": true
        }
      }
    }],
    "setting": {
      "speed": {
        "channel": 1,
        "bytes": 0
      },
      "errorLimit": {
        "record": 100
      }
    }
  }
}

4、增量同步指定startLocation

{
  "job": {
    "content": [{
      "reader": {
        "parameter" : {
          "column" : [ {
            "name" : "id",
            "type" : "bigint",
            "key" : "id"
          }, {
            "name" : "user_id",
            "type" : "bigint",
            "key" : "user_id"
          }, {
            "name" : "name",
            "type" : "varchar",
            "key" : "name"
          } ],
          "username" : "username",
          "password" : "password",
          "connection" : [ {
            "jdbcUrl" : [ "jdbc:clickhouse://0.0.0.1:8123/dtstack" ],
            "table" : [ "tableTest" ]
          } ],
          "where": "id > 1",
          "splitPk": "id",
          "fetchSize": 1000,
          "queryTimeOut": 1000,
          "customSql": "",
          "increColumn": "id",
          "startLocation": "20",
          "requestAccumulatorInterval": 2
        },
        "name" : "clickhousereader"
      },
      "writer": {
        "name": "streamwriter",
        "parameter": {
          "print": true
        }
      }
    }],
    "setting": {
      "speed": {
        "channel": 1,
        "bytes": 0
      },
      "errorLimit": {
        "record": 100
      }
    }
  }
}

5、间隔轮询

{
  "job": {
    "content": [{
      "reader": {
        "parameter" : {
          "column" : [ {
            "name" : "id",
            "type" : "bigint",
            "key" : "id"
          }, {
            "name" : "user_id",
            "type" : "bigint",
            "key" : "user_id"
          }, {
            "name" : "name",
            "type" : "varchar",
            "key" : "name"
          } ],
          "username" : "username",
          "password" : "password",
          "connection" : [ {
            "jdbcUrl" : [ "jdbc:clickhouse://0.0.0.1:8123/dtstack" ],
            "table" : [ "tableTest" ]
          } ],
          "where": "id > 1",
          "splitPk": "id",
          "fetchSize": 1000,
          "queryTimeOut": 1000,
          "customSql": "",
          "requestAccumulatorInterval": 2,
          "polling": true,
          "pollingInterval": 3000
        },
        "name" : "clickhousereader"
      },
      "writer": {
        "name": "streamwriter",
        "parameter": {
          "print": true
        }
      }
    }],
    "setting": {
      "speed": {
        "channel": 1,
        "bytes": 0
      },
      "errorLimit": {
        "record": 100
      }
    }
  }
}

ClickHouse 写入

一、插件名称

名称:clickhousewriter

二、支持的数据源版本

ClickHouse 19.x及以上

三、参数说明

「jdbcUrl」

  • 描述:针对关系型数据库的jdbc连接字符串

  • 必选:是

  • 默认值:无

「username」

  • 描述:数据源的用户名

  • 必选:是

  • 默认值:无

「password」

  • 描述:数据源指定用户名的密码

  • 必选:是

  • 默认值:无

「column」

  • 描述:目的表需要写入数据的字段,字段之间用英文逗号分隔。例如: "column": ["id","name","age"]。

  • 必选:是

  • 默认值:否

  • 默认值:无

「preSql」

  • 描述:写入数据到目的表前,会先执行这里的一组标准语句

  • 必选:否

  • 默认值:无

「postSql」

  • 描述:写入数据到目的表后,会执行这里的一组标准语句

  • 必选:否

  • 默认值:无

「table」

  • 描述:目的表的表名称。目前只支持配置单个表,后续会支持多表

  • 必选:是

  • 默认值:无

「writeMode」

  • 描述:控制写入数据到目标表采用 insert into 语句,只支持insert操作

  • 必选:是

  • 所有选项:insert

  • 默认值:insert

「batchSize」

  • 描述:一次性批量提交的记录数大小,该值可以极大减少FlinkX与数据库的网络交互次数,并提升整体吞吐量。但是该值设置过大可能会造成FlinkX运行进程OOM情况

  • 必选:否

  • 默认值:1024

「插件下载」

公众号内回复 「flinkx」 即可获取

转载:https://www.aboutyun.com/forum.php?mod=viewthread&tid=29271




基于 Apache Flink 的实时监控告警系统关于数据中台的深度思考与总结(干干货)日志收集Agent,阴暗潮湿的地底世界
2020 继续踏踏实实的做好自己

公众号(zhisheng)里回复 面经、ES、Flink、 Spring、Java、Kafka、监控 等关键字可以查看更多关键字对应的文章。

你点的每个赞,我都当成了喜欢
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用Flink Clickhouse Sink来将数据写入Clickhouse,具体步骤如下: 1. 安装Flink Clickhouse Sink:将Maven依赖添加到pom.xml文件中,并在Flink程序中添加依赖; 2. 创建Clickhouse数据库和表:使用ClickhouseSQL语句创建数据库和表; 3. 配置Flink Clickhouse Sink:使用ClickhouseSinkBuilder类来构建Flink Clickhouse Sink; 4. 将Flink Clickhouse Sink添加到Flink程序中:在Flink程序中添加Flink Clickhouse Sink,将流数据写入Clickhouse。 ### 回答2: 要将Flink SQL写入ClickHouse,可以按照以下步骤进行操作: 1. 首先,确保你已经正确配置好FlinkClickHouse的环境。 2. 在Flink SQL中,你需要创建一个Table,并定义它的结构、格式和连接器。例如,可以使用以下语句创建一个ClickHouse的Table: ``` CREATE TABLE clickhouse_table ( id INT, name STRING, age INT ) WITH ( 'connector' = 'clickhouse', 'url' = 'jdbc:clickhouse://localhost:8123/default', 'table-name' = 'clickhouse_table', 'username' = 'your_username', 'password' = 'your_password' ) ``` 这里的`'connector'`参数指定使用ClickHouse连接器,`'url'`参数指定ClickHouse的连接地址,`'table-name'`参数指定要写入ClickHouse表的名称,`'username'`和`'password'`参数用于验证。 3. 接下来,在你的Flink SQL作业中,使用类似以下的语句将数据写入ClickHouse: ``` INSERT INTO clickhouse_table SELECT id, name, age FROM source_table ``` 这里的`clickhouse_table`是在第2步中定义的ClickHouse表,`source_table`是源数据的表。 4. 最后,启动或提交Flink SQL作业,Flink将会将从源表中读取的数据写入ClickHouse表中。 需要注意的是,以上仅是一个基本的示例,实际场景下可能会有更多配置项和细节需要处理。优化性能和数据写入方式的问题也应根据具体情况进行考虑和调整。 ### 回答3: 要将Flink SQL写入ClickHouse,可以按以下步骤操作: 1. 配置ClickHouse连接:在Flink的配置文件中,将ClickHouse的连接信息添加到"flink-conf.yaml"文件中。包括ClickHouse的IP地址、端口号、用户名和密码等信息。 2. 创建ClickHouse表:在ClickHouse中创建一个用于接收Flink SQL结果的表。可以使用ClickHouse的客户端工具或通过在ClickHouse的管理界面执行SQL语句来完成表的创建。 3. 在Flink SQL中定义输出表:在Flink SQL中使用"CREATE TABLE"语句定义一个输出表,该表将用于将数据写入ClickHouse中。在表的定义中,需要指定表的名称、字段列表和数据类型,以及指定数据写入的目标表名。 4. 在Flink作业中配置ClickHouse写入器:在Flink的代码中,通过创建一个新的ClickHouseSinkFunction实例来配置ClickHouse写入器。将该写入器与Flink SQL中定义的输出表相关联,并将ClickHouse连接的配置信息传递给写入器。 5. 执行Flink作业:启动Flink作业并提交Flink SQL查询。Flink将根据查询结果将数据写入ClickHouse中的指定表中。 需要注意的是,FlinkClickHouse的版本兼容性,以及Flink SQLClickHouse的支持情况。在配置过程中,要确保FlinkClickHouse版本匹配,并且所使用的Flink SQL函数和语法在ClickHouse中被支持。 以上就是将Flink SQL写入ClickHouse的基本步骤,具体的实现方式可以根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值