Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2

6.300 Aufrufe

Veröffentlicht am

JJUG CCC 2017 Spring 発表資料 http://www.java-users.jp/ccc2017spring/

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2

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

×