Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介

690 views

Published on

Hadoop / Spark Conference Japan 2019 LT

Published in: Engineering
  • Be the first to comment

スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介

  1. 1. スキーマ付き分散ストリーム処理を実行可能な FlinkSQLClientの紹介 2019/03/14 「Hadoop / Spark Conference Japan 2019」 Kimura, Sotaro(@kimutansk) https://www.flickr.com/photos/andrewmalone/810684924/
  2. 2. Self Introduction • Kimura, Sotaro(@kimutansk) – Current • Software Engineer @ dotData Japan – Previous • Data Engineer @ DWANGO Co.,Ltd. • etc – Favorite • Stream data processing • Kafka, Flink, Fluend, Spark, Pulsar etc…
  3. 3. https://flink.apache.org/ What is Flink? • バッチ処理とストリーム処理に両対応した 分散処理フレームワーク – ただし現状(1.7系)バッチとストリーム併用はできない – 1.8系のリリースで併用が可能になる見込み(?) • ウィンドウ処理などのいわゆる 「状態を持ったストリーム処理」が実行可能
  4. 4. What is Flink? • 自前クラスタ、YARN、Mesos、Kubernates等 多様な環境で動作可能 – Amazon Kinesis Data Analytics上でも動作 • 並列度を増す事で兆/日オーダーにもスケール可能 • 非同期Snapshot/CheckPointの機構を持ち メモリのアクセス速度を活用して高速化 https://flink.apache.org/
  5. 5. What is Flink SQL Client? • Flinkのアプリケーションを 以下で起動できるCLIツール – Flinkクラスタへの接続設定(flink-conf.yaml) – テーブル・スキーマ定義(sql-client-default.yaml) – SQL(一部独自構文あり) • 起動方法はFlinkインストール後 yamlファイルを設定し、以下コマンドを実行 $ ${FLINK_HOME}/bin/sql-client.sh embedded …(Flinkロゴ) Flink SQL>
  6. 6. SQL Client Execute Example SlideShare上ではアニメーションが動作しないため、 以下よりご覧ください。 https://ci.apache.org/projects/flink/flink-docs-stable/dev/table/sqlClient.html
  7. 7. SQL Clients Execution Flow • Flink Standalone Cluster + SELECT SQLClient JobManager TaskManager TaskManager Data Source
  8. 8. SQL Clients Execution Flow • Flink Standalone Cluster + SELECT SQLClient JobManager TaskManager TaskManager Data Source SQLを解釈してジョブを生成し、 Submit
  9. 9. SQL Clients Execution Flow • Flink Standalone Cluster + SELECT SQLClient JobManager TaskManager TaskManager Data Source ジョブの並列度を元にTaskManagerに配 分
  10. 10. SQL Clients Execution Flow • Flink Standalone Cluster + SELECT SQLClient JobManager TaskManager TaskManager Data Source Task Task 実際に実行するTaskを生成
  11. 11. SQL Clients Execution Flow • Flink Standalone Cluster + SELECT SQLClient JobManager TaskManager TaskManager Data Source Task Task 処理対象のデータをData Sourceから取得
  12. 12. SQL Clients Execution Flow • Flink Standalone Cluster + Select SQLClient JobManager TaskManager TaskManager Data Source Task Task 結果を継続的に取得し、表示
  13. 13. SQL Clients Execution Flow • Flink Standalone Cluster + INSERT INTO SQLClient JobManager TaskManager TaskManager Data Source Data Destination SQLを解釈してジョブを生成し、 Submit
  14. 14. SQL Clients Execution Flow • Flink Standalone Cluster + INSERT INTO SQLClient JobManager TaskManager TaskManager Data Source Data Destination SQLを解釈してジョブを生成し、Submit Submitが終わった段階で以下の情報を表示し、 次のSQLが入力可能になる - クラスタ情報 - JobID - Web UI URL
  15. 15. SQL Clients Execution Flow • Flink Standalone Cluster + INSERT INTO SQLClient JobManager TaskManager TaskManager Data Source Data Destination ジョブの並列度を元にTaskManagerに配 分
  16. 16. SQL Clients Execution Flow • Flink Standalone Cluster + INSERT INTO SQLClient JobManager TaskManager TaskManager Data Source Data Destination Task 実際に実行するTaskを生成 Task
  17. 17. SQL Clients Execution Flow • Flink Standalone Cluster + INSERT INTO SQLClient JobManager TaskManager TaskManager Data Source Data Destination Task Task Submit完了後にジョブが動作し、 Data Sourceからデータを取得して処理し、 Data Destinationへの投入が継続
  18. 18. SQL Client’s major functions • Same as Flink SQL – つまり、以下のような機能を一通り利用可能 • ANSI SQLに従ったSQLの機能(一部制限あり) • Window Function – TUMBLE、HOP、SESSION Processing/EventTimeの使い分け可 • Temporal Table Function – 主キー・時刻に対応したSnapshotを取得するための機能 • MATCH_RECOGNIZE – 特定のパターンを持つデータ列が来た場合に検知出力可能 » 例:あるカラムがA > B > Cという順になった際に検知! • UDF定義
  19. 19. Compatibility of SQL/SQL Client • Flink Tableによって以下機能群は共通の実体を持つ – Flink Table API – Flink SQL – Flink SQL Client • Flinkはデータの入出力元であるSourceやSinkを Tableとして抽象化し、共通のIFでアクセス – Tableを介することで、SQLでの処理やスキーマや型を前 提としたアプリケーションの記述が可能となる • もちろん、バッチとストリームでのどちらで利用可能などの 制約は受ける
  20. 20. Flink Table Data Processing • Flink Table APIでの記述 // Table API Select val orders = tableEnv.scan("Orders") val revenue = orders .filter('cCountry === "FRANCE") .groupBy('cID, 'cName) .select('cID, 'cName, 'revenue.sum AS 'revSum) // Table API Update // SinkTable Objectに投入 revenue.writeToSink(sinkRevenueFrance) // Catalog中のTableに投入 revenue.insertInto("RevenueFrance")
  21. 21. Flink Table Data Processing • Flink SQLでの記述(SQLClientの場合SQLのみ) // SQL SELECT val revenue = tableEnv.sqlQuery(""" |SELECT cID, cName, SUM(revenue) AS revSum |FROM Orders WHERE cCountry = 'FRANCE' |GROUP BY cID, cName """.stripMargin) // SQL UPDATE tableEnv.sqlUpdate(""" |INSERT INTO RevenueFrance |SELECT cID, cName, SUM(revenue) AS revSum |FROM Orders WHERE cCountry = 'FRANCE' |GROUP BY cID, cName """.stripMargin)
  22. 22. Flink Table related Objects • Tableの上位にEnvironmentが存在 • Environment • ※SparkでいうSparkSessionのようなものと考えればいい – Table(DataCatalog)管理(自前登録/外部取込) – Table API / SQLの実行インタフェース – UDFの登録 / 管理 – DataStream / DataTableをTableに変換 • ※SparkでいうRDDのようなものと考えれば(略
  23. 23. Flink Table related Objects • Tableは主に以下3つの要素を保持 – Connector – Format – Table Schema • ※コンポーネント次第で何が組み合わせ可能かも変化 • これらは全てコードとYAMLファイル両方で定義可 – コード • Flink Table API、Flink SQLで使用 – YAML • Flink SQL Clientで使用
  24. 24. Flink Table related Objects • Connector – 端的に外部システムに接続するためのコネクタ • Source / Sinkのどちらに対応するかはオブジェクトによる – 例えば、KafkaConnectorであれば クラスタ情報とTopic名を保持 – 例えば、FileSystemConnectorであれば パスやファイルシステム定義を保持 – 後述のFormat / TableSchemaを内包するケースもある – 例 • Kafka, Cassandra, Kinesis Streams, Elasticsearch • HDFS, RabbitMQ, Apache NiFi, Twitter etc
  25. 25. Flink Table related Objects • Connector定義例(コード) // declare the external system to connect to tableEnvironment .connect( new Kafka() .version("0.10") .topic("test-input") .startFromEarliest() .property("zookeeper.connect", "localhost:2181") .property("bootstrap.servers", "localhost:9092") )
  26. 26. Flink Table related Objects • Connector定義例(YAML) # declare the external system to connect to connector: type: kafka version: "0.10" topic: test-input startup-mode: earliest-offset properties: - key: zookeeper.connect value: localhost:2181 - key: bootstrap.servers value: localhost:9092
  27. 27. Flink Table related Objects • Format – 端的に格納データのフォーマット・スキーマ変換器 • 複数のフォーマットに対応するための機構 – 例えば、外部システムにはCSVや、JSON、Avro等 様々なフォーマットでデータが保存されているだろう – 一部の外部システムにおいては、 認識するためにFormat Schemaの設定も必要だろう • ※非常に紛らわしいですが後述のTable Schemaとは別物 – 例 • Parquet, CSV • Avro, JSON, LTSV etc
  28. 28. Flink Table related Objects • Format定義例(コード) // declare a format for this system .withFormat( new Avro() .avroSchema( "{" + " ¥"namespace¥": ¥"org.myorganization¥"," + " ¥"type¥": ¥"record¥"," + " ¥"name¥": ¥"UserMessage¥"," + " ¥"fields¥": [" + " {¥"name¥": ¥"timestamp¥", ¥"type¥": ¥"string¥"}," + " {¥"name¥": ¥"user¥", ¥"type¥": ¥"long¥"}," + " {¥"name¥": ¥"message¥", ¥"type¥": [¥"string¥", ¥"null¥"]}" + " ]"...
  29. 29. Flink Table related Objects • Format定義例(YAML) # declare a format for this system format: type: avro avro-schema: > { "namespace": "org.myorganization", "type": "record", "name": "UserMessage", "fields": [ {"name": "ts", "type": "string"}, {"name": "user", "type": "long"}, {"name": "message", "type": ["string", "null"]}...
  30. 30. Flink Table related Objects • Table Schema – 実際にTable API, SQLでアクセスする際のSchema – Table Schemaによって、Format Schemaに定義された columnAカラムをテーブル上ではCOLIMN_A で使用可能にするなどのマッピングが可能 – Table Schemaを定義する際に時刻カラムを EventTime/ProcessingTimeとして入れ込める – ※Table Schema自体のバリエーションはない
  31. 31. Flink Table related Objects • Table Schema定義例(コード) // declare the schema of the table .withSchema( new Schema() .field("rowtime", Types.SQL_TIMESTAMP) .rowtime(new Rowtime() .timestampsFromField("ts") .watermarksPeriodicBounded(60000) ) .field("user", Types.LONG) .field("message", Types.STRING) )
  32. 32. Flink Table related Objects • Table Schema定義例(YAML) # declare the schema of the table schema: - name: rowtime type: TIMESTAMP rowtime: timestamps: type: from-field from: ts watermarks: type: periodic-bounded delay: "60000" - name: user (¥n) type: BIGINT - name: message (¥n) type: VARCHAR
  33. 33. Why can we use dual setting? • 両方式で宣言した設定項目は TableFactoryというコンポーネントにわたる – FactoryはソースとYAMLの両方に対応が必要 • TableFactoryは与えられた設定を基に、 SourceTable/SinkTableを 関連オブジェクトも含めて生成する • TableFactoryはJavaのServiceLoaderでロード – YAMLでの「type」で特定できる必要がある
  34. 34. Why are you thinking of Flink SQL? • ここまで聞いて、 「KSQLでいいんじゃね?」 と思う方もいらっしゃるかと思います • 私の考えるFlinkSQL Clientの利点 – SQL ClientのみでKafka以外への入出力が可能 • Kafka Connectorで可能だが、KSQLと比較していた段階で、 KSQLからKafkaConnectorを制御できず・・
  35. 35. Conclusion • Flinkは状態付きストリーム処理も可能な 分散処理フレームワーク • SQL ClientはSQLとYAML定義のみで Flink Applicationが起動可能なCLIツール • Flink Table API, Flink SQL, Flink SQL Clientは Flink Tableを扱うためのIF • KSQLと比較すると単体で多様なシステムと 入出力を行えるのが利点
  36. 36. Thank you for your attention! https://www.flickr.com/photos/savannahcorps/7409364642

×