Flink Kafka Connector介绍和使用(DataStream and Table)

Flink Doris Connector实战:从DataStream到SQL的完整数据管道构建 本文详细介绍了如何使用Flink Doris Connector构建从DataStream到SQL的完整实时数据管道。通过实战案例展示了从Kafka读取数据、处理后写入Doris的全过程,包括环境配置、表设计、性能调优和SQL实现等关键步骤,帮助开发者高效实现低延迟、高吞吐的实时数据处理方案。 阅读详情

前言

Flink提供了一个Apache Kafka连接器,我们可以很方便的实现从Kafka主题读取数据和向其写入数据。

Flink附带了提供了多个Kafka连接器:universal通用版本,0.10,0.11

官方文档解释说universal(通用版本)的连接器,会尝试跟踪Kafka最新版本,兼容0.10或者之后的Kafka版本,官方文档也说对于绝大多数情况使用这个即可。在最新的官方文档上有这个通用版本连接器的迁移介绍:

Migrating Kafka Connector from 0.11 to universal

In order to perform the migration, see the upgrading jobs and Flink versions guide and:

  • Use Flink 1.9 or newer for the whole process.
  • Do not upgrade Flink and user operators at the same time.
  • Make sure that Kafka Consumer and/or Kafka Producer used in your job have assigned unique identifiers (uid):
  • Use stop with savepoint feature to take the savepoint (for example by using stop --withSavepoint)CLI command.

But:如果你使用的Kafka版本是0.11.x 或者0.10.x,官方建议使用专用版本的Kafka连接器。

Flink DataStream中的Kafka消费者

Kafka的消费者用来消费Kafka中Topic的数据,在Flink中FlinkKafkaConsumer提供了订阅一个Topic或者多个Topic,一下是FlinkKafkaConsumer011部分构造器源码:

public class FlinkKafkaConsumer011<T> extends FlinkKafkaConsumer010<T> {
    // ...省略
    // 订阅单个Topic
    public FlinkKafkaConsumer011(String topic, DeserializationSchema<T> valueDeserializer, Properties props) {
        this(Collections.singletonList(topic), valueDeserializer, props);
    }
    // 订阅多个Topic
    public FlinkKafkaConsumer011(List<String> topics, DeserializationSchema<T> deserializer, Properties props) {
        this(topics, new KafkaDeserializationSchemaWrapper<>(deserializer), props);
    // ...省略
}

可以看到,在连接器的构造器中,主要有3个参数,分别是:

  • String topic/List<String> topics: 订阅的Topic或者Topic的列表
  • DeserializationSchema<T> valueDeserializer(注意泛型):指定kafka反序列化的Schema
  • Properties props: 消费者的配置参数,其中必须的参数有:bootstrap.servers和group.id

举个栗子:

val properties = new Properties()
properties.setProperty("bootstrap.servers", "bigdata01:9092")
properties.setProperty("group.id", "flink-consumer-kafka-test")
stream = env.addSource(new FlinkKafkaConsumer[String]("flink-consumer-kafka-topic", new SimpleStringSchema(), properties))

在上面的例子中,要注意泛型的使用,从构造器源码上可以看出在类上边声明了泛型T,所以在创建Kafka消费者连接器的时候声明了FlinkKafkaConsumer的泛型为String,同时在构造器中传入SimpleStringSchema这个类的实例,为什么要这么做呢?大家结合在上面给出的构造器来看一下:

构造器中的第二个参数:DeserializationSchema<T> valueDeserializer中的泛型T会变成在创建构造器传入的String,然后大家继续看一下SimpleStringSchema的类源码:

public class SimpleStringSchema implements DeserializationSchema<String>, SerializationSchema<String> {
     // ...省略
}

是不是瞬间明白了?原因就是SimpleStringSchema继承了DeserializationSchema

DeserializationSchema的实现类Flink已经帮我们做了很多,常用的除了我们上面列出的SimpleStringSchema,还有关于TypeInformationSerializationSchema、JsonDeserializationSchema、AvroDeserializationSchema、CsvRowDeserializationSchema、CanalJsonDeserializationSchema的反序列化schema等等。

需要注意的是使用Avro的反序列化需要引入对应的依赖。

Flink DataStream中的Kafka消费者偏移量配置

val env = StreamExecutionEnvironment.getExecutionEnvironment()

val myConsumer = new FlinkKafkaConsumer[String](...)
myConsumer.setStartFromEarliest()      // start from the earliest record possible
myConsumer.setStartFromLatest()        // start from the latest record
myConsumer.setStartFromTimestamp(...)  // start from specified epoch timestamp (milliseconds)
myConsumer.setStartFromSpecificOffsets()  // the default behaviour

val stream = env.addSource(myConsumer)
...
  • setStartFromGroupOffsets()

