Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Iceberg Definitive Guide輪読会 Chapter9
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
tanisushi
November 11, 2024
Technology
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Iceberg Definitive Guide輪読会 Chapter9
tanisushi
November 11, 2024
More Decks by tanisushi
See All by tanisushi
Iceberg Definitive Guide輪読会 Chapter7&8
tanisuhi
0
200
Other Decks in Technology
See All in Technology
AI時代のデータ基盤を考える問い
pacocat
0
580
LLM Internals: 언어 모델의 계보와 알고리즘 진화 (2023~2026)
inureyes
PRO
1
920
Digitization部 紹介資料
sansan33
PRO
2
7.7k
AI開発に用いられるHPC技術について
gpuunite_official
0
270
Android skills に学ぶ
kokiko
0
170
巨大気象データと戦う ― サロゲートモデル学習を高速化する圧縮技術
gpuunite_official
0
260
[ホンマでっか SRE] あなたはなぜ SRE に?
_awache
0
120
三人寄ればチューリング完全
puhitaku
6
3.1k
AI時代に、人は何を、どう学ぶのか #pbl_pub / What and How Do We Learn in the AI Era?
takaking22
1
250
Flutter × BLE Centralを自前Pluginで実装する設計パターン - MethodChannel / EventChannelで作る双方向ブリッジの実践 / Building Custom Flutter BLE Central Plugins: Bidirectional Bridging with Method & Event Channels
bitkey
PRO
0
250
AI時代のアウトプット――変わったこと、変わらないこと / Devsumi 2026 Kansai #devsumi
jnchito
0
560
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
200
Featured
See All Featured
Chasing Engaging Ingredients in Design
codingconduct
0
280
We Are The Robots
honzajavorek
0
310
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
490
KATA
mclloyd
PRO
35
15k
ラッコキーワード サービス紹介資料
rakko
1
4.5M
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Designing Powerful Visuals for Engaging Learning
tmiket
1
510
Statistics for Hackers
jakevdp
799
230k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
900
Transcript
Iceberg Definitive Guide輪読会 Chapter9 Appache Flink
アジェンダ Flinkの概要とIcebergと使う利点 FlinkでのDDL Flinkでのデータ読み込み Flinkでのデータ書き込み まとめと所感
Apache Flinkとは ストリーム処理、バッチ処理どちらも低レイテンシで実行できる 分散エンジン 他とストリーム処理できるサービスと比べてexactly-onceへの対応が早かったり クラスタの設定が楽なのでストリームデータの処理ではよく使われているらしい
Flinkアーキテクチャ クラスタ全体を制御するJobManagerとJobManagerが割り振ったTaskを実際に遂行する TaskManagerに役割を分離することで大規模なストリーム処理と分散処理を効率的に実行
なぜFlinkとIcebergを一緒に使うのか ストリーミングデータに対して様々な恩恵を得られるから • トランザクションの一貫性を保証 • スキーマエボリューションが容易になる
• ログ生成からのレイテンシの向上 • 従来システムからの簡略化 • インクリメンタルなデータ読み込みによる処理の高速化 参考:LINEがログパイプラインにFlink+Icebergを採用している事例
環境のセットアップ Definitive Guideではローカルでセットアップする手順が記載されているが 面倒なのでFlink+Hadoopカタログを触れるコンテナイメージを利用するのが おすすめ https://github.com/gordonmurray/apache_flink_and_iceberg
FlinkでのIcebergテーブルの作成 Iceberg実行のランタイムがセットアップされていれば 簡単にIcebergのカタログを作れる CREATE
CATALOG <catalog_name> WITH ( 'type'='iceberg', 'catalog-type'=<values> <config_key>=<config_value> );
DBとテーブルの作成 テーブル作成時にWITHでコネクターの指定をしている以外は一般的なSQLで 書ける (WITH句内では他のIcebergのテーブルプロパティを指定できる) CREATE DATABASE
iceberg_db; USE iceberg_db; CREATE TABLE employee ( id BIGINT,role STRING,department STRING,salary FLOAT,region STRING ) WITH ( 'connector'='iceberg' );
Flinkでのパーティション作成 パーティションを作成したい時もWITHでコネクターの指定をしている 以外は一般的なSQLで書ける ※ 隠れパーティション非対応 CREATE
TABLE emp_partitioned_table ( id BIGINT, role STRING, ) PARTITIONED BY (role) WITH ( 'connector'='iceberg' );
ALTER TABLE テーブルプロパティを変更したい時も特殊な操作は必要ない ALTER TABLE employee SET ('write.format.default'='avro'); ALTER
TABLE employee RENAME TO emp_new; テーブル名の変更 テーブルの書き込みフォーマットの変更
バッチ読み込み SELECT文の実行前にランタイムの実行方法をbatchに指定することでジョブ実 行時にバッチでデータを読み込むことができる SET execution.runtime-mode =
batch; SELECT * FROM employee;
ストリーミング読み込み ランタイムをstreamingに指定、更にOPTIONS以下の部分で SQLプランナーの実行計画に対して追加で情報を指定することで インクリメンタルなデータに対してのクエリも実現 (※OPTIONSの部分をSQLヒントと呼ぶらしい)
SET execution.runtime-mode = streaming; SELECT * FROM employee /*+ OPTIONS('streaming'='true', 'monitor-interval'='1s')*/ ;
メタデータに対するアクセス 主要なメタデータに対するアクセスは以下の通り ※その他のメタデータに対するアクセスはリンクを参照inspecting-tables
SELECT * FROM `catalog`.`database`.`table`$history; テーブル履歴へのアクセス メタデータファイル履歴へのアクセス スナップショットへのアクセス SELECT * FROM `catalog`.`database`.`table`$metadata_log_entries; SELECT * FROM `catalog`.`database`.`table`$snapshots;
INSERT INTO 特別な処理は必要なく一般的なクエリでデータを挿入することができる バッチ処理、ストリーミング処理どちらでも実行可能 INSERT INTO employee VALUES (1,
'Software Engineer', 'Engineering', 25000, 'NA'); 値を指定して挿入するケース 他テーブルから値を挿入するケース INSERT INTO employee SELECT id, role from emp_new;
INSERT OVERWRITE 既にテーブルにあるデータを書き換えたいときに使用する IcebergのAtomicな操作のおかげでこのようなクエリを実行しても データの一貫性を保つことが可能 (※バッチモードのみ対応) INSERT OVERWRITE
employee VALUES (1, 'Software Tester', 'Engineering', 23000,'NA'); 指定された行を全て指定の値で上書きする INSERT OVERWRITE employee PARTITION(department='Engineering') SELECT * FROM updated_emp_data WHERE department='Engineering'; 指定されたパーティション値のみを上書きする
UPSERT INSERTとUPDATEの組み合わせで以下のような挙動をする (SparkやDremioのMERGE INTOと同じような操作) • レコードがある場合→更新 •
レコードがない場合→新しいレコードを挿入 実行のためにはテーブルが以下の条件が満たされている必要がある • テーブルスキーマでプライマリキーが指定されている
UPSERT INTOの実例 UPSERTその1(テーブル作成時にオプション指定) CREATE TABLE employee (
`id` INT UNIQUE, `role` STRING NOT NULL, `department` STRING NOT NULL, `salary` FLOAT, `region` STRING NOT NULL, PRIMARY KEY(`id`) NOT ENFORCED ) WITH ('format-version'='2', 'write.upsert.enabled'='true'); INSERT INTO employee VALUES (1, 'Director', 'Product', 33000, 'APAC'); UPSERTその2(INSERT操作の時にオプション指定) INSERT INTO employee /*+ OPTIONS('upsert-enabled'='true') */ VALUES (3, 'Manager', 'Engineering', 26000, 'NA');
まとめと所感 まとめ ストリーミングデータを扱うような場合でもIcebergの恩恵を得られることがわかった 所感 kafkaとか実際にストリーミングデータを処理してみないとここらへんの嬉しさわからないかも・・・