使用Flink写clickhouse

 添加依赖:

   <dependencies>
        <!-- Apache Flink dependencies -->
        <!-- These dependencies are provided, because they should not be packaged into the JAR file. -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>org.apache.flink</groupId>-->
<!--            <artifactId>flink-statebackend-rocksdb_${scala.binary.version}</artifactId>-->
<!--            <version>${flink.version}</version>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-scala-bridge_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-common</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner-blink_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>


        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

      
        <!-- https://mvnrepository.com/artifact/ru.yandex.clickhouse/clickhouse-jdbc -->
        <dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-jdbc_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>



        <!-- Add logging framework, to produce console output when running in the IDE. -->
        <!-- These dependencies are excluded from the application JAR by default. -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

 

示例

本示例使用Kafka connector,通过Flink将Kafka数据实时导入到ClickHouse

 

public class FlinkSinkClickHouse {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:clickhouse://192.168.10.203:8123/default";
        String user = "default";
        String passwd = "hOn0d9HT";
        String driver = "ru.yandex.clickhouse.ClickHouseDriver";
        int batchsize = 500; // 设置batch size,测试的话可以设置小一点,这样可以立刻看到数据被写入

        // 创建执行环境
        EnvironmentSettings settings = EnvironmentSettings
                .newInstance()
                .useBlinkPlanner()
                .inStreamingMode()
                .build();

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings);

        String kafkaSource11 = "" +
                "CREATE TABLE user_behavior ( " +
                " `user_id` BIGINT, -- 用户id\n" +
                " `item_id` BIGINT, -- 商品id\n" +
                " `cat_id` BIGINT, -- 品类id\n" +
                " `action` STRING, -- 用户行为\n" +
                " `province` INT, -- 用户所在的省份\n" +
                " `ts` BIGINT, -- 用户行为发生的时间戳\n" +" `proctime` AS PROCTIME(), -- 通过计算列产生一个处理时间列\n" +
                " `eventTime` AS TO_TIMESTAMP(FROM_UNIXTIME(ts, 'yyyy-MM-dd HH:mm:ss')), -- 事件时间\n" +
                " WATERMARK FOR eventTime AS eventTime - INTERVAL '5' SECOND -- 在eventTime上定义watermark\n" +
                ") WITH ( 'connector' = 'kafka', -- 使用 kafka connector\n" +
                " 'topic' = 'user_behavior', -- kafka主题\n" +
                " 'scan.startup.mode' = 'earliest-offset', -- 偏移量,从起始 offset 开始读取\n" +
                " 'properties.group.id' = 'group1', -- 消费者组\n" +
                " 'properties.bootstrap.servers' = 'kms-2:9092,kms-3:9092,kms-4:9092', -- kafka broker 地址\n" +
                " 'format' = 'json', -- 数据源格式为 json\n" +
                " 'json.fail-on-missing-field' = 'true',\n" +
                " 'json.ignore-parse-errors' = 'false'" +
                ")";

        // Kafka Source
        tEnv.executeSql(kafkaSource11);
        String query = "SELECT user_id,item_id,cat_id,action,province,ts FROM user_behavior";
        Table table = tEnv.sqlQuery(query);

        String insertIntoCkSql = "INSERT INTO behavior_mergetree(user_id,item_id,cat_id,action,province,ts)\n" +
                "VALUES(?,?,?,?,?,?)";

        //将数据写入 ClickHouse Sink
        JDBCAppendTableSink sink = JDBCAppendTableSink
                .builder()
                .setDrivername(driver)
                .setDBUrl(url)
                .setUsername(user)          
                .setPassword(passwd)
                .setQuery(insertIntoCkSql)
                .setBatchSize(batchsize)
                .setParameterTypes(Types.LONG, Types.LONG,Types.LONG, Types.STRING,Types.INT,Types.LONG)
                .build();

        String[] arr = {"user_id","item_id","cat_id","action","province","ts"};
        TypeInformation[] type = {Types.LONG, Types.LONG,Types.LONG, Types.STRING,Types.INT,Types.LONG};

        tEnv.registerTableSink(
                "sink",
                arr,
                type,
                sink
        );

        tEnv.insertInto(table, "sink");

        tEnv.execute("Flink Table API to ClickHouse Example");
    }

}