    默认行为,默认读取上次保存的偏移量信息,如果是应用第一次启动,读取不到上次的偏移量信息,则会根据这个参数auto.偏移量.reset的值来进行消费数据

  • setStartFromEarliest()/setStartFromLatest()

    从最早/最新的数据开始进行消费,忽略存储的偏移量信息

  • setStartFromTimestamp(long startupOffsetsTimestamp)

    从topic中指定的时间点开始消费,指定时间戳(以毫秒为单位)之前的数据忽略

  • setStartFromSpecificOffsets(Map<KafkaTopicPartition, Long> specificStartupOffsets)

    从指定位置进行消费,需要注意的是如果Topic没有消费者指定的分区偏移量时,此配置会退化到setStartFromGroupOffsets()。eg:

    val offsets = new util.HashMap[KafkaTopicPartition, lang.Long]()
    offsets.put(new KafkaTopicPartition(topic, 0), 0L);
    offsets.put(new KafkaTopicPartition(topic, 1), 0L);
    myConsumer.setStartFromSpecificOffsets(offsets)
    

需要注意:当作业从故障中自动恢复或使用保存点手动恢复时,这些启动位置配置方法不会影响启动位置。在恢复时,每个Kafka分区的起始位置由存储在保存点或checkpoint中的偏移量决定

Flink DataStream中的Kafka消费者与容错

启用了Flink的checkpoint后,Flink Kafka消费者在消费来自topic的记录的同时,并定期检查其所有Kafka偏移量以及其他操作的状态。在作业失败的情况下,Flink将把流程序恢复到最新的checkpoint的状态,并从checkpoint中存储的偏移量开始,重新消费来自Kafka的记录。

如果禁用checkpoint,Kafka消费者将定期向Zookeeper提交偏移量。

Flink DataStream中Kafka消费者Topic和Partition Discovery

  • Partition Discovery

    在Flink Kafka中分区发现默认是禁用的,如需要可以配置flink.partition-discovery.interval-millis表示发现间隔(以毫秒为单位)。

  • Topic Discovery

    支持通过正则表达式来实现Topic发现

    val env = StreamExecutionEnvironment.getExecutionEnvironment()
    
    val properties = new Properties()
    properties.setProperty("bootstrap.servers", "bigdata01:9092")
    properties.setProperty("group.id", "flink-consumer-kafka")
    
    val myConsumer = new FlinkKafkaConsumer[String](
        java.util.regex.Pattern.compile("test-topic-[0-9]"),
        new SimpleStringSchema,
        properties)
    
    val stream = env.addSource(myConsumer)
    

    上面的例子仅仅是在启动时订阅了 0-9 Topic,如果程序动态的发现新创建的Topic,需要配置flink.partition-discovery.interval-millis表示发现间隔(以毫秒为单位)

Flink DataStream中Kafka消费者偏移量提交行为配置

Flink Kafka消费者允许配置如何将偏移量提交回Kafka Brokers的行为。

注意,Flink Kafka消费者并不依赖于提交的偏移量来保证容错。提交的偏移量只是为了监视目的而暴露消费者进度进度的一种手段。

Flink Kafka消费者的提交行为取决于在程序中是否配置了checkpoint

