SlideShare a Scribd company logo
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
2017年5月20日
1
ヤフー株式会社 データ&サイエンスソリューション統括本部
データプラットフォーム本部 開発4部 パイプライン
森谷 大輔
Java Clientで入門する
Apache Kafka
JJUG CCC 2017 Spring
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
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ゴール(と注意)
Kafkaをこれから始めたい、始めたばか
りの人向けにKafkaの基本を実演ベース
で押さえて帰ってもらう
• ※既にガンガン使ってるぜという人は退屈
かも、でもちょっとはいい情報もあるかも
• ※現行最新のバージョン0.10.2.0を前提
3
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
• Kafkaとは?
• Kafkaの基本
• Java ClientでKafkaを体感する
• まとめ
4
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafkaとは?
5
時間を割きます
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Apache Kafka
スケーラブルな分散pub/sub型
メッセージングシステムを実現するために
LinkedInが開発してOSS化した (2011年~)
Apacheトップレベルプロジェクトで配布(2012年~)
6
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
実績
7
https://kafka.apache.org/powered-by から一部を抜粋
Fortune 500の内
実に3分の1がKafkaを
利用しているらしい
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafka Summit
• Confluent, inc.が主催
• SF (2016/4, 2017/8), NY (2017/5)
8
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
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Apache Kafka
スケーラブルな分散pub/sub型
メッセージングシステムを実現するために
LinkedInが開発してOSS化した (2011年~)
Apacheトップレベルプロジェクトで配布(2012年~)
10
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
publish/subscribeモデル
11
• Wikipediaには出版-購読型モデルとある
• データの送受信のかたち
• データの送信者(publisher)は受信者(subscriber)を気にしないでどんどん
送る
• 受信者は送信者を気にせず自分のタイミングで取る
publisher
publisher
publisher
仲介者
subscriber
subscriber
subscriber
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
publish/subscribeモデル
12
• つまりpublisherとsubscriberを非同期に分離した
• もしPUSH, PUSHだとどんな問題がある?
publisher
publisher
publisher
仲介者
subscriber
subscriber
subscriber
PULLPUSH
疎結合化
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
具体的にはなんの用途で使うの?
13
• 2つ
• データパイプライン
• ストリーム処理
と公式docのトップにもある
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
データパイプライン
14
Data Source
Data Source
Data Source
RDBMS
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
データパイプライン
15
Data Source
Data Source
Data Source
RDBMS
Data Source
ストリーム処理
Data Source
Data Source
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
データパイプライン
16
Data Source
Data Source
Data Source
RDBMS
Data Source
ストリーム処理
Data Source
Data Source
データレイク・・・
マイクロサービス・・・
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
データパイプライン
17
Data Source
Data Source
Data Source
RDBMS
Data Source
ストリーム処理
Data Source
Data Source
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ストリーム(リアルタイム)処理
18
• 課題:
このデイリーバッチが終わる明朝まで分析がで
きないよ・・・
• ASAPの意思決定
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ストリーム(リアルタイム)処理
19
• モジュールの日次クリック率推移を知りたい
• モジュールのクリック率急増を知りたい
• 遅延が多い路線を知りたい
• 電車の遅延を知りたい
• 2016年に話題になったツイートワードを知りたい
• 今見ているテレビ番組のバズツイートワードを知りたい
• ABテストの分析をしたい
• 非常に悪い結果を出しているバケットテストをすぐに停止したい
• マシンの故障率を知りたい
• マシンが故障しそうになったら知りたい
• ユーザの平均的な興味から広告を出したい
• ユーザが今だけ興味を持っている広告を出したい
変化の通知が、実際に変化した点から時
間が経つに連れて価値が低下する
高価値
数秒〜10分 価値の低下
バッチ
ストリーム
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ストリーム(リアルタイム)処理
20
• ストリーミングデータ
• 終わりがない、連続的に発生するデータ
• を処理するためにはキューイングの機能が必要
• 類似:ActiveMQ, RabbitMQ, ZeroMQ, Redis
• https://www.slideshare.net/laclefyoshi/ss-67658888
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafkaは
• データパイプラインをシンプルにする
• ストリーミングデータを扱える
を両方実現できるように設計された
• 特徴
• バッチ・リアルタイム分析共にサポート
• 受け取ったレコードは直ちに永続化
• スケーラビリティ
• デイリー1兆4千万のレコードを捌く@LinkedIn
• フォールトトレラント
21
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafkaの基本
22
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
pub/sub
23
publisher
publisher
publisher
仲介者
subscriber
subscriber
subscriber
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Kafkaを構成する4コンポーネント
24
Producer
Producer
Producer
Broker
Consumer
Consumer
Consumer
ZooKeeper狭義にはこれだけを
Kafkaと言うこともある
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.25
• Producer
• Consumer
• Broker
• ZooKeeper
Kafkaを構成する4コンポーネント
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ZooKeeper
26
• Apache ZooKeeper
• 可用性と信頼性の高い分散コーディネーションシステム
(詳細は割愛)
• Hadoop等でも使われるOSS
• Kafkaでは↓のために使われる
• クラスタマネジメント
• 死活管理
• ACL情報のストア
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はユーザ任意の型
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を投げ
る
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
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割り振りロジッ
クをユーザがカスタマイズす
る
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そのも
ののシステムログも別に存在
する、がそれではない
• 保持期間が指定できる
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
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
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に書き込まれる
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Java ClientでKafkaを体
感する
35
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Java Client
• Producer, Consumer APIとしてJava Client
が公式に用意されている
• しかし3rdパーティ製で他言語でも使える
(C/C++, Go, Python等)
• 特にConsumerはアプリケーションコードを書
くことが多い
36
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Consumer Client
• 特にConsumerはアプリケーションコードを書くことが
多い
• よりハイレベルなAPIやフレームワークもある
• Java Clientは最もローレベルなAPIともいえる
37
Kafka Streams
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ハイレベルAPIがあるのにわざわざ
ローレベルAPIの使い方を見る必要がある?
ある
• ハイレベルAPIを使いこなすのは簡単でない、Java Clientを把握
していることはハイレベルAPIを使いこなす上でとても有用
• フレームワークは構築から試すまでがかなり大変、ちょっとした
アプリやテストならJava Clientが一番低コストだったり
• ローレベルといっても直感的でないわけではない
• (旧APIのSimpleConsumerさんとはわけが違う)
38
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから試すこと
• Kafkaアプリケーションの全ての基本
• サンプルデータをProducerがBrokerにproduce
する
• ConsumerがBrokerからそのデータをconsume
して確認する
39
Producer Broker Consumer
k: null, v: “こんにちは世界” “こんにちは世界” ?
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
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
面倒!
• フレームワークだともっと面倒
41
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これがあれば一連の流れが試せる
4つの最低限コンポーネント
• ZooKeeper: JVMで動く
• Kafka Broker: JVMで動く
• Kafka Producer: JVMで動く
• Kafka Consumer: JVMで動く
• Javaコードペラ一枚でできるのでは?
42
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
A. できる
• つまりJUnit上で試せる
• Kafkaアプリケーションを開発するときはこ
の手を使ってテストすると良い
• ConsumerがStormやKafka Streamsだった
としても、それもJVMなので同じ手が使える
43
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
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Java Client【とJUnit】
でKafkaを体感する
(今度こそ)
45
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから試すこと(再掲)
• Kafkaアプリケーションの全ての基本
• サンプルデータをProducerがBrokerにproduce
する
• ConsumerがBrokerからそのデータをconsume
して確認する
46
Producer Broker Consumer
k: null, v: “こんにちは世界” “こんにちは世界” ?
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
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を読んでみる
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ2
49
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
• 5件投げたら5件ずつ、合計10件読
めた
• consumer group BをAに変えてもう
一回試すとどうなるか
50
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ2.1
51
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
• 1スレッドだけが5件読んでもう1スレッドは働
かなかった
• なぜかは後で
• とりあえずconsumer groupを分ければ別とし
て読めることがわかった
52
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
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ3
• partition数を2にしてさっきのコードを実行して
みます
• broker partitionの実体も変わっていることを確
認
54
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
今回は同プロセス内スレッドで分散さ
せたが、本番ではnode間で分散され
ることになるはず
55
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
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
こんなときに使える
• keyでgroupingして集約したい
• keyでストリームデータ同士をjoinしたい
• uniqueKeyを入れてウィンドウで重複除
去したい
57
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ4
• Aという文字列をkeyに入れてさっきの
2partitionに投げてみます
• さっきは分散したが今回は?
58
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
デモ5
• 圧縮
• するとしないのとではネットワークトラフィック、
Brokerのディスク消費が大きく変わる
• その代わりCPUを食う
• gzip, snappy, lz4
• Consumerで読むときはなにで圧縮されたか気
にする必要は無い
59
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
マルチスレッド実装の注意点
• テストのためにConsumerはマルチスレッドで試してきた
• 本番でも性能を出すために恐らくマルチスレッド実装する
• KafkaProducerクラスはスレッドセーフ
• KafkaConsumerクラスはスレッドセーフではない
(※wakeupメソッドだけ例外)
• Consumerオブジェクトをスレッド間で共有して操作すると
ConcurrentModificationException
• 各スレッドで作るようにすればOK
60
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に集中させたい」
といった要件を実現する。
便利だが実装がやや難しい。
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
まとめ
62
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
このセッションで
• どんなときにKafkaを使うといいかわかった
• Kafkaを試すために最低限必要なコンポーネントを覚えた
• JUnitでKafkaを試せることがわかった
• Java ClientでKafkaのpartitioning, Consumer Groupの機
能を体感した
• マルチスレッドConsumerアプリケーションを書く上で最低
限注意すべきことがわかった
63
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@ヤフー