Note:

  • 由于 ClickHouse 单次插入的延迟比较高,我们需要设置 BatchSize 来批量插入数据,提高性能。
  • 在 JDBCAppendTableSink 的实现中,若最后一批数据的数目不足 BatchSize,则不会插入剩余数据。
  •  
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Flink是一个高效、可靠、易用的分布式流处理系统,而ClickHouse则是一个面向列的分布式关系数据库管理系统。Flink Connector ClickHouse是将这两个系统结合起来,实现FlinkClickHouse之间的无缝连接。 Flink Connector ClickHouse提供了一个数据源和Sink的功能,它能够让Flink通过ClickHouse来存储和查询数据。这个功能在实时的大数据处理中非常重要,因为数据量很大,需要高效的存储和查询。通过使用这个Connector,我们可以加速数据处理效率,提高实时数据分析的准确性。 Flink Connector ClickHouse还支持多种数据格式的转换和传输,包括JSON和Avro等。这个Connector还提供了一些配置属性,可以让用户对其进行自定义的设置,以满足特定的需求。例如,我们可以设置ClickHouse的集群节点和端口,以及一些其他的参数,来满足我们的需求。 总之,Flink Connector ClickHouse是一个非常有用的工具,可以让我们更加方便地将FlinkClickHouse结合起来,实现高效的数据处理和分析。它为企业提供了实时数据处理、分析和存储的完整解决方案,大大地提升了数据处理效率和准确性,是一款值得使用的工具。 ### 回答2: Flink Connector ClickHouse是Apache Flink的一种连接器,用于与ClickHouse分布式数据库进行交互。ClickHouse是一种以列为基础的分布式关系型数据库,具有高性能和可扩展性,并可用于快速的实时数据分析和处理。 Flink Connector ClickHouse可以通过简单的代码配置快速集成到Flink项目中,从而实现数据在FlinkClickHouse之间的高效传输和转换。使用该连接器,可以实现流式数据的实时入与查询操作,同时支持数据批处理,数据源和数据接收器等功能。 在使用Flink Connector ClickHouse时,需要注意ClickHouse的数据模型和表格结构,以及Flink的输入输出格式和数据类型转换。同时,还需关注连接器的性能和可靠性,以确保数据的准确和一致性。 总之,Flink Connector ClickHouse是一种强大、高效、可靠的连接器,可以帮助开发人员实现FlinkClickHouse之间的数据流转换和处理,从而加速实时数据分析和处理的速度、降低成本、提高效率。 ### 回答3: Flink是一个分布式实时流计算引擎,ClickHouse是一个开源列存储数据库。Flink Connector ClickHouseFlink提供的一个模块,用于将数据从Flink发送到ClickHouse中,实现数据在实时流处理过程中的存储和查询。 Flink Connector ClickHouse的优点包括: 1. 低延迟:Flink Connector ClickHouse能够实时处理流数据,并快速存储到ClickHouse中,从而实现低延迟的数据查询和分析。 2. 高性能:Flink Connector ClickHouse使用ClickHouse的列存储技术,能够高效地存储和查询大规模数据集,提高了数据处理的效率。 3. 可扩展性:Flink Connector ClickHouse支持集群部署,可以随时根据数据量的增长对集群进行扩展,提高了系统的可扩展性和稳定性。 4. 灵活性:Flink Connector ClickHouse提供多种数据源和格式的支持,可以将不同来源的数据统一处理,并转换为ClickHouse支持的数据格式。 总之,Flink Connector ClickHouseFlink生态系统中非常重要的一个组件,它帮助实现了实时流处理中数据的存储和查询,提高了数据处理的效率和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值