  • Checkpointing disabled

    如果禁用了ck,Flink Kafka消费者将自动的周期性的向Kafka提交偏移量,要禁用offse只需在提供的属性配置中将enable.auto.commit / auto.commit.interval.ms设置为适当的值。

  • Checkpointing enabled

    如果启动了ck,Flink Kafka消费者会在ck完成时,将偏移量保存在ck的状态中,这样做保证了Kafka Borkers中提交的偏移量与检查点状态中的偏移量一致。用户可以通过调用消费者的setCommitOffsetsOnCheckpoints(boolean)方法来选择禁用或启用偏移量提交(默认情况下,该行为为true)。注意,在这个场景消费者配置中的自动提交会被忽略。

Flink DataStream中的Kafka生产者

同上面的消费者一样,在Flink中,Kafka 生产者也提供了universal(通用版本)和0.10,0.11等版本

支持将数据写入一个或者多个Topic中,下面给出部分源码

public class FlinkKafkaProducer<IN> extends TwoPhaseCommitSinkFunction<IN, FlinkKafkaProducer.KafkaTransactionState, FlinkKafkaProducer.KafkaTransactionContext> {
    // 内部的一个语义枚举类
    public enum Semantic {
		// 精确一次,Flink生产者将在Kafka的事务中写入所有消息,这些消息将提交给检查点上的Kafka。
        EXACTLY_ONCE,
		// 至少一次,消息不会丢失,但可能会重复 (默认)
        AT_LEAST_ONCE,
		// 没有语义,意味着消息可能会对视或者重复
        NONE;
        private Semantic() {}
    }
    
    // ...省略
    public FlinkKafkaProducer(
        String topicId,
        KeyedSerializationSchema<IN> serializationSchema,
        Properties producerConfig,
        Semantic semantic) {
        this(topicId,
             serializationSchema,
             producerConfig,
             Optional.of(new FlinkFixedPartitioner<IN>()),
             semantic,
             DEFAULT_KAFKA_PRODUCERS_POOL_SIZE);
    }
    // ...省略
}

由上面代码可知,创建一个Kafka生产者需要必须的4个参数

  • String topicId

    生产者发送的主题

  • KeyedSerializationSchema<IN> serializationSchema

    序列化schema,使用KafkaSerializationSchema可以配置header,定义每一条数据的key或者指定数据的自定义分区

  • Properties producerConfig

    生产者配置信息,其中必须的参数有:bootstrap.servers

  • Semantic semantic

