20、Flink 数据写入 StarRocks

Flink 数据写入 StarRocks
引用:StarRocks官网:从 Apache Flink® 持续导入
目录:

常用参数

同Flink数据类型映射

一、概述
1)版本说明
组件版本
Flink1.14.6
StarRocks3.1.2
Scala2.11
2)写入 StarRocks 介绍

StarRocks 提供 flink-connector-starrocks,导入数据至 StarRocks,相比于 Flink 官方提供的 flink-connector-jdbc,导入性能更佳。 flink-connector-starrocks 的内部实现是通过缓存并批量由 Stream Load 导入。

注意

导入操作需要目标表的 INSERT 权限。

支持的数据源

CSV

JSON

常用参数
参数是否必填默认值数据类型描述
connectorString固定设置为 starrocks
jdbc-urlStringFE 的 MySQL Server 连接地址。格式为 jdbc:mysql://:
load-urlStringFE 的 HTTP Server 连接地址。格式为 :;:,可以提供多个地址,使用英文分号 (😉 分隔。例如 192.168.xxx.xxx:8030;192.168.xxx.xxx:8030
database-nameStringStarRocks 目标数据库的名称。
table-nameStringStarRocks 目标数据表的名称。
usernameString用于访问 StarRocks 集群的用户名。该账号需具备 StarRocks 目标数据表的写权限。
passwordString用于访问 StarRocks 集群的用户密码。
sink.semanticat-least-onceString数据 sink 至 StarRocks 的语义。at-least-once: 至少一次。exactly-once:精确一次。
sink.buffer-flush.max-bytes94371840(90M)String数据攒批的大小,达到该阈值后将数据通过 Stream Load 批量写入 StarRocks。取值范围:[64MB, 10GB]。
sink.buffer-flush.max-rows500000String数据攒批的条数,达到该阈值后将数据通过 Stream Load 批量写入 StarRocks。取值范围:[64000, 5000000]。
sink.buffer-flush.interval-ms300000String数据攒批发送的间隔,用于控制数据写入 StarRocks 的延迟,取值范围:[1000, 3600000]。
sink.max-retries3StringStream Load 失败后的重试次数。超过该数量上限,则数据导入任务报错。取值范围:[0, 10]。
sink.connect.timeout-ms1000String连接 load-url 的超时时间。取值范围:[100, 60000]。
sink.properties.formatCSVStringStream Load 导入时的数据格式。取值为 CSV 或者 JSON
sink.properties.timeout600StringStream Load 超时时间,单位为秒。 exactly-once 下需要确保该值大于 Flink checkpoint 间隔。
sink.properties.max_filter_ratio0String用于指定导入作业的最大容错率,即导入作业能够容忍的因数据质量不合格而过滤掉的数据行所占的最大比例。取值范围:0~1。默认值:0。
Flink 与 StarRocks 的数据类型映射关系
Flink typeStarRocks type
BOOLEANBOOLEAN
TINYINTTINYINT
SMALLINTSMALLINT
INTEGERINTEGER
BIGINTBIGINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMALDECIMAL
BINARYINT
CHARSTRING
VARCHARSTRING
STRINGSTRING
DATEDATE
TIMESTAMP_WITHOUT_TIME_ZONE(N)DATETIME
TIMESTAMP_WITH_LOCAL_TIME_ZONE(N)DATETIME
ARRAY<T>ARRAY<T>
MAP<KT,VT>JSON STRING
ROW<arg T…>JSON STRING

注意:当前不支持 Flink 的 BYTES、VARBINARY、TIME、INTERVAL、MULTISET、RAW。

二、代码实现
1)DataStream 导入 JSON 类型数据
// -------- 原始数据为 json 格式 --------
fromElements(new String[]{
    "{\"score\": \"99\", \"name\": \"stephen\"}",
    "{\"score\": \"100\", \"name\": \"lebron\"}"
}).addSink(
    StarRocksSink.sink(
        // the sink options
        StarRocksSinkOptions.builder()
            .withProperty("jdbc-url", "jdbc:mysql://fe1_ip:query_port,fe2_ip:query_port,fe3_ip:query_port/xxxxx")
            .withProperty("load-url", "fe1_ip:http_port;fe2_ip:http_port;fe3_ip:http_port")
            .withProperty("username", "xxx")
            .withProperty("password", "xxx")
            .withProperty("table-name", "xxx")
            //  自 2.4 版本,支持更新主键模型中的部分列。您可以通过以下两个属性指定需要更新的列,并且需要在 'sink.properties.columns' 的最后显式添加 '__op' 列。
            // .withProperty("sink.properties.partial_update", "true")
            // .withProperty("sink.properties.columns", "k1,k2,k3,__op")
            .withProperty("sink.properties.format", "json")
            .withProperty("sink.properties.strip_outer_array", "true")
            .build()
    )
).setParallelism(1); // 设置并行度,多并行度情况下需要考虑如何保证数据有序性。
2)DataStream 导入 CSV 类型数据
// -------- 原始数据为 CSV 格式 --------
class RowData {
    public int score;
    public String name;
    public RowData(int score, String name) {
        ......
    }
}

