More Related Content Similar to スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介 (20) More from Sotaro Kimura (8) スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介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…
4. What is Flink?
• 自前クラスタ、YARN、Mesos、Kubernates等
多様な環境で動作可能
– Amazon Kinesis Data Analytics上でも動作
• 並列度を増す事で兆/日オーダーにもスケール可能
• 非同期Snapshot/CheckPointの機構を持ち
メモリのアクセス速度を活用して高速化
https://flink.apache.org/
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. SQL Client Execute Example
SlideShare上ではアニメーションが動作しないため、
以下よりご覧ください。
https://ci.apache.org/projects/flink/flink-docs-stable/dev/table/sqlClient.html
7. SQL Clients Execution Flow
• Flink Standalone Cluster + SELECT
SQLClient JobManager
TaskManager
TaskManager
Data Source
8. SQL Clients Execution Flow
• Flink Standalone Cluster + SELECT
SQLClient JobManager
TaskManager
TaskManager
Data Source
SQLを解釈してジョブを生成し、
Submit
9. SQL Clients Execution Flow
• Flink Standalone Cluster + SELECT
SQLClient JobManager
TaskManager
TaskManager
Data Source
ジョブの並列度を元にTaskManagerに配
分
10. SQL Clients Execution Flow
• Flink Standalone Cluster + SELECT
SQLClient JobManager
TaskManager
TaskManager
Data Source
Task
Task
実際に実行するTaskを生成
11. SQL Clients Execution Flow
• Flink Standalone Cluster + SELECT
SQLClient JobManager
TaskManager
TaskManager
Data Source
Task
Task
処理対象のデータをData Sourceから取得
12. SQL Clients Execution Flow
• Flink Standalone Cluster + Select
SQLClient JobManager
TaskManager
TaskManager
Data Source
Task
Task
結果を継続的に取得し、表示
13. SQL Clients Execution Flow
• Flink Standalone Cluster + INSERT INTO
SQLClient JobManager
TaskManager
TaskManager
Data Source
Data Destination
SQLを解釈してジョブを生成し、
Submit
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. SQL Clients Execution Flow
• Flink Standalone Cluster + INSERT INTO
SQLClient JobManager
TaskManager
TaskManager
Data Source
Data Destination
ジョブの並列度を元にTaskManagerに配
分
16. SQL Clients Execution Flow
• Flink Standalone Cluster + INSERT INTO
SQLClient JobManager
TaskManager
TaskManager
Data Source
Data Destination
Task
実際に実行するTaskを生成
Task
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. 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. Compatibility of SQL/SQL Client
• Flink Tableによって以下機能群は共通の実体を持つ
– Flink Table API
– Flink SQL
– Flink SQL Client
• Flinkはデータの入出力元であるSourceやSinkを
Tableとして抽象化し、共通のIFでアクセス
– Tableを介することで、SQLでの処理やスキーマや型を前
提としたアプリケーションの記述が可能となる
• もちろん、バッチとストリームでのどちらで利用可能などの
制約は受ける
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. 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. Flink Table related Objects
• Tableの上位にEnvironmentが存在
• Environment
• ※SparkでいうSparkSessionのようなものと考えればいい
– Table(DataCatalog)管理(自前登録/外部取込)
– Table API / SQLの実行インタフェース
– UDFの登録 / 管理
– DataStream / DataTableをTableに変換
• ※SparkでいうRDDのようなものと考えれば(略
23. Flink Table related Objects
• Tableは主に以下3つの要素を保持
– Connector
– Format
– Table Schema
• ※コンポーネント次第で何が組み合わせ可能かも変化
• これらは全てコードとYAMLファイル両方で定義可
– コード
• Flink Table API、Flink SQLで使用
– YAML
• Flink SQL Clientで使用
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. 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. 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. Flink Table related Objects
• Format
– 端的に格納データのフォーマット・スキーマ変換器
• 複数のフォーマットに対応するための機構
– 例えば、外部システムにはCSVや、JSON、Avro等
様々なフォーマットでデータが保存されているだろう
– 一部の外部システムにおいては、
認識するためにFormat Schemaの設定も必要だろう
• ※非常に紛らわしいですが後述のTable Schemaとは別物
– 例
• Parquet, CSV
• Avro, JSON, LTSV etc
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. 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. Flink Table related Objects
• Table Schema
– 実際にTable API, SQLでアクセスする際のSchema
– Table Schemaによって、Format Schemaに定義された
columnAカラムをテーブル上ではCOLIMN_A
で使用可能にするなどのマッピングが可能
– Table Schemaを定義する際に時刻カラムを
EventTime/ProcessingTimeとして入れ込める
– ※Table Schema自体のバリエーションはない
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. 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. Why can we use dual setting?
• 両方式で宣言した設定項目は
TableFactoryというコンポーネントにわたる
– FactoryはソースとYAMLの両方に対応が必要
• TableFactoryは与えられた設定を基に、
SourceTable/SinkTableを
関連オブジェクトも含めて生成する
• TableFactoryはJavaのServiceLoaderでロード
– YAMLでの「type」で特定できる必要がある
34. Why are you thinking of Flink SQL?
• ここまで聞いて、
「KSQLでいいんじゃね?」
と思う方もいらっしゃるかと思います
• 私の考えるFlinkSQL Clientの利点
– SQL ClientのみでKafka以外への入出力が可能
• Kafka Connectorで可能だが、KSQLと比較していた段階で、
KSQLからKafkaConnectorを制御できず・・
36. Thank you for your attention!
https://www.flickr.com/photos/savannahcorps/7409364642