    容错语义,源码体现在一个内部枚举类,默认是至少一次

需要注意的时,在构造器中还有一个参数指定池中kafkaproducer的数量,默认是5个

/**
* Default number of KafkaProducers in the pool. See {@link Semantic#EXACTLY_ONCE}.
*/
public static final int DEFAULT_KAFKA_PRODUCERS_POOL_SIZE = 5;

Semantic.EXACTLY_ONCE 语义为每个 FlinkKafkaProducer011 实例使用固定大小的KafkaProducers池。每个检查点使用其中一个生产者。如果并发检查点的数量超过池大小, FlinkKafkaProducer011 将引发异常并将使整个应用程序失败。请相应地配置最大池大小和最大并发检查点数。

Flink DataStream中的Kafka生产者的容错

因为在启用了Flink的检查点后,FlinkKafkaProducer和FlinkKafkaProducer011通过二阶段提交(2PC,以后专门开一个帖子总结)可以提供精确一次的保证,以下内容围绕0.11版本来讲。

除了使用Flink的检查点机制外,我们也可以在创建Kafka生产者的时候使用内部的容错语义(默认是至少一次)

这里需要注意的一个问题是Semantic.EXACTLY_ONCE模式依赖于提交在接受检查点之前启动的事务,以及在从上述检查点恢复之后启动的事务。如果Flink应用程序崩溃和完成重启之间的时间大于Kafka的事务超时(transaction.timeout.ms),那么就会出现数据丢失(Kafka会自动中止超过超时的事务)。所以在配置时需要考虑事务超时不要小于崩溃和完成重启之间的时间。

这里列出源码中对Kafka事务超时的配置信息:

ProducerConfig.class

public static final String TRANSACTION_TIMEOUT_CONFIG = "transaction.timeout.ms";
public static final String TRANSACTION_TIMEOUT_DOC = "The maximum amount of time in ms that the transaction coordinator will wait for a transaction status update from the producer before proactively aborting the ongoing transaction." +
    "If this value is larger than the max.transaction.timeout.ms setting in the broker, the request will fail with a `InvalidTransactionTimeout` error.";

如何在代码中使用呢?举个栗子:

// 二阶段提交事务 保证端到端一致性
val outprop: Properties = new Properties()
outprop.setProperty("bootstrap.servers", "hadoop01:9092")
//设置事务超时时间,这里设置了15分钟的超时时间
outprop.setProperty("transaction.timeout.ms", 60000 * 15 + "")

val kafkaProducer = new FlinkKafkaProducer011[String](
    "outputTopic",
    new KeyedSerializationSchemaWrapper[String](new SimpleStringSchema),
    outprop,Semantic.EXACTLY_ONCE)

dataStream.addSink(kafkaProducer)

这里要说明的事,在Kafka Brokers中默认的transaction.max.timeout.ms是15分钟,此属性不允许小于生产者设置的事务超时。FlinkKafkaProducer011 默认的 transaction.timeout.ms为1个小时:

FlinkKafkaProducer011.class

/**
* Default value for kafka transaction timeout.
*/
public static final Time DEFAULT_KAFKA_TRANSACTION_TIMEOUT = Time.hours(1);

所以如果在Semantic.EXACTLY_ONCE模式下,需要调大transaction.max.timeout.ms

Flink DataStream中的Kafka生产者写入EventTime

FlinkKafkaProducer011.class

/**
* If set to true, Flink will write the (event time) timestamp attached to each record into Kafka.
* Timestamps must be positive for Kafka to accept them.
*
* @param writeTimestampToKafka Flag indicating if Flink's internal timestamps are written to Kafka.
*/
public void setWriteTimestampToKafka(boolean writeTimestampToKafka) {
    this.writeTimestampToKafka = writeTimestampToKafka;
}

public void invoke(KafkaTransactionState transaction, IN next, Context context) throws FlinkKafka011Exception {
    checkErroneous();

    byte[] serializedKey = schema.serializeKey(next);
    byte[] serializedValue = schema.serializeValue(next);
    String targetTopic = schema.getTargetTopic(next);
    if (targetTopic == null) {
        targetTopic = defaultTopicId;
    }

    Long timestamp = null;
    if (this.writeTimestampToKafka) {
        // 获取时间戳
        timestamp = context.timestamp();
    }

    ProducerRecord<byte[], byte[]> record;
    int[] partitions = topicPartitionsMap.get(targetTopic);
    if (null == partitions) {
        partitions = getPartitionsByTopic(targetTopic, transaction.producer);
        topicPartitionsMap.put(targetTopic, partitions);
    }
    if (flinkKafkaPartitioner != null) {
        record = new ProducerRecord<>(
            targetTopic,
            flinkKafkaPartitioner.partition(next, serializedKey, serializedValue, targetTopic, partitions),
            timestamp,
            serializedKey,
            serializedValue);
    } else {
        record = new ProducerRecord<>(targetTopic, null, timestamp, serializedKey, serializedValue);
    }
    pendingRecords.incrementAndGet();
    transaction.producer.send(record, callback);
}

Flink Table中使用Kafka连接器

使用SQL的DDL方式创建
CREATE TABLE kafkaTable (
    user_id BIGINT,
    item_id BIGINT,
    category_id BIGINT,
    behavior STRING,
    ts TIMESTAMP(3)
) WITH (
    'connector' = 'kafka',
    'topic' = 'user_behavior',
    'properties.bootstrap.servers' = 'localhost:9092',
    'properties.group.id' = 'testGroup',
    'format' = 'csv',
    'scan.startup.mode' = 'earliest-offset'
)

参数说明:

OptionRequiredDescription
connectorrequired指定要连接的Kafka版本,可选项有: 'kafka', 'kafka-0.11', 'kafka-0.10'.
topicrequired订阅的Topic
properties.bootstrap.serversrequiredKafka Brokers(逗号分隔)
properties.group.idrequired by sourcegroup
formatrequired用于反序列化和序列化Kafka消息的格式。可选项有 'csv', 'json', 'avro', 'debezium-json' and 'canal-json'. 更多格式请点击 Formats
scan.startup.modeoptional设置Kafka偏移量,默认为group-offsets,可选项有 'earliest-offset', 'latest-offset', 'group-offsets', 'timestamp'and 'specific-offsets'更多细节请点击Start Reading Position
scan.startup.specific-offsetsoptional在 'specific-offsets'的模式下指定partition的offset eg:'partition:0,offset:42;partition:1,offset:300'.
scan.startup.timestamp-millisoptional在timestamp启动模式下,从指定的epoch时间戳(毫秒)开始。
sink.partitioneroptional指定 Kafka Sink时候的分区,可选项有round-robin,也可以继承FlinkKafkaPartitioner 并实现自己分区逻辑: e.g: 'org.mycompany.MyPartitioner'.

这里要提一句:

配置选项sink.partitioner可以在当Flink的分区到Kafka的分区时指定输出分区。默认情况下,Kafka Sink最多写入与其自身并行性相同的分区(每个接收器的并行实例只写入一个分区)。为了将写操作分发到更多的分区或控制行在分区中的路由,可以提供自定义接收器分区器。需要注意的是,该配置的可选项round-robin对于避免不平衡分区非常有用。但是,它将导致所有Flink实例和所有Kafka代理之间的大量网络连接。

使用Table Api方式创建
tableEnv.connect(new Kafka()
                 .version("0.11")
                 .topic("user_behavior")
                 .property("zookeeper.connect", "bigdata01:2181")
                 .property("bootstrap.servers", "bigdata01:9092")
                 .startFromLatest()
                )
.withFormat(new Json())
.withSchema(
    new Schema()
    .field("user_id", DataTypes.BIGINT())
    .field("item_id", DataTypes.BIGINT())
    .field("category_id", DataTypes.BIGINT())
    .field("behavior", DataTypes.BIGINT())
    .field("ts", DataTypes.DataTypes.TIMESTAMP(3))
).createTemporaryTable("kafkaTable")

End

Flink Kafka Connector 实现机制简析 说完了 preCommit 和 commit,在两次 Checkpoint 发生的间隔当中,会持续的执行 invoke 方法将数据的写到 Kafka,直到 snapshotState 方法被调用,旧的数据被进行预提交,同时生成新的事务,数据继续写入,直到所有任务Checkpoint完成,收到通知,对完成的checkpointId把事务进行正式的提交。通常,二阶段提交也被称为是一种协议(Protocol))。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。 阅读详情

