一貫性を確保するためのFLINK +カフカ終了状態
状態の一貫性とは何ですか
- 各タスク内のステートフルフロー処理、オペレータは、自身の状態を有しています
- 実際には内部のストリームプロセッサ、一貫性のいわゆる状態については、私たちは正確性を確保するために、結果を呼び出します
- データの損失は変化しません、またカウントを倍にすべきです
- 状態を復元することができる障害が発生した場合に、回復が後、結果は完全に正しい再計算しました
FLINK内部状態の一貫性の分類
- LEAST-ONCE-AT(少なくとも1回)
本当にほとんどのシナリオでは、我々は失う時間にではない願っています。セキュリティ手段のこのタイプは、すべてのデータを処理できること、およびいくつかの時間は、複数回処理されてもよいです
- ONCE-MOST-AT(複数回)
タスクが失敗した場合、最も簡単な方法は、何もしない、どちらも失われた状態を回復しないで、複数回失われたデータ、データの意味処理を再生しません
- ** EXACTLY-ONCE(**正確な時間)
正確に処理が最も厳格なセマンティクスですが、また、達成するのが最も難しい、ちょうどまた、何のイベントが失われないという意味セマンティックに対処されていない手段に一度の更新データのみを各内部状態のため、一度その
セマンティクスを正確にワンス、実際にはストリームの状態の整合性チェック・ポイント・アプリケーション、あることを確認するためのチェックポイントによってFLINKの一貫性チェックポイント:ある時点でのスナップショット内のすべてのタスクのステータス、この時間は、それがあるべきすべてのタスクは、1つのと同じ入力データを処理しているとき。アプリケーションの状態の一貫性チェック何かFLINK心不全の回復メカニズム。
エンドツーエンドツーエンドの整合状態
ソースから - >プロセス - >データの一貫性のプロセス全体がそれを保証するために、どのようにして、保証されるべきシンク?
データを失うことなく消費データを繰り返しません。
1.sourceオフセットデータを提供することができる読み取ります
カフカの手のようなオフセット提出から
2.process
チェックポイント機構一貫して、チェックポイント
3.sinkエンドからの回復は、外部システムのデータを繰り返し書かれていない場合
冪等の書き込み(冪等の書き込み)
:いわゆる冪等の操作は、操作を何度も繰り返しますが、唯一の繰り返しバックがない仕事、例えば、同じハッシュマップを複数回挿入するようになると言うことです結果の変化、(K-につながることができるということです> V)
物事は書か
:ACID [原子性、一貫性、分離性、耐久性]
外部システムへのチェックポイントの完全な本当の結果までだけにして建設物事のチェックポイントの操作に対応し、対応するシンクのすべてを
実装:
1.WAL先行書き込みログ:GenrticWriteAheadSink DataStreamAPIのは、物事にシンクを達成するために
2.2フェーズコミット2PCを(2フェーズコミット)
:各チェックポイントについて、シンクタスクが事を起動し、トランザクションで受信したすべてのデータを追加します
これらのデータは、単に事前に提出、その後、その後、外部シンクシステムに書き込まれますが、それらをコミットしません。
それは正式に、提出されたチェックポイントの完了の通知を受信すると、実際に書き込まれた結果の達成。
真にexctlyワンスこのように、支持物事を提供するために、外部シンクシステムが必要です。FLINKは提供TwoPhaseCommitSinkFunction APIインタフェースを
シンク、ソース | 非リセット消費源 | リセットソース |
---|---|---|
どれ(任意) | で最大1回 | 少なくとも一度は |
冪等 | で最大1回 | 正確にワンス |
先行書き込みログ(WAL) | で最大1回 | 少なくとも一度は |
2フェーズ・コミット(2PC) | で最大1回 | 正確にワンス |
一貫性を達成するためにFLINK +カフカ終了状態
ならびに0.8の以前のバージョンのカフカのように、カフカZKだけオフセットストレージにはデフォルトでは、
0.9から0.10のカフカのバージョンは、だけ確保すること、次のような構成を介したデータの意味で、少なくともワンス
出了要开启flink的checkpoint功能,同时还要设置相关配置功能。
因在0.9或者0.10,默认的FlinkKafkaProducer只能保证at-least-once语义,假如需要满足at-least-once语义,我们还需要设置
setLogFailuresOnly(boolean) 默认false
setFlushOnCheckpoint(boolean) 默认true
カフカの0.11以降のバージョンでは、FLINKも正確にワンスセマンティクスでサポート
1.内部には、状態を保存するためのチェックポイントメカニズムを介して、あなたは内部整合性FLINKを確保するために、障害が発生した場合に復元することができます
env.enableCheckpointing(60000)
2.sourceは、後続のダウンタスクが失敗した場合、KafkaConsumerはソースとして、保存することができますオフセット、回復時間は一貫性を確保するために、コネクタ、再消費データのオフセットによってリセットすることができます(自動)
//自定义kafkaConsumer,同时可以指定从哪里开始消费
//开启了Flink的检查点之后,我们还要开启kafka-offset的检查点,通过kafkaConsumer.setCommitOffsetsOnCheckpoints(true)开启,
//一旦这个检查点开启,那么之前配置的 auto.commit.enable = true的配置就会自动失效
kafkaConsumer.setCommitOffsetsOnCheckpoints(true)
3.sink FlinkkafkaProducerシンクとしては、使用した2フェーズ・コミットシンクを、我々は、実装する必要がTwoPhaseCommitSinkFunctionを
// 本身就继承了TwoPhaseCommitSinkFunction,但是我们需要在参数里面传入指定语义,默认时AT-LEAST-ONCE
public class FlinkKafkaProducer<IN>
extends TwoPhaseCommitSinkFunction<IN, FlinkKafkaProducer.KafkaTransactionState, FlinkKafkaProducer.KafkaTransactionContext> {
また、いくつかのプロデューサーのフォールトトレラントの設定が必要です。
-
FLINKの外側をチェックポイント可能にすることに加えて、また、適切であることができるセマンティック FlinkKafkaProducer011(カフカ> = 1.0.0バージョンFlinkKafkaProducer)に渡されるパラメータ
選択するには、三つの異なる動作モードを:
-
Semantic.NONEで-ほとんどワンスセマンティクスの代わりに
-
Semantic.AT_LEAST_ONCE(FLINKデフォルト設定)
-
Semantic.EXACTLY_ONCE使用カフカのトランザクションは、あなたがトランザクションの書き込みがカフカを使用するたびに正確な意味を、提供します
* <li>decrease number of max concurrent checkpoints</li> * <li>make checkpoints more reliable (so that they complete faster)</li> * <li>increase the delay between checkpoints</li> * <li>increase the size of {@link FlinkKafkaInternalProducer}s pool</li>
カフカのレコードを使用して任意のアプリケーションのために必要な設定を設定することを忘れないでください:isolation.level(デフォルトでREAD_COMMITTEDまたはread_uncommitted-)
注意事項
下流システムに依存1.Semantic.EXACTLY_ONCEは、トランザクション操作をサポートすることができる。0.11バージョンに、例えば
transaction.max.timeout.ms
スーパーマーケットの最大期間、デフォルトでは15分、この値を増やすために、正確に意味論、必要性を使用する必要がある場合。
isolation.level
それらが正確に必要とされている場合はセマンティクスが低くconsumerConfig設定する必要が読み取りCOMMITED、[読み取りコミットされていない(デフォルト)]どのようなネットワークの特定のを教えてください
transaction.timeout.ms
デフォルトの1時間
注:固定サイズの各インスタンスKafkaProducers FlinkKafkaProducer011プールのSemantic.EXACTLY_ONCEモード。これらの生産者のそれぞれの各チェックポイントを使用。同時場合は、チェックポイントの数がプールのサイズを超えて、FlinkKafkaProducer011は、例外がスローされますし、アプリケーション全体が失敗します。最大プールサイズと同時チェックポイントの最大数を設定してください。
注2:Semantic.EXACTLY_ONCEはそう妨げる消費者はより多くのカフカのテーマを読んでいました任意の長引く取引を残すことなく、すべての可能な措置をとります。アプリケーションが最初のチェックポイントの前にFLINKを失敗した場合は、これらのアプリケーションを再起動した後しかし、その後、前のプールのサイズに関するシステム内の情報はありません。したがって、最初のチェックポイント完了スケーリング前還元 FlinkKafkaProducer011.SAFE_SCALE_DOWN_FACTOR FLINKアプリケーション
//1。设置最大允许的并行checkpoint数,防止超过producer池的个数发生异常
env.getCheckpointConfig.setMaxConcurrentCheckpoints(5)
//2。设置producer的ack传输配置
// 设置超市时长,默认15分钟,建议1个小时以上
producerConfig.put(ProducerConfig.ACKS_CONFIG, 1)
producerConfig.put(ProducerConfig.TRANSACTION_TIMEOUT_CONFIG, 15000)
//3。在下一个kafka consumer的配置文件,或者代码中设置ISOLATION_LEVEL_CONFIG-read-commited
//Note:必须在下一个consumer中指定,当前指定是没用用的
kafkaonfigs.setProperty(ConsumerConfig.ISOLATION_LEVEL_CONFIG,"read_commited")
完全なコードの例:
package com.shufang.flink.connectors
import java.util.Properties
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.Semantic
import org.apache.flink.streaming.connectors.kafka._
import org.apache.flink.streaming.util.serialization.KeyedSerializationSchemaWrapper
import org.apache.kafka.clients.consumer.ConsumerConfig
import org.apache.kafka.clients.producer.ProducerConfig
import org.apache.kafka.common.serialization.StringDeserializer
object KafkaSource01 {
def main(args: Array[String]): Unit = {
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
//这是checkpoint的超时时间
//env.getCheckpointConfig.setCheckpointTimeout()
//设置最大并行的chekpoint
env.getCheckpointConfig.setMaxConcurrentCheckpoints(5)
env.getCheckpointConfig.setCheckpointInterval(1000) //增加checkpoint的中间时长,保证可靠性
/**
* 为了保证数据的一致性,我们开启Flink的checkpoint一致性检查点机制,保证容错
*/
env.enableCheckpointing(60000)
/**
* 从kafka获取数据,一定要记得添加checkpoint,能保证offset的状态可以重置,从数据源保证数据的一致性
* 保证kafka代理的offset与checkpoint备份中保持状态一致
*/
val kafkaonfigs = new Properties()
//指定kafka的启动集群
kafkaonfigs.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092")
//指定消费者组
kafkaonfigs.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "flinkConsumer")
//指定key的反序列化类型
kafkaonfigs.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, classOf[StringDeserializer].getName)
//指定value的反序列化类型
kafkaonfigs.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, classOf[StringDeserializer].getName)
//指定自动消费offset的起点配置
// kafkaonfigs.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest")
/**
* 自定义kafkaConsumer,同时可以指定从哪里开始消费
* 开启了Flink的检查点之后,我们还要开启kafka-offset的检查点,通过kafkaConsumer.setCommitOffsetsOnCheckpoints(true)开启,
* 一旦这个检查点开启,那么之前配置的 auto-commit-enable = true的配置就会自动失效
*/
val kafkaConsumer = new FlinkKafkaConsumer[String](
"console-topic",
new SimpleStringSchema(), // 这个schema是将kafka的数据应设成Flink中的String类型
kafkaonfigs
)
// 开启kafka-offset检查点状态保存机制
kafkaConsumer.setCommitOffsetsOnCheckpoints(true)
// kafkaConsumer.setStartFromEarliest()//
// kafkaConsumer.setStartFromTimestamp(1010003794)
// kafkaConsumer.setStartFromLatest()
// kafkaConsumer.setStartFromSpecificOffsets(Map[KafkaTopicPartition,Long]()
// 添加source数据源
val kafkaStream: DataStream[String] = env.addSource(kafkaConsumer)
kafkaStream.print()
val sinkStream: DataStream[String] = kafkaStream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[String](Time.seconds(5)) {
override def extractTimestamp(element: String): Long = {
element.split(",")(1).toLong
}
})
/**
* 通过FlinkkafkaProduccer API将stream的数据写入到kafka的'sink-topic'中
*/
// val brokerList = "localhost:9092"
val topic = "sink-topic"
val producerConfig = new Properties()
producerConfig.put(ProducerConfig.ACKS_CONFIG, new Integer(1)) // 设置producer的ack传输配置
producerConfig.put(ProducerConfig.TRANSACTION_TIMEOUT_CONFIG, Time.hours(2)) //设置超市时长,默认1小时,建议1个小时以上
/**
* 自定义producer,可以通过不同的构造器创建
*/
val producer: FlinkKafkaProducer[String] = new FlinkKafkaProducer[String](
topic,
new KeyedSerializationSchemaWrapper[String](SimpleStringSchema),
producerConfig,
Semantic.EXACTLY_ONCE
)
// FlinkKafkaProducer.SAFE_SCALE_DOWN_FACTOR
/** *****************************************************************************************************************
* * 出了要开启flink的checkpoint功能,同时还要设置相关配置功能。
* * 因在0.9或者0.10,默认的FlinkKafkaProducer只能保证at-least-once语义,假如需要满足at-least-once语义,我们还需要设置
* * setLogFailuresOnly(boolean) 默认false
* * setFlushOnCheckpoint(boolean) 默认true
* * come from 官网 below:
* * Besides enabling Flink’s checkpointing,you should also configure the setter methods setLogFailuresOnly(boolean)
* * and setFlushOnCheckpoint(boolean) appropriately.
* ******************************************************************************************************************/
producer.setLogFailuresOnly(false) //默认是false
/**
* 除了启用Flink的检查点之外,还可以通过将适当的semantic参数传递给FlinkKafkaProducer011(FlinkKafkaProducer对于Kafka> = 1.0.0版本)
* 来选择三种不同的操作模式:
* Semantic.NONE 代表at-mostly-once语义
* Semantic.AT_LEAST_ONCE(Flink默认设置)
* Semantic.EXACTLY_ONCE:使用Kafka事务提供一次精确的语义,每当您使用事务写入Kafka时,
* 请不要忘记为使用Kafka记录的任何应用程序设置所需的设置isolation.level(read_committed 或read_uncommitted-后者是默认值)
*/
sinkStream.addSink(producer)
env.execute("kafka source & sink")
}
}