Más contenido relacionado
La actualidad más candente (20)
Similar a Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2 (20)
Más de Yahoo!デベロッパーネットワーク (20)
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
- 1. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
2017年5月20日
1
ヤフー株式会社 データ&サイエンスソリューション統括本部
データプラットフォーム本部 開発4部 パイプライン
森谷 大輔
Java Clientで入門する
Apache Kafka
JJUG CCC 2017 Spring
- 2. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
自己紹介
• 森谷 大輔
• インフラエンジニア
• どちらかというとBEアプリケーション開発
• ヤフーのデータパイプラインをつくったり運用したり
• 対外発表
• ストリーム処理プラットフォームにおけるKafka導入事例 (Apache Kafka Meetup Japan #1: 2016)
• Hadoop Summit 2016 @San Jose ストリーム処理関連の報告 (Stream Processing Casual Talks #1: 2016)
• Kafka 0.10.0アップデート プロダクション100ノードでやってみた (D&S Data Night vol.03: 2016)
• 噛み砕いてKafka Streams (Apache Kafka Meetup Japan #2: 2016)
• Elasticsearch 5.2とJava Clientで戯れる (第18回Elasticsearch勉強会: 2017)
2
- 3. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ゴール(と注意)
Kafkaをこれから始めたい、始めたばか
りの人向けにKafkaの基本を実演ベース
で押さえて帰ってもらう
• ※既にガンガン使ってるぜという人は退屈
かも、でもちょっとはいい情報もあるかも
• ※現行最新のバージョン0.10.2.0を前提
3
- 4. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
• Kafkaとは?
• Kafkaの基本
• Java ClientでKafkaを体感する
• まとめ
4
- 5. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafkaとは?
5
時間を割きます
- 6. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Apache Kafka
スケーラブルな分散pub/sub型
メッセージングシステムを実現するために
LinkedInが開発してOSS化した (2011年~)
Apacheトップレベルプロジェクトで配布(2012年~)
6
- 7. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
実績
7
https://kafka.apache.org/powered-by から一部を抜粋
Fortune 500の内
実に3分の1がKafkaを
利用しているらしい
- 8. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafka Summit
• Confluent, inc.が主催
• SF (2016/4, 2017/8), NY (2017/5)
8
- 9. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ユーザ会
• Apache Kafka JP
• https://kafka-apache-jp.connpass.com/
9
https://kafka.apache.org/events
- 10. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Apache Kafka
スケーラブルな分散pub/sub型
メッセージングシステムを実現するために
LinkedInが開発してOSS化した (2011年~)
Apacheトップレベルプロジェクトで配布(2012年~)
10
- 11. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
publish/subscribeモデル
11
• Wikipediaには出版-購読型モデルとある
• データの送受信のかたち
• データの送信者(publisher)は受信者(subscriber)を気にしないでどんどん
送る
• 受信者は送信者を気にせず自分のタイミングで取る
publisher
publisher
publisher
仲介者
subscriber
subscriber
subscriber
- 12. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
publish/subscribeモデル
12
• つまりpublisherとsubscriberを非同期に分離した
• もしPUSH, PUSHだとどんな問題がある?
publisher
publisher
publisher
仲介者
subscriber
subscriber
subscriber
PULLPUSH
疎結合化
- 13. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
具体的にはなんの用途で使うの?
13
• 2つ
• データパイプライン
• ストリーム処理
と公式docのトップにもある
- 14. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
データパイプライン
14
Data Source
Data Source
Data Source
RDBMS
- 15. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
データパイプライン
15
Data Source
Data Source
Data Source
RDBMS
Data Source
ストリーム処理
Data Source
Data Source
- 16. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
データパイプライン
16
Data Source
Data Source
Data Source
RDBMS
Data Source
ストリーム処理
Data Source
Data Source
データレイク・・・
マイクロサービス・・・
- 17. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
データパイプライン
17
Data Source
Data Source
Data Source
RDBMS
Data Source
ストリーム処理
Data Source
Data Source
- 18. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ストリーム(リアルタイム)処理
18
• 課題:
このデイリーバッチが終わる明朝まで分析がで
きないよ・・・
• ASAPの意思決定
- 19. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ストリーム(リアルタイム)処理
19
• モジュールの日次クリック率推移を知りたい
• モジュールのクリック率急増を知りたい
• 遅延が多い路線を知りたい
• 電車の遅延を知りたい
• 2016年に話題になったツイートワードを知りたい
• 今見ているテレビ番組のバズツイートワードを知りたい
• ABテストの分析をしたい
• 非常に悪い結果を出しているバケットテストをすぐに停止したい
• マシンの故障率を知りたい
• マシンが故障しそうになったら知りたい
• ユーザの平均的な興味から広告を出したい
• ユーザが今だけ興味を持っている広告を出したい
変化の通知が、実際に変化した点から時
間が経つに連れて価値が低下する
高価値
数秒〜10分 価値の低下
バッチ
ストリーム
- 20. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ストリーム(リアルタイム)処理
20
• ストリーミングデータ
• 終わりがない、連続的に発生するデータ
• を処理するためにはキューイングの機能が必要
• 類似:ActiveMQ, RabbitMQ, ZeroMQ, Redis
• https://www.slideshare.net/laclefyoshi/ss-67658888
- 21. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafkaは
• データパイプラインをシンプルにする
• ストリーミングデータを扱える
を両方実現できるように設計された
• 特徴
• バッチ・リアルタイム分析共にサポート
• 受け取ったレコードは直ちに永続化
• スケーラビリティ
• デイリー1兆4千万のレコードを捌く@LinkedIn
• フォールトトレラント
21
- 22. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafkaの基本
22
- 23. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
pub/sub
23
publisher
publisher
publisher
仲介者
subscriber
subscriber
subscriber
- 24. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafkaを構成する4コンポーネント
24
Producer
Producer
Producer
Broker
Consumer
Consumer
Consumer
ZooKeeper狭義にはこれだけを
Kafkaと言うこともある
- 25. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.25
• Producer
• Consumer
• Broker
• ZooKeeper
Kafkaを構成する4コンポーネント
- 26. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ZooKeeper
26
• Apache ZooKeeper
• 可用性と信頼性の高い分散コーディネーションシステム
(詳細は割愛)
• Hadoop等でも使われるOSS
• Kafkaでは↓のために使われる
• クラスタマネジメント
• 死活管理
• ACL情報のストア
- 27. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Message
27
Producer
Producer
Producer
Broker
Consumer
Consumer
Consumer
ZooKeeper
Message(=Record)
• Kafka独自フォーマットのバイナリ
• keyとvalueとtimestamp等のメタデータで構
成
• key, valueはユーザ任意の型
- 28. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Topic
28
Producer
Producer
Producer
Broker
Consumer
Consumer
Consumer
weblog
purchase
customer
Topic
• Messageストリームのラベル
• ユーザが名付ける
• Producerは1個か複数のtopicにMessageを投げ
る
- 29. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Partition
29
Producer
weblog: partition
purchase: partition • Topicはさらに負荷分散のた
めにPartitionに分割される
• Partition数はTopic毎にユー
ザが決める
• Partition数は増やせるが減ら
せない
weblog: partition
purchase: partition
weblog: partition
purchase: partition
- 30. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Producer: key partitioning
30
Producer
weblog: partition
purchase: partition
weblog: partition
purchase: partition
weblog: partition
purchase: partition
• keyのハッシュ値から投入先
partitionを決定する
• 同じkeyのMessageは同じ
partitionに投入される
• keyを指定しなければラウンド
ロビン
• またはpartition割り振りロジッ
クをユーザがカスタマイズす
る
- 31. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Log
31
Producer
weblog: partition
purchase: partition
weblog: partition
purchase: partition
weblog: partition
purchase: partition
• partitionは任意のディレクトリ
パスにファイルとして永続化
される
• これをLogという
• 紛らわしいことにKafkaそのも
ののシステムログも別に存在
する、がそれではない
• 保持期間が指定できる
- 32. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Consumer Group
32
Producer
Broker
Consumer
Consumer
Consumer
purchase
• グルーピングされたconsumerは他のconsumerを
気にせずtopicのMessageを漏れなく分散
consumeする
group.id=shopping
group.id=marketing
- 33. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Offset
33
Consumer
Consumer
Consumer
group.id=shopping
group.id=marketing
ということはConsumer Group毎に
どこまで読んだかをConsumerが覚えている
partition 0
0 1 2
partition 1
0 1
- 34. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Offset
34
Consumer
Consumer
Consumer
group.id=shopping
group.id=marketing
partition 0
0 1 2
partition 1
0 1
Offsetは一度決まったら変わらない
• 「group.id=shoppingとしてtopic=purchaseのpartition=0のoffset=2まで読ん
だ」
• この情報はKafkaの専用topicに書き込まれる
- 35. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Java ClientでKafkaを体
感する
35
- 36. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Java Client
• Producer, Consumer APIとしてJava Client
が公式に用意されている
• しかし3rdパーティ製で他言語でも使える
(C/C++, Go, Python等)
• 特にConsumerはアプリケーションコードを書
くことが多い
36
- 37. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Consumer Client
• 特にConsumerはアプリケーションコードを書くことが
多い
• よりハイレベルなAPIやフレームワークもある
• Java Clientは最もローレベルなAPIともいえる
37
Kafka Streams
- 38. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ハイレベルAPIがあるのにわざわざ
ローレベルAPIの使い方を見る必要がある?
ある
• ハイレベルAPIを使いこなすのは簡単でない、Java Clientを把握
していることはハイレベルAPIを使いこなす上でとても有用
• フレームワークは構築から試すまでがかなり大変、ちょっとした
アプリやテストならJava Clientが一番低コストだったり
• ローレベルといっても直感的でないわけではない
• (旧APIのSimpleConsumerさんとはわけが違う)
38
- 39. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから試すこと
• Kafkaアプリケーションの全ての基本
• サンプルデータをProducerがBrokerにproduce
する
• ConsumerがBrokerからそのデータをconsume
して確認する
39
Producer Broker Consumer
k: null, v: “こんにちは世界” “こんにちは世界” ?
- 40. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
どうやって動作確認する?
• Producer, Consumer, Broker, ZooKeeper
1. ZooKeeper, Kafkaを開発機にインストール
2. ZooKeeper daemonとBroker daemonを起動して
3. お試しProducerコードを書いてjarを配備して起動して
4. お試しConsumerコードを書いてjarを配備して起動して
40
- 41. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
面倒!
• フレームワークだともっと面倒
41
- 42. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これがあれば一連の流れが試せる
4つの最低限コンポーネント
• ZooKeeper: JVMで動く
• Kafka Broker: JVMで動く
• Kafka Producer: JVMで動く
• Kafka Consumer: JVMで動く
• Javaコードペラ一枚でできるのでは?
42
- 43. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
A. できる
• つまりJUnit上で試せる
• Kafkaアプリケーションを開発するときはこ
の手を使ってテストすると良い
• ConsumerがStormやKafka Streamsだった
としても、それもJVMなので同じ手が使える
43
- 44. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
• ZooKeeperとBrokerをJavaコード上で起動する方法は公
式docのFAQにある
• https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-Unittesting
• やや長いのでライブラリを作って一行くらいで起動できる
ようにしておくと吉
• 今回はすみません、自作のものを使います
• 使い勝手は違いますが基本やっていることはFAQと同じ
44
- 45. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Java Client【とJUnit】
でKafkaを体感する
(今度こそ)
45
- 46. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから試すこと(再掲)
• Kafkaアプリケーションの全ての基本
• サンプルデータをProducerがBrokerにproduce
する
• ConsumerがBrokerからそのデータをconsume
して確認する
46
Producer Broker Consumer
k: null, v: “こんにちは世界” “こんにちは世界” ?
- 47. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ1
• pom
• テストコード
• broker partitionの実体を見てみましょう
• Producer, ConsumerのJavaDoc
• https://kafka.apache.org/0102/javadoc/index.html?org/apache/kafka/clients/producer/KafkaProducer.html
• https://kafka.apache.org/0102/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html
47
- 48. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Consumer Groupを体感する
48
Producer
Broker
Consumer
test-topic
group.id=B
Consumer
group.id=A
• Aというgroup.idとBというgroup.idで同じ
topicのMessageを読んでみる
- 49. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ2
49
- 50. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
• 5件投げたら5件ずつ、合計10件読
めた
• consumer group BをAに変えてもう
一回試すとどうなるか
50
- 51. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ2.1
51
- 52. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
• 1スレッドだけが5件読んでもう1スレッドは働
かなかった
• なぜかは後で
• とりあえずconsumer groupを分ければ別とし
て読めることがわかった
52
- 53. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
partitioningで負荷分散を体感する
• topic毎にpartition数を指定できる
• partition=1だとBroker nodeを何台増やしても拡張しない
• 1partitionは1Consumerからしか読まれない
• 1partitionを2Consumerから同時に読むことはできない、
2partitionなら可能
• さっき1スレッドだけが5件読んでもう1スレッドが働かな
かった理由はそれ
53
- 54. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ3
• partition数を2にしてさっきのコードを実行して
みます
• broker partitionの実体も変わっていることを確
認
54
- 55. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
今回は同プロセス内スレッドで分散さ
せたが、本番ではnode間で分散され
ることになるはず
55
- 56. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
key partitioning
• Aさんのログイン失敗が30分以内に5回以上を検知
• Kafka Consumerで実装した場合
56
partition
0
partition
1
partition
2
2回失敗
?
2回失敗
?
1回失敗
?Consumer Consumer Consumer
- 57. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
こんなときに使える
• keyでgroupingして集約したい
• keyでストリームデータ同士をjoinしたい
• uniqueKeyを入れてウィンドウで重複除
去したい
57
- 58. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ4
• Aという文字列をkeyに入れてさっきの
2partitionに投げてみます
• さっきは分散したが今回は?
58
- 59. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ5
• 圧縮
• するとしないのとではネットワークトラフィック、
Brokerのディスク消費が大きく変わる
• その代わりCPUを食う
• gzip, snappy, lz4
• Consumerで読むときはなにで圧縮されたか気
にする必要は無い
59
- 60. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
マルチスレッド実装の注意点
• テストのためにConsumerはマルチスレッドで試してきた
• 本番でも性能を出すために恐らくマルチスレッド実装する
• KafkaProducerクラスはスレッドセーフ
• KafkaConsumerクラスはスレッドセーフではない
(※wakeupメソッドだけ例外)
• Consumerオブジェクトをスレッド間で共有して操作すると
ConcurrentModificationException
• 各スレッドで作るようにすればOK
60
- 61. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
KafkaConsumer 0.10.2で使える便利メソッド紹介
61
返り値型 メソッド 機能、使いどころ
void • commitSync()
• commitSync(Map<TopicPartition, OffsetAndMetadata>
offsets)
• commitAsync(OffsetCommitCallback callback)
Offsetのコミットを自動定期に任せない場合、自分でOffset
コミットしたいタイミングを指定する。
特定のpartitionについて特定のOffsetでコミット、ということ
もできる。
処理を含めてAt-least-onceを実現する場合は必須。
Map<TopicPar
tition,
OffsetAndTim
estamp>
• offsetsForTimes(Map<TopicPartition, Long>
timestampsToSearch)
最近追加された強力な機能。
MessageのtimestampからOffsetを逆引きする。
下記のseekと合わせて使うことで何時何分のデータから何
時何分のデータを再度consumeし直すといったユースケー
スを実現できる。
void • seek(TopicPartition partition, long offset)
• seekToBeginning(Collection<TopicPartition> partitions)
• seekToEnd(Collection<TopicPartition> partitions)
今読んでいるOffsetを途中で変える機能。
ほとんどのConsumerアプリケーションで稼働中に任意に
Offsetを変えたい要望が出てくるので重要度が高いメソッド。
void • pause(Collection<TopicPartition> partitions)
• resume(Collection<TopicPartition> partitions)
特定のpartitionのconsumeを一時停止したり再開させたり
する。「今だけ特定のpartitionのconsumeに集中させたい」
といった要件を実現する。
便利だが実装がやや難しい。
- 62. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
まとめ
62
- 63. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
このセッションで
• どんなときにKafkaを使うといいかわかった
• Kafkaを試すために最低限必要なコンポーネントを覚えた
• JUnitでKafkaを試せることがわかった
• Java ClientでKafkaのpartitioning, Consumer Groupの機
能を体感した
• マルチスレッドConsumerアプリケーションを書く上で最低
限注意すべきことがわかった
63
- 64. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafka Meetup JP #3
7/6(木)開催
64
以下connpassで案内予定
https://kafka-apache-jp.connpass.com/
会場は LODGE@ヤフー