相关推荐

【Flink】Flink 1.14.0 全新的 Kafka Connector

Flink 提供了一个 Apache Kafka 连接器,用于从 Kafka Topic 读取数据和向 Kafka Topic 写入数据,并保证恰好一次次语义。

九师兄 4956

Flink Kafka connector详解

在Flink中提供了特殊的Connectors从kafka中读写数据,它基于Kafka Consumer API以及Producer API封装了自己的一套API来连接kafka,即可读取kafka中的数据流,也可以对接数据流到kafka中,基于kafka的partition机制,实现了并行化数据切片。下面让我们来看看它的主要API以及使用。 Flink kafka consumer 使用kafk...

不清不慎的博客 4972

Flink原理与实战(java版)#第8章 Flink的 Connectors(第二节Table API & SQL连接器之Kafka(三)及第三节本章小结)

第二节介绍了Table API & SQL 的Connector外部连接器支持情况、支持的数据格式以及外部连接器kafka内容。详细地讲解了如何在Flink SQL Client创建Kafka表、有哪些元数据可以使用、连接器有哪些参数可以设置,当然更深入的介绍了kafka作为Flink Table API & SQL 的外部连接器有哪些特性等内容。在介绍的同时,便于读者进行理解和应用,文章内辅以大量可直接运行的示例。但针对常用的数据格式(csv、json、parquet和orc等)则没有介绍,同时针对外部连

