at least onceってぶっちゃけ問題の先送りだったよね #kafkajp
TRANSCRIPT
At least onceってぶっちゃけ問題の先送りだったよね
- Apache Kafka Meetup Japan #3 -
@shoe116
アジェンダ1. はじめに:自己紹介とsemanticsについて
2. 言い訳をするしかない状況についての共有と謝罪
3. at least onceとETL苦労話
4. KIP-98, 129で解決すること、しないこと
1. はじめに
1.1 about me•広告系→データ分析屋→HadoopでETL
•利用なう:Storm/Tez/Hive. Kafkaはconsumeのみ
•Java = Python > JavaScript > C++
•No Music, No Life. No Music, No Idol.
•課外活動はこちら•https://shoe116.tumblr.com/
1. at least once(少なくとも1回)•重複するかもしれないが、欠損はしない
2. at most once(最大1回)•欠損するかもしれないが、重複はしない
3. exactly once(正確に1回)•欠損も重複もしない•分散システムだと実装が非常に困難
1.2 semanticsについて
2. 言い訳をするしかない状況についての共有と謝罪
• at least onceだと、ETLする側としては「重複をどうするか問題」は避けられないし、カジュアルに頼まれます•ここでLTすることになった当時(6月上旬)では確かにkafkaはexactly onceをサポートしてなくて、かつて僕はkafka由来の重複排除の仕組みを考えました•それが、6/30(現地時間)のkafka0.11のリリースでexactly once(KPI-98, 129)対応がされて、僕が作ったモノとLTで話すネタはオワコン化した可能性が・・・• exactly once semanticsの詳しい話したかったけどコードまでは読む時間なかったです、ごめんなさい•噂によると懇親会中に実装の解説してくれるらしいよ
3. at least onceと重複排除苦労話
3.1 弊社のデータパイプライン
producer(DC1) kafka
(DC4)storm(DC4)
TEZ(DC4)
Hive(DC4)
kafka(DC1)
producer(DC2)
kafka(DC2)
kafka(DC5)
storm(DC5)
TEZ(DC5)
Hive(DC5)
producer(DC3)
kafka(DC3)
At Least Once At Least Once
Exactly once ( & unify)Partitioning
At Least Once
At Least Once
At Least Once
3.2 重複排除の方法1. kafkaのmessageにIDを埋めてproduce
2. HDFSにIDをkey, DATAをvalueにしてwrite
3. TezでIDをkeyにshuffleして重複排除処理
ID: asdfghjkl;:]Body: {aaa, bbb, ccc}ID: asdfghjkl;:]
Body: {aaa, bbb, ccc}ID: asdfghjkl;:]DATA: {aaa, bbb, ccc}
kafka storm
HDFS
$ID $DATA$ID $DATA$ID $DATA$ID $DATA$ID $DATA$ID $DATA$ID $DATA
TEZ
HDFS
$ID $DATA$ID $DATA$ID $DATA$ID $DATA$ID $DATA
3.2 重複排除にまつわる苦労話
1. 完全な意味での重複排除は困難•読み込める重複IDの量には限りがある• time windowを決めてその中で排除するしかない
2. パイプラインの正常稼働をどう担保するか• at least once = 件数はそのままor増える•重複排除 = 件数はそのままor減る•「件数が同じならOK」みたいな確認はできなくなる
4. KIP-98, 129で解決すること、しないこと
4.1 KIP-98, 129で新規追加1. Partition単位でのidempotentなproduce• producerでsequentialなIDを発行•messageとともにIDをbrokerに送ってhandlingする
2. 複数partitionに対するtransactionalなwrite•ごくごく一般的なTwo-Phase Commit• producerがtransactionをbegin, commit, abort
3. 同一Kafka内でのexactly-once stream処理•messageのsendとoffsetのcommitを1リクエストで行う
4.2 KIP-98, 129で解決しない
1. Exactly onceなKafka mirroring•MirrorMakerはクラスタをまたぐ•クラスタまたぎのTransactionは管理されない
2. Kafka以外のコンポーネントに書き出す場合•これまで通り、書き出す側でのstateの管理が必要
3. オペレーション/実装のミスでmessageがダブってproduceされる場合(当然)
関連資料• https://archive.apache.org/dist/kafka/0.11.0.0/RELEASE_NOTES.html
• https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how-apache-kafka-does-it/
• https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging