flink⼿手动维护kafka偏移量量
flink对接kafka,官方模式方式是自动维护偏移量

2:数据可能重复处理理
flink从kafka拉去数据过程中,如果此时flink进程挂掉,那么重启flink之后,会从当前Topic的 起始偏移量量开始消费
解决flink消费kafka的弊端
上述问题,在任何公司的实际⽣生产中,都会遇到,并且⽐比较头痛的事情,主要原因是因为上述的代码 是使⽤用flink⾃自动维护kafka的偏移量量,导致⼀一些实际⽣生产问题出现。~那么为了了解决这些问题,我们就 需要⼿手动维护kafka的偏移量量,并且保证kafka的偏移量量和flink的checkpoint的数据状态保持⼀一致 (最好是⼿手动维护偏移量量的同时,和现有业务做成事务放在⼀一起)~
1):offset和checkpoint绑定
//创建kafka数据流
val properties = new Properties() properties.setProperty("bootstrap.servers", GlobalConfigUtils.getBootstrap) properties.setProperty("zookeeper.connect", GlobalConfigUtils.getZk) properties.setProperty("group.id", GlobalConfigUtils.getConsumerGroup) properties.setProperty("enable.auto.commit" , "true")//TODO properties.setProperty("auto.commit.interval.ms" , "5000") properties.setProperty("auto.offset.reset" , "latest") properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
val kafka09 = new FlinkKafkaConsumer09[String](
GlobalConfigUtils.getIntputTopic,
new SimpleStringSchema(),
properties
)
/** *
如果checkpoint启⽤用,当checkpoint完成之后,Flink Kafka Consumer将会提交offset保存 到checkpoint State中,
这就保证了了kafka broker中的committed offset与 checkpoint stata中的offset相⼀一致。 ⽤用户可以在Consumer中调⽤用setCommitOffsetsOnCheckpoints(boolean) ⽅方法来选择启⽤用 或者禁⽤用offset committing(默认情况下是启⽤用的)
* */
kafka09.setCommitOffsetsOnCheckpoints(true)
kafka09.setStartFromLatest()//start from the latest record
kafka09.setStartFromGroupOffsets()
//添加数据源addSource(kafka09)
val data: DataStream[String] = env.addSource(kafka09)
2):编写flink⼿手动维护kafka偏移量量
/**
* ⼿手动维护kafka的偏移量量 */
object KafkaTools {
var offsetClient: KafkaConsumer[Array[Byte], Array[Byte]] = null
var standardProps:Properties = null
def init():Properties = {
standardProps = new Properties
standardProps.setProperty("bootstrap.servers",
GlobalConfigUtils.getBootstrap)
standardProps.setProperty("zookeeper.connect", GlobalConfigUtils.getZk)
standardProps.setProperty("group.id",
GlobalConfigUtils.getConsumerGroup)
standardProps.setProperty("enable.auto.commit" , "true")//TODO
standardProps.setProperty("auto.commit.interval.ms" , "")
standardProps.setProperty("auto.offset.reset" , "latest")
standardProps.put("key.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
standardProps.put("value.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
standardProps
}
def getZkUtils():ZkUtils = {
val zkClient = new ZkClient("hadoop01:2181")
ZkUtils.apply(zkClient, false)
}
def createTestTopic(topic: String, numberOfPartitions: Int,
replicationFactor: Int, topicConfig: Properties) = {
val zkUtils = getZkUtils()
try{
AdminUtils.createTopic(zkUtils, topic, numberOfPartitions,
replicationFactor, topicConfig)
}finally {
zkUtils.close()
} }
def offsetHandler() = {
val props = new Properties
props.putAll(standardProps)
props.setProperty("key.deserializer",
"org.apache.kafka.common.serialization.ByteArrayDeserializer") props.setProperty("value.deserializer",
"org.apache.kafka.common.serialization.ByteArrayDeserializer")
offsetClient = new KafkaConsumer[Array[Byte], Array[Byte]](props)
}
def getCommittedOffset(topicName: String, partition: Int): Long = {
init()
offsetHandler()
val committed = offsetClient.committed(new TopicPartition(topicName,
partition))
println(topicName , partition , committed.offset())
if (committed != null){
committed.offset
} else{
0L
} }
def setCommittedOffset(topicName: String, partition: Int, offset: Long) {
init()
offsetHandler()
var partitionAndOffset:util.Map[TopicPartition , OffsetAndMetadata] =
new util.HashMap[TopicPartition , OffsetAndMetadata]()
partitionAndOffset.put(new TopicPartition(topicName, partition), new
OffsetAndMetadata(offset))
offsetClient.commitSync(partitionAndOffset)
}
def close() {
offsetClient.close()
}
}
flink⼿手动维护kafka偏移量量的更多相关文章
- spark streaming中维护kafka偏移量到外部介质
spark streaming中维护kafka偏移量到外部介质 以kafka偏移量维护到redis为例. redis存储格式 使用的数据结构为string,其中key为topic:partition, ...
- SparkStreaming消费Kafka,手动维护Offset到Mysql
目录 说明 整体逻辑 offset建表语句 代码实现 说明 当前处理只实现手动维护offset到mysql,只能保证数据不丢失,可能会重复 要想实现精准一次性,还需要将数据提交和offset提交维护在 ...
- spark streaming读取kakfka数据手动维护offset
在spark streaming读取kafka的数据中,spark streaming提供了两个接口读取kafka中的数据,分别是KafkaUtils.createDstream,KafkaUtils ...
- Flink SQL结合Kafka、Elasticsearch、Kibana实时分析电商用户行为
body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...
- flink引出的kafka不同版本的兼容性
参考: 官网协议介绍:http://kafka.apache.org/protocol.html#The_Messages_Fetch kafka协议兼容性 http://www.cnblogs.c ...
- 构建一个flink程序,从kafka读取然后写入MYSQL
最近flink已经变得比较流行了,所以大家要了解flink并且使用flink.现在最流行的实时计算应该就是flink了,它具有了流计算和批处理功能.它可以处理有界数据和无界数据,也就是可以处理永远生产 ...
- kafka之五:如何手动更新Kafka中某个Topic的偏移量
本文介绍如何手动跟新zookeeper中的偏移量.我们在使用kafka的过程中,有时候需要通过修改偏移量来进行重新消费.我们都知道offsets是记录在zookeeper中的,所以我们想修改offse ...
- 使用Flink时从Kafka中读取Array[Byte]类型的Schema
使用Flink时,如果从Kafka中读取输入流,默认提供的是String类型的Schema: val myConsumer = new FlinkKafkaConsumer08[String](&qu ...
- An Overview of End-to-End Exactly-Once Processing in Apache Flink (with Apache Kafka, too!)
01 Mar 2018 Piotr Nowojski (@PiotrNowojski) & Mike Winters (@wints) This post is an adaptation o ...
随机推荐
- 如何实现一个简化版的 jQuery
对于操作 DOM 来说,jQuery 是非常方便的一个库,虽然如今随着 React, Vue 之类框架的流行,jQuery 用得越来越少了,但是其中很多思想还是非常值得我们学习的,这篇文章将介绍如何从 ...
- 什么是 Serverless 应用引擎?优势有哪些?
Serverless 应用引擎(Serverless App Engine,简称 SAE)是面向应用的 Serverless PaaS 平台,能够帮助 PaaS 层用户免运维 IaaS,按需使用,按量 ...
- Global.asax文件
转载:http://www.cnblogs.com/I-am-Betty/archive/2010/09/06/1819558.html 概述: Global.asax文件也叫做asp.net应用程序 ...
- Java中“==”与equals的区别以及equals方法的重写
一.“==”与equals的区别: (1)==代表比较双方是否相同: 基本数据类型表示值相等. 引用数据类型表示地址相等,即同一个对象. (2)Object中的equals()方法:是否为同一个对象的 ...
- 改变font-weight的数值,样式并不会改变的原因
通常情况下,一个特定的字体仅会包含少数的可用字重.若所指定的字重不存在直接匹配,则会通过字体匹配算法规则匹配使用邻近的可用字重.这也就是为什么我们有时候使用特定字重时没有“生效”,看起来跟其它字重差不 ...
- Delphi Opendialog组件
- python、第二篇:库相关操作
一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...
- Linux fing cd 查找文件/文件夹并进入目录命令
查找文件|文件夹并进入目录命令:cd $() [root@localhost /]# cd $(dirname "`find / -name 'ifcfg-ens33'`") // ...
- vmware虚拟机安装centos7.3
vmware准备 CentOS准备,这里下载的是CentOS 7.3CentOS-7-x86_64-Everything-1611.iso 创建新的虚拟机 选择自定义安装 硬件兼容性默认最新的,不用动 ...
- 11条sql技巧
1. 负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好习惯 可以优化为in查询: ...