alanchanchn的专栏 9110

Flink之Kafka Connector

在Kafka Connector连接器中提供Source数据源和Sink接收器类,在。

别这么骄傲 1974

Jev模型入门:从API接入到本地部署的完整实践指南

大模型的应用方式正从单一聊天窗口转向复杂的自动化工作流,而推理模型因具备指令跟随与结构化输出能力,成为构建Agent和数据处理管线的关键组件。Jev作为面向通用场景的推理模型,不仅提供了OpenAI兼容的API接口,还支持本地量化部署,兼顾隐私、可控性与长期成本。本文从模型定位出发,明确Jev与基座模型的差异,随后介绍密钥管理、API调用、参数调优,并深入演示基于Ollama与llama.cpp的本地部署流程,包括GGUF模型文件与chat template的匹配要点。针对实践中的常见问题,如密钥泄露、ma

weixin_29057237的博客 359

保姆级教程:在RK3588平台上为IMX415 Sensor配置HDR2曝光(附完整代码与避坑点)

本文提供RK3588平台上为IMX415 Sensor配置HDR2曝光的详细教程,涵盖基础概念、限制条件、实战配置步骤及常见问题解决方案。通过完整代码示例和关键参数解析,帮助开发者高效实现HDR2曝光模式,提升图像质量并避开常见陷阱。

weixin_28685287的博客 284

Flink 系例 之 Connectors 连接 Kafka

通过使用 Flink DataStream Connectors 数据流连接器连接到 ElasticSearch 搜索引擎的文档数据库 Index,并提供数据流输入与输出操作;

不会飞的小龙人的博客 1509

《科研伦理与学术规范》 全部 习题_答案 2020年秋

科研伦理与学术规范 答案 文章目录科研伦理与学术规范 答案1. 第一章课后习题(必做) 答案1.1 第一章Demo2. 第二章课后习题(必做) 答案3. 第三章课后习题(必做) 答案4. 第四章课后习题(必做) 答案5. 第五章课后习题(必做) 答案6. 第六章课后习题(必做) 答案 # 每行5题 #写于2020.11.17 侵删 1. 第一章课后习题(必做) 答案 ABC, A, B ,D ,ABCD ABC, D, A, BCD, C D, D, 1.1 第一章Demo

羊老羊 25万+

Flink-1.12 - 之Flink SQL 与 kafka connector实践

Flink-1.12 - 之kafka connector实践 1 前言(消息更新模式) 阅读之前可以先了解一下,动态table抓换成data stream的3种模式,这个在动态Table转换成DataStream或者写入外部系统的时候是有严格的约束的。 Append Mode 一个只有Insert操作的动态表,才能转换成Append-only stream(或写入到支持AppendMode的外部系统如:文件、Kafka、Hive等) Retract Mode 这种模式有2种类型的消息:add 和

shufangreal的博客 7966

WebDriverAgent 菜鸟解析篇