More Related Content

PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
PDF
Javaのログ出力: 道具と考え方
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PDF
Apache Hadoop YARNとマルチテナントにおけるリソース管理
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PPTX
Apache Avro vs Protocol Buffers
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
PPTX
KeycloakでAPI認可に入門する
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
Javaのログ出力: 道具と考え方
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Hadoop YARNとマルチテナントにおけるリソース管理
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
Apache Avro vs Protocol Buffers
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
KeycloakでAPI認可に入門する

What's hot (20)

PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
PPTX
グラフ構造のデータモデルをPower BIで可視化してみた
PDF
フロー効率性とリソース効率性、再入門 #devlove #devkan
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
Serverless時代のJavaについて
PDF
Apache Kafka 0.11 の Exactly Once Semantics
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PPTX
MongoDBが遅いときの切り分け方法
PDF
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
PPTX
Dockerからcontainerdへの移行
PDF
噛み砕いてKafka Streams #kafkajp
PDF
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
PDF
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
PDF
ストリーム処理を支えるキューイングシステムの選び方
PPTX
Java11へのマイグレーションガイド ~Apache Hadoopの事例~
PPTX
java.lang.OutOfMemoryError #渋谷java
PDF
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
PDF
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
PDF
RDF Semantic Graph「RDF 超入門」
コンテナ未経験新人が学ぶコンテナ技術入門
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
グラフ構造のデータモデルをPower BIで可視化してみた
フロー効率性とリソース効率性、再入門 #devlove #devkan
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Serverless時代のJavaについて
Apache Kafka 0.11 の Exactly Once Semantics
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
MongoDBが遅いときの切り分け方法
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
Dockerからcontainerdへの移行
噛み砕いてKafka Streams #kafkajp
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
ストリーム処理を支えるキューイングシステムの選び方
Java11へのマイグレーションガイド ~Apache Hadoopの事例~
java.lang.OutOfMemoryError #渋谷java
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
RDF Semantic Graph「RDF 超入門」
Ad