fromElements(
    new RowData[]{
        new RowData(99, "stephen"),
        new RowData(100, "lebron")
    }
).addSink(
    StarRocksSink.sink(
        // the table structure
        TableSchema.builder()
            .field("score", DataTypes.INT())
            .field("name", DataTypes.VARCHAR(20))
            .build(),
        // the sink options
        StarRocksSinkOptions.builder()
            .withProperty("jdbc-url", "jdbc:mysql://fe1_ip:query_port,fe2_ip:query_port,fe3_ip:query_port?xxxxx")
            .withProperty("load-url", "fe1_ip:http_port;fe2_ip:http_port;fe3_ip:http_port")
            .withProperty("username", "xxx")
            .withProperty("password", "xxx")
            .withProperty("table-name", "xxx")
            .withProperty("database-name", "xxx")
            //  自 2.4 版本,支持更新主键模型中的部分列。您可以通过以下两个属性指定需要更新的列,并且需要在 'sink.properties.columns' 的最后显式添加 '__op' 列。
            // .withProperty("sink.properties.partial_update", "true")
            // .withProperty("sink.properties.columns", "k1,k2,k3,__op")
            .withProperty("sink.properties.column_separator", "\\x01")
            .withProperty("sink.properties.row_delimiter", "\\x02")
            .build(),
        // set the slots with streamRowData
        (slots, streamRowData) -> {
            slots[0] = streamRowData.score;
            slots[1] = streamRowData.name;
        }
    )
);
3)Flink SQL 导入数据
// -------- 原始数据为 CSV 格式 --------
tEnv.executeSql(
    "CREATE TABLE USER_RESULT(" +
        "name VARCHAR," +
        "score BIGINT" +
    ") WITH ( " +
        "'connector' = 'starrocks'," +
        "'jdbc-url'='jdbc:mysql://fe1_ip:query_port,fe2_ip:query_port,fe3_ip:query_port/xxxxx'," +
        "'load-url'='fe1_ip:http_port;fe2_ip:http_port;fe3_ip:http_port'," +
        "'database-name' = 'xxx'," +
        "'table-name' = 'xxx'," +
        "'username' = 'xxx'," +
        "'password' = 'xxx'," +
        "'sink.buffer-flush.max-rows' = '1000000'," +
        "'sink.buffer-flush.max-bytes' = '300000000'," +
        "'sink.buffer-flush.interval-ms' = '5000'," +
        // 自 2.4 版本,支持更新主键模型中的部分列。您可以通过以下两个属性指定需要更新的列,并且需要在 'sink.properties.columns' 的最后显式添加 '__op' 列。
        // "'sink.properties.partial_update' = 'true'," +
        // "'sink.properties.columns' = 'k1,k2,k3,__op'," + 
        "'sink.properties.column_separator' = '\\x01'," +
        "'sink.properties.row_delimiter' = '\\x02'," +
        "'sink.properties.*' = 'xxx'," + // Stream Load 属性,例如 `'sink.properties.columns' = 'k1, v1'`。
        "'sink.max-retries' = '3'," +
        "'sink.parallelism' = '1'" // 设置并行度,多并行度情况下需要考虑如何保证数据有序性。
    ")"
);

注意:DataStream的 jdbc-url 不需要加库名。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫爱吃小鱼粮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值