WebDriverAgent 是一个用于模拟移动设备浏览器的 Python 库,可以用来在 PC 上模拟移动设备的浏览器操作,从而进行自动化测试。下面是一个菜鸟对 WebDriverAgent 源码的解析篇,希望能对初学者有所帮助。

DJ355的博客 1222

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5569

Flink 高分笔记

这篇博客文章总结了Flink流计算相关的基础知识和实践指南。主要内容包括:1) 流计算基础概念,如事件时间、Watermark机制、Exactly-once语义;2) Flink基础操作,如安装部署、程序结构、并发设置、故障恢复;3) DataStream API核心功能,包括时间概念、窗口计算、状态管理、双流Join等;4) Table API与SQL的使用方法和工作原理。文章提供了丰富的技术文档链接,涵盖了Flink从入门到进阶的各个方面,既有理论讲解也有实践案例,是一个系统的Flink学习资源合集。

SmartSi 1710

Vue - 解决报错 Error: Cannot find module ‘XXX\@vue\cli-service\bin\vue-cli-service.js‘(vue项目编译运行出错,启动失败)

vue报错,Error: Cannot find module ‘@vue\cli-service\bin\vue-cli-service.js‘,vue2项目启动报错,vue3项目运行出错,vue执行npm run serve报错,找不到@vue/cli-service模块,vue项目关于:Error: Cannot find module ‘D:\@vue\cli-service\bin\vue-cli-service.js‘的解决方案,vue项目跑不起来了,Vue项目报错,跑项目报错Cannot fi

🏆 前端领域优质创作者 3115

重要|Flink SQL与kafka整合的那些事儿

flink与kafka整合是很常见的一种实时处理场景,尤其是kafka 0.11版本以后生产者支持了事务,使得flink与kafka整合能实现完整的端到端的仅一次处理,虽...

大数据星球-浪尖 3634

Vue3 - 超详细最新 wangEditor V5 富文本编辑器安装引入及使用教程,提供工具栏配置、基础富文本功能、API使用示例教程等(新手小白快速引入并植入到项目中)

vue3,wangEditorv5富文本编辑器,wangEditorv5官方文档,vue3最新安装wangEditorv5富文本详细使用教程,vue3使用wangEditorv5编辑器示例代码,vue3网站网页安装植入富文本编辑器教程,vue3wangEditor使用api,vue3安装富文本控制台出现报错如何解决,vue3wangEditor-v5工具栏配置,vue3中使用富文本编译器wangEditor5的方法,wangeditor5在vue3中的全使用过程,vue3超详细最新wangedi

🏆 前端领域优质创作者 4253

ThingsBoard3.9.1规则引擎方式发送钉钉通知消息

thingsboard3.9.1/4.0规则链方式发送钉钉通知消息。

hssjf的专栏 531

[flink]#22_Table API & SQL与DataStream,DataSet

将 DataStream 或 DataSet 注册为 Table StreamTableEnvironment tableEnv = ...; DataStream<Tuple2<Long, String>> stream = ... //将 DataStream 注册为 myTable 表 tableEnv.registerDataStream("myTable",...

PigCircle 223

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Flink第五章:DataStream API

本文系统介绍了Apache Flink DataStream API的基础知识,包括执行环境配置、源算子读取、转换算子使用以及程序触发执行等核心内容。重点讲解了流式和批处理两种执行模式的选择,以及map、filter等基本转换算子的使用方法。通过匿名内部类、lambda表达式等多种实现方式,帮助开发者快速掌握Flink流处理程序的构建方法,为大数据实时处理提供实用指南。

Justicer_Young的博客 682

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Flink Doris Connector实战:从DataStream到SQL的完整数据流处理

本文详细介绍了Flink Doris Connector的实战应用,指导开发者如何构建从DataStream到SQL的完整实时数据流处理管道。文章深入讲解了环境配置、核心概念、DataStream API的读写操作以及Flink SQL的声明式开发,并提供了生产环境下的性能调优与避坑指南,帮助实现Flink与Doris的高效、稳定集成。