Viewers also liked (20)

PDF
Java libraries you can't afford to miss
PPTX
Kotlin is charming; The reasons Java engineers should start Kotlin.
PDF
VMの歩む道。 Dalvik、ART、そしてJava VM
PPTX
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
PDF
2017spring jjug ccc_f2
PPTX
Jjug ccc
PDF
Arachne Unweaved (JP)
PDF
Jjugccc2017spring-postgres-ccc_m1
PDF
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
PDF
Polyglot on the JVM with Graal (English)
PPTX
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
PDF
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
PDF
日本Javaグループ2017年定期総会 #jjug
PPTX
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
PDF
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
PDF
Introduction of Project Jigsaw
PPTX
グラフデータベース入門
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java libraries you can't afford to miss
Kotlin is charming; The reasons Java engineers should start Kotlin.
VMの歩む道。 Dalvik、ART、そしてJava VM
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
2017spring jjug ccc_f2
Jjug ccc
Arachne Unweaved (JP)
Jjugccc2017spring-postgres-ccc_m1
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
Polyglot on the JVM with Graal (English)
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
日本Javaグループ2017年定期総会 #jjug
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Introduction of Project Jigsaw
グラフデータベース入門
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Ad

Similar to Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2 (20)

PDF
Fast Data を扱うためのデザインパターン
PDF
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
PDF
Kafka Summit NYCに見るストリーミングデータETLの話 #streamdatajp
PDF
20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...
PDF
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PDF
Tour of Distributed Systems 3 - Apache Kafka
PDF
ESP32ではじめようIoTハンズオン-サーバーサイド.pdf
PDF
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
PDF
Reactor Netty & Apache Kafka Stack #jsug
PDF
Reactive Kafka with Akka Streams
PPT
Hadoop~Yahoo! JAPANの活用について~
PDF
スキーマつきストリーム データ処理基盤、 Confluent Platformとは?
PPTX
Kafka vs Pulsar @KafkaMeetup_20180316
PPTX
Kafkaを活用するためのストリーム処理の基本
PPT
Hadoop ~Yahoo! JAPANの活用について~
PDF
Akka stream
PDF
IoT時代におけるストリームデータ処理と急成長の Apache Flink
PDF
Kafka Streamsによるスケーラブルで非環境依存なストリーム/バッチ処理アーキテクチャ
Fast Data を扱うためのデザインパターン
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
Kafka Summit NYCに見るストリーミングデータETLの話 #streamdatajp
20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
Tour of Distributed Systems 3 - Apache Kafka
ESP32ではじめようIoTハンズオン-サーバーサイド.pdf
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Reactor Netty & Apache Kafka Stack #jsug
Reactive Kafka with Akka Streams
Hadoop~Yahoo! JAPANの活用について~
スキーマつきストリーム データ処理基盤、 Confluent Platformとは?
Kafka vs Pulsar @KafkaMeetup_20180316
Kafkaを活用するためのストリーム処理の基本
Hadoop ~Yahoo! JAPANの活用について~
Akka stream
IoT時代におけるストリームデータ処理と急成長の Apache Flink
Kafka Streamsによるスケーラブルで非環境依存なストリーム/バッチ処理アーキテクチャ

More from Yahoo!デベロッパーネットワーク (20)

PDF
ゼロから始める転移学習
PDF
継続的なモデルモニタリングを実現するKubernetes Operator
PDF
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
PDF
オンプレML基盤on Kubernetes パネルディスカッション
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
PDF
Persistent-memory-native Database High-availability Feature
PDF
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
PDF
eコマースと実店舗の相互利益を目指したデザイン #yjtc
PDF
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
PDF
ビッグデータから人々のムードを捉える #yjtc
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
PDF
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
PDF
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
PDF
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PDF
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PDF
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
PDF
「新しいおうち探し」のためのAIアシスト検索 #yjtc
PDF
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ゼロから始める転移学習
継続的なモデルモニタリングを実現するKubernetes Operator
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Persistent-memory-native Database High-availability Feature
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
eコマースと実店舗の相互利益を目指したデザイン #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
ビッグデータから人々のムードを捉える #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc

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@ヤフー