weixin_29048775的博客 112

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

60、Flink CDC 入门介绍及Streaming ELT示例(同步Mysql数据库数据到Elasticsearch)-CDC Connector介绍及示例 (1)

本文介绍的CDC是基于2.4版本,当前版本已经发布至3.0,本Flink 专栏介绍是基于Flink 1.17版本,CDC 2.4版本支持到1.17版本。Apache Flink®的CDC连接器是用于Apache Flnk®的一组源连接器,使用更改数据捕获(CDC)接收来自不同数据库的更改。Apache Flink®的CDC连接器将Debezium集成为捕获数据更改的引擎。因此,它可以充分利用Debezium的能力。了解更多关于Debezium的信息。

alanchanchn的专栏 7万+

07-Flink Table API & SQL1(仅供学习)

收购以后,将Blink中Table API和SQL融合到Apache Flink,直到1.12版本,功能基本完全,可生产环境使用,支持流计算和批处理。:可以基于一个DataStream,[先流式地读取数据源,然后map转换为POJO,再把它转成Table]。在Flink 1.9版本中,Blink中Table 模块合并到ApacheFlink中,架构进行全新调整。读取文本数据为DataStream,数据提取解析后,转换为Table,注册临时视图,使用SQL查询。

weixin_44204449的博客 1315

(五)flink的Table API 与 SQL-更新模式与kafka连接器案例

文章目录更新模式应用实例 更新模式 对于stream类型的Table数据,需要标记是由于INSERT,UPDATE,DELETE中哪种操作更新的数据,在Table API中通过Update Modes指定数据更新类型,通过指定不同的Update Modes确定哪种更新操作的数据与外部系统进行交互 .connect(...) .inAppendMode() //交互INSERT操作更新数据 .in...

张不帅 2736

Flink之Table API与SQL(二)

目录(1)创建表的两种方式(2)DataStream、DataSet与Table的转换(2.1)通过 DataSet 或 DataStream 创建视图(2.2)将 DataStream 或 DataSet 转换成表(2.3)将表转换成 DataStream 或 DataSet(2.3.1)将表转换成 DataStream(2.3.2)将表转换成 DataSet(3)数据类型与Table Schema映射(3.1)原子类型(3.2)Tuple类型(3.3)POJO 类型(3.4)Row类型 (1)创建表的两

蔡政洁的博客 884

Flink1.16整合Kafka

对于大多数流数据处理应用程序而言,能够使用处理实时数据的代码重新处理历史数据并产生确定并一致的结果非常有价值。在处理流式数据时,我们通常更需要关注事件本身发生的顺序而不是事件被传输以及处理的顺序,因为这能够帮助我们推理出一组事件(事件集合)是何时发生以及结束的。例如电子商务交易或金融交易中涉及到的事件集合。为了满足上述这类的实时流处理场景,我们通常会使用记录在数据流中的事件时间的时间戳,而不是处理数据的机器时钟的时间戳。

1299

flink笔记12 [Table API和SQL] 创建表环境、创建表

1.创建表环境 创建表环境,需要将flink流处理的执行环境传入 val tableEnv = StreamTableEnvironment.create(env) // 最简单的创建表环境 TableEnvironment是flink中集成Table API和SQL的核心概念,所有对于表的操作都基于TableEnvironment 其他创建方法: // 基于老版本planner的流处理 val settings = EnvironmentSettings....

weixin_43631997的博客 4146

18.flink kafka使用thrift序列化

最近kafka中有一批被thrift序列化的java对象数据,我用flink去消费。本来百度找了找发现没有这样的demo,无奈只能去翻官网了,经过三四个小时才跑通,这里记录下详细代码,方便后来人。

笔生花的博客 779
上一篇: java之并发包中的原子类
下一篇: SQL优化之使用数学的方式优化SQL编码01
俩只猴
博客等级 码龄12年 11粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值