SlideShare a Scribd company logo
1 of 45
Download to read offline
PostgreSQLとArrowとGPUで
楽々大量データ処理
HeteroDB,Inc
Chief Architect & CEO
KaiGai Kohei <kaigai@heterodb.com>
自己紹介/会社紹介
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
3
会社概要
 商号 ヘテロDB株式会社
 創業 2017年7月4日
 拠点 品川区北品川5-5-15
大崎ブライトコア4F
 事業内容 高速データ処理製品の開発・販売
GPU&DB領域の技術コンサルティング
ヘテロジニアスコンピューティング技術をデータベース領域に適用し、
誰もが使いやすく、シンプルで高速な大量データ分析基盤を提供する。
代表者プロフィール
 海外 浩平(KaiGai Kohei)
 OSS開発者コミュニティにおいて、PostgreSQLやLinux kernelの
開発に15年以上従事。主にセキュリティ・FDW等の分野で
PostgreSQLのメインライン機能の強化に貢献。
 IPA未踏ソフト事業において“天才プログラマー”認定 (2006)
 GPU Technology Conference Japan 2017でInception Awardを受賞
PostgreSQLの各種インフラ
PG-Strom - GPUを用いてSQLを並列処理する
SQL パーサ
SQL オプティマイザ
トランザクション 共有バッファ
各種関数・演算子 プロセス間通信
実行結果
GPUコード生成
代替実行計画作成
PG-Stromのインフラ機能
GPUデバイス管理
JITコンパイル
GPU-
Direct
SQL
データの読み出し
GPUカーネル実行
SQL エグゼキュータ
PG-Strom拡張モジュール
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
4
GPUとはどんなプロセッサなのか?
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
5
主にHPC分野で実績があり、機械学習用途で爆発的に普及
NVIDIA A100
スーパーコンピュータ
(東京工業大学 TSUBAME3.0) CG(Computer Graphics) 機械学習
数千コアの並列処理ユニット、TB/sのスループットに達する広帯域メモリを
ワンチップに実装した半導体デバイス。
“同じ計算を大量のデータに並列実行” を最も得意とする
シミュレーション
GPU-Direct SQL(1/4)
PCI-E
Bus
Buffer Copy
Buffer Copy
SCAN
JOIN
GROUP BY
Storage Block Read
大量の ”ゴミデータ” も含む
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
6
GPU-Direct SQL(2/4)
P2P-DMAを利用し、NVME-SSDとGPUを直結してデータ転送
PCI-E
Bus
SCAN
JOIN
GROUP BY
Storage Block Read
by NVIDIA GPUDirect Storage
P2P-DMA
P2P-DMA :
Peer-to-Peer Direct Memory Access
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
7
GPU-Direct SQL(3/4)
P2P-RDMAを用いて、他ノードのストレージから直接読み出しも可
PCI-E
Bus
Storage Block Read
by NVIDIA GPUDirect Storage
PCI-E
Bus
SCAN
JOIN
GROUP BY
100Gb
Network
P2P-RDMA
P2P-RDMA :
Peer-to-Peer Remote Direct Memory Access
Storage Server DB/GPU Server
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
8
GPU-Direct SQL(4/4)
0
5,000
10,000
15,000
20,000
0 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400
Total
Storage
Read
Throughput
[MB/s]
Elapsed Time [sec]
Query Execution
with GPU-Direct SQL
nvme3
nvme2
nvme1
nvme0
Query Execution with Filesystem on PostgreSQL Heap Tables
2,648 2,687 2,690 2,500 2,491 2,480 2,128 2,633 2,531 2,572 2,079 2,124 2,152
18,915 18,902 19,164
18,351
17,220
19,158
15,995 16,068
17,278
18,317
15,978 16,020 16,410
0
5,000
10,000
15,000
20,000
Q1_1 Q1_2 Q1_3 Q2_1 Q2_2 Q2_3 Q3_1 Q3_2 Q3_3 Q3_4 Q4_1 Q4_2 Q4_3
Query
Execution
Throughput
[MB/s]
Star Schema Benchmark (SF=999; 875GB)
CPU: AMD EPYC 7402P (24C; 2.8GHz), GPU: NVIDIA A100 [PCI-E; 40GB], SSD: Intel D7-5510 (U.2; 3.84TB) x4
PostgreSQL v13.4 PG-Strom v3.3devel [Heap]
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
9
ココまでが前振りです
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
10
大量データの処理を考える(1/3)
Manufacturing
Home electronics
Logistics
Mobile
WHERE
JOIN
GROUP BY
PostGIS
JSONB
GPU-Direct SQL
Log collector
Server
DB/GPU
Server
DB Admin
BI Tools
(Visualization)
AL/ML
(異常検知など)
IoT/M2M
Devices
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
11
大量データの処理を考える(2/3)
▌ワークロードの特性
 多くの場合、テーブルのフルスキャンを伴う。
 テーブル単位のデータ分割が一般的(パーティションなど)
 ストレージからの読み出し速度で律速
▌どうする?
 列指向データの利用 … 参照しないデータを読み出さない
検索・集計処理がツラい…。
Big Table
Big Data
Summary,
Report
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
12
大量データの処理を考える(3/3)
▌ワークロードの特性
 大量の元データを読み出して、DBの内部形式に変換してテーブルへ書き込み。
 データ形式を変換するCPU、ストレージへの書き込み速度で律速
 並列度を上げにくいことも多い(順次読み出し前提のデータ形式)
▌どうする?
 外部データを “そのまま” 読み出す … インポート自体の必要性をなくす
そもそもDBへのインポートもツラい…。
Big Table
Big Data
Summary,
Report
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
13
Apache Arrowデータ形式(1/3)
▌列指向の構造化データ形式
 被参照列のみ読み出す(= I/O量の削減)が可能
 データが隣接しているため、SIMD命令やGPUでの処理性能を引き出しやすい
▌多くのビッグデータ系OSSで対応が進んでいる
 SparkやDrill、Python(PyArrow)など。PG-Strom (Arrow_Fdw) もその一つ。
▌留意点
 更新はほぼ不可能。追記のみ(Insert-Only)と考えた方がよい
PG-Strom
(Arrow_Fdw)
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
14
Apache Arrowデータ形式(2/3)
Header “ARROW1¥0¥0”
Schema Definition
Footer
Schema Definition
Custom Metadata
Apache Arrow File
RecordBatch-1
RecordBatch-k
RecordBatch-N
Terminator “ARROW1”
RecordBatch:
長さの同じ配列を
列ごとに寄せ集め
たもの。
Schema Definition:
列名やデータ型、属性が
列の数だけ列挙されている。
テーブル定義に相当する。
A列 B列 C列 D列
物理的な(ファイル上の)レイアウト
A列 NULL-Bitmap
A列 Values-array
B列 NULL-Bitmap
B列 Values-index
B列 Values-body
C列 NULL-Bitmap
C列 Values-array
D列 NULL-Bitmap
D列 Values-array
Record
Batch-k SELECT SUM(D)
FROM f_arrow_tbl
WHERE B LIKE ‘%abc%’;
被参照列のみの
ロードが容易
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
15
Apache Arrowデータ形式(3/3) 補足:可変長データ
B[0] = ‘dog’
B[1] = ‘panda’
B[2] = NULL
B[3] = ‘capybara’
B[4] = ‘cat’
B列 Null-Bitmap
B列 Values-Index
B列 Values-Body
1 1
0 3
‘d’ ‘o’ ‘g’ ‘p’ ‘a’ ‘n’ ‘d’ ‘a’ ‘c’ ‘a’ ‘p’ ‘y’ ‘b’ ‘a’ ‘r’ ‘a’
8 8
‘c’ ‘a’ ‘t’
0 1 1
16 19
文字列長
3-0=3
文字列長
8-3=5
文字列長
16-8=8
文字列長
19-16=3
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
16
Apache Arrowならデータのインポートが不要
✓ PostgreSQLのFDW機能(Arrow_Fdw)を使用して、
Arrowファイルに紐付けた外部テーブル(Foreign Table)を定義する。
✓ データの移動を伴わないため、一瞬で完了する。
(Arrowファイル自体の移動は OS 上のファイルコピー)
CSV Files PostgreSQL
Table
INSERT INTO
COPY … FROM
Foreign
Table
mapping by
IMPORT
FOREIGN SCHEMA
複製
✓ CSVなど外部ファイルを、読み出し、データ形式を変換し、
PostgreSQLのテーブルに複製を書き込むことになる。
✓ データの件数が多い場合、非常に時間を要する処理になる。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
17
Arrow_Fdwによる外部テーブルの定義(1/3)
postgres=# drop foreign table f_mytest ;
DROP FOREIGN TABLE
postgres=# CREATE FOREIGN TABLE f_mytest (
id int,
ts timestamp,
x float8,
y text,
z numeric
) SERVER arrow_fdw
OPTIONS (file '/tmp/mytest.arrow');
CREATE FOREIGN TABLE
postgres=# SELECT * FROM f_mytest;
id | ts | x | y | z
----+----------------------------+--------------------+--------------+---------
1 | 2022-08-02 00:34:44.210589 | 77.4344383633856 | 65ac7f6 | 38.6218
2 | 2019-05-11 03:06:16.353798 | 95.33235230265761 | 9105319395 | 51.8267
3 | 2015-01-04 11:02:25.66779 | 93.67415248121794 | b56930f7834 | 84.9033
: : : : :
24 | 2022-09-24 06:26:02.058316 | 17.668632938372266 | c5e35 | 55.9739
25 | 2016-08-08 18:16:12.248363 | 92.2211769466387 | fa889dd51692 | 19.246
(25 rows)
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
18
Arrow_Fdwによる外部テーブルの定義(2/3)
postgres=# import foreign schema f_mytest
from server arrow_fdw
into public options (file '/tmp/mytest.arrow');
IMPORT FOREIGN SCHEMA
postgres=# ¥d f_mytest
Foreign table "public.f_mytest"
Column | Type | Collation | Nullable | Default | FDW options
--------+-----------------------------+-----------+----------+---------+-------------
id | integer | | | |
ts | timestamp without time zone | | | |
x | double precision | | | |
y | text | | | |
z | numeric | | | |
Server: arrow_fdw
FDW options: (file '/tmp/mytest.arrow’)
IMPORT FOREIGN SCHEMAで、Arrowファイルのスキーマ定義ごと取り込むのが楽
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
19
Arrow_Fdwによる外部テーブルの定義(3/3)
$ python3 -q
>>> import pyarrow as pa
>>> X = pa.RecordBatchFileReader('/tmp/mytest.arrow')
>>> X.schema
id: int32
-- field metadata --
min_values: '1'
max_values: '25'
ts: timestamp[us]
x: double
y: string
z: decimal(30, 8)
-- schema metadata --
sql_command: 'SELECT * FROM mytest'
>>> X.get_record_batch(0).to_pandas()
id ts x y z
0 1 2022-08-02 00:34:44.210589 77.434438 65ac7f6 38.62180000
1 2 2019-05-11 03:06:16.353798 95.332352 9105319395 51.82670000
2 3 2015-01-04 11:02:25.667790 93.674152 b56930f7834 84.90330000
3 4 2017-02-10 21:05:26.631906 90.553723 2103 86.78170000
: : : : : :
22 23 2019-05-19 02:06:38.668702 47.295458 6e00a6e037ad 11.02260000
23 24 2022-09-24 06:26:02.058316 17.668633 c5e35 55.97390000
24 25 2016-08-08 18:16:12.248363 92.221177 fa889dd51692 19.24600000
ファイル形式は共通なので、当然、Pythonでも普通に読める
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
20
Arrowファイルの作り方(1/4) RDBMSから
[kaigai@magro ~]$ pg2arrow -d postgres ¥
-c "select * from lineorder ¥
where lo_orderpriority in ('1-URGENT','2-HIGH','3-MEDIUM’) ¥
order by lo_orderdate" ¥
-o /tmp/flineorder.arrow --progress ¥
--stat=lo_orderdate
RecordBatch[0]: offset=1712 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[1]: offset=268438792 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[2]: offset=536875872 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[3]: offset=805312952 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[4]: offset=1073750032 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[5]: offset=1342187112 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[6]: offset=1610624192 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[7]: offset=1879061272 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[8]: offset=2147498352 length=76206296 (meta=920, body=76205376) nitems=369928
$ ls -lh /tmp/flineorder.arrow
-rw-r--r--. 1 kaigai users 2.1G Oct 12 20:17 /tmp/flineorder.arrow
pg2arrowによる PostgreSQL からのダンプ
✓ -c オプションで指定したクエリの実行結果をArrowファイルとして保存
✓ 単純なダンプと異なり、検索条件を指定したり、ソートやJOINなども可能
✓ デフォルトで 256MB 毎に RecordBatch を作る(-s オプションで変更可能)
✓ --stat オプションはmin/max統計情報の採取を有効にする。(後述)
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
21
Arrowファイルの作り方(2/4) NICから
# pcap2arrow -i lo,eno1 -o /tmp/my_packets.arrow -p 'tcp4,udp4,icmp4’
^C
# ls -lh /tmp/my_packets.arrow
-rw-r--r--. 1 root root 57K 10月 12 22:19 /tmp/my_packets.arrow
$ psql postgres
postgres=# import foreign schema my_packets from server arrow_fdw
into public options (file '/tmp/my_packets.arrow');
IMPORT FOREIGN SCHEMA
postgres=# select timestamp, src_addr, dst_addr, protocol, length(payload) from my_packets;
timestamp | src_addr | dst_addr | protocol | length
----------------------------+----------------+-----------------+----------+--------
2021-10-12 13:18:22.684989 | 192.168.77.72 | 192.168.77.106 | 6 | 6
2021-10-12 13:18:31.531827 | 192.168.77.72 | 192.168.77.106 | 6 | 36
2021-10-12 13:19:00.000605 | 192.168.77.254 | 239.255.255.250 | 17 | 472
2021-10-12 13:19:00.000929 | 192.168.77.254 | 239.255.255.250 | 17 | 448
: : : : :
pcap2arrowによるネットワークキャプチャ
✓ -i で指定したネットワークデバイスからパケットをキャプチャし、
Arrowファイルとして書き出す。
✓ スキーマ構造は -p で指定したプロトコルのヘッダ構造に準ずる。
✓ PF_RINGドライバを使用しており、50Gbps近辺までのキャプチャまでは実証済。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
22
Arrowファイルの作り方(3/4)
Manufacturing
Home electronics
Logistics
Mobile
WHERE
JOIN
GROUP BY
PostGIS
JSONB
GPU-Direct SQL
Log collector
Server
DB/GPU
Server
DB Admin
BI Tools
(Visualization)
AL/ML
(異常検知など)
IoT/M2M
Devices
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
23
Arrowファイルの作り方(4/4)汎用ログコレクタから【開発中】
✓ IoT/M2M機器から受信したログを、直接 Arrow ファイルとして出力
(現在、fluentd向けプラグインを開発中)
✓ Arrowファイルは、高速100Gbネットワークを介してGPU-Direct SQLで
DB/GPUサーバに転送する。
WHERE
JOIN
GROUP BY
PostGIS
JSONB
GPU-Direct SQL
with
NFS-over-RDMA
Log collector
Server
DB/GPU
Server
input plugin
output plugin
高速100Gb
ネットワーク
NFS Server
各種IoT/M2M機器 works in progress
ハナっから
Arrow形式で
書き出す
プラグイン
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
24
Apache Arrowを使うメリット
▌列形式の構造化データ
 分析処理の際に、被参照列のみを読み出す事が容易であるため、
大量データの分析時にボトルネックとなる I/O ワークロードの軽減に繋がる。
※ 特に、センサデータの場合フィールド数が非常に多い事がある。
 固定長データの場合、GPUやSIMD命令でプロセッサの性能を引き出しやすい
構造をしている。
▌インポートが不要
 外部のデータファイルを「そのまま」読み出せるため、わざわざ、
PostgreSQL内部のデータ形式に変換して複製を作る必要はない。
▌長期保管にも適する
 長期保管の際は、zipで固めて安価なストレージに放り込んでおくだけでよい。
 圧縮自体をフォーマットに組み込んだ Parquet よりは一手間増えるが、
検索・分析処理フェーズでの展開処理とのトレードオフ
 ファイル自体がスキーマ定義を内包するため、当時のスキーマ定義散逸したり
して、読めなくなるという事がない。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
25
Apache Arrowを使う上での留意点
▌追記のみ(Insert-only)のデータ形式である事
 RDBMSのような行単位の更新・削除は実装が難しい
 Arrow_Fdwでも追記または全削除(Truncate)にしか対応していない。
追記は簡単
元のフッタを上書きして、新たに
RecordBatch[k+1]のポインタを持つ
フッタを付ければよい。
上書き前のフッタを保持しておき、
元の位置に書き戻してファイルサ
イズを元に戻せば、ロールバック
処理も簡単に実装できる。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
26
PG-Strom + Arrowのベンチマーク(1/3)
PostgreSQL Conference Japan 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
27
■ クエリ例
SELECT sum(lo_revenue), d_year, p_brand1
FROM lineorder, date1, part, supplier
WHERE lo_orderdate = d_datekey
AND lo_partkey = p_partkey
AND lo_suppkey = s_suppkey
AND p_category = 'MFGR#12‘
AND s_region = 'AMERICA‘
GROUP BY d_year, p_brand1
ORDER BY d_year, p_brand1;
customer
3,000万件
(4.0GB)
date1
2500件
(400KB)
part
200万件
(229MB)
supplier
1,000万件
(1.3GB)
lineorder
60億件
(875GB)
NVIDIA A100x1 と PCIe 4.0世代のNVME-SSD 4枚のストライピング構成
SeqRead: 6500MB/s
Intel SSD D7-5510 [3.84TB] x4
6912コア搭載
NVIDIA A100 [40GB; PCI-E]
測定環境
Chassis Supermicro AS-2014CS-TR
CPU AMD EPYC 7402P (24C/2.85GHz)
RAM 128GB [16GB DDR4-3200; ECC] x8
GPU NVIDIA A100 (6912C; 40GB; PCI-E) x1
SSD Intel SSD D7-5510 (U.2; 3.84TB) x4
OS
Red Hat Enterprise Linux 8.4
CUDA 11.5 + driver 495.29.05
DB PostgreSQL v13.x + PG-Strom v3.3devel
PG-Strom + Arrowのベンチマーク(2/3)
 PostgreSQL(CPU並列)より圧倒的に速かった GPU-Direct SQL より圧倒的に速い
GPU-Direct SQL on Apache Arrow
 約681GB、60億件のArrowファイルの処理に要したのは5~20秒程度
 列データ構造とGPUでの並列処理、PCI-E 4.0の広帯域の効果といえる。
17.71 17.97 17.99 16.72 16.66 16.59 14.23 17.61 16.93 17.20 13.91 14.20 14.39
126.51 126.42 128.18 122.74 115.18 128.14 106.98 107.47 115.56 122.51 106.86 107.15 109.75
1189.4
1249.1 1250.2
650.3
447.3
702.7
369.0
514.2
397.9
467.9
308.5 331.3 337.5
0
200
400
600
800
1,000
1,200
Q1_1 Q1_2 Q1_3 Q2_1 Q2_2 Q2_3 Q3_1 Q3_2 Q3_3 Q3_4 Q4_1 Q4_2 Q4_3
Number
of
Rows
processes
per
Second
[million
rows/sec]
Star Schema Benchmark (SF=999; 6.0 billion rows)
CPU: AMD EPYC 7402P (24C; 2.8GHz), GPU: NVIDIA A100 [PCI-E; 40GB], SSD: Intel D7-5510 (U.2; 3.84TB) x4
PostgreSQL v13.4 PG-Strom v3.3devel [Heap] PG-Strom v3.3devel [Arrow]
681GB中89GBのみを読み出し。
毎秒12億行相当を処理している。
本来はQ2_1やQ2_3程度まで出るハズだが、
オプティマイザの「やらかし」により、
やや応答時間が伸びている。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
28
ところで、、、
[kaigai@magro ~]$ pg2arrow -d postgres ¥
-c "select * from lineorder ¥
where lo_orderpriority in ('1-URGENT','2-HIGH','3-MEDIUM’) ¥
order by lo_orderdate" ¥
-o /tmp/flineorder.arrow --progress ¥
--stat=lo_orderdate
RecordBatch[0]: offset=1712 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[1]: offset=268438792 length=268437080 (meta=920, body=268436160) nitems=1303085
RecordBatch[2]: offset=536875872 length=268437080 (meta=920, body=268436160) nitems=1303085
: : : : : :
さっきのコレ、覚えてますか?
✓ --stat オプションはmin/max統計情報の採取を有効にする。
どういうことか?
✓ 各RecordBatchが保持する約130件ごとに、lo_orderdate列の最大値/最小値を
それぞれ記録し、カスタムメタデータとして埋め込んでおく。
✓ 最大値/最小値が分かれば、明らかに検索条件に合致しないRecordBatchを
読み飛ばすことができる。
✓ ログデータのタイムスタンプには効果が高い。
コレ
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
29
独自機能:min/max統計情報(1/3)
$ python3 -q
>>> import pyarrow as pa
>>> X = pa.RecordBatchFileReader('/tmp/flineorder.arrow’)
>>> X.num_record_batches
9
>>> X.schema
lo_orderkey: decimal(30, 8)
lo_linenumber: int32
lo_custkey: decimal(30, 8)
lo_partkey: int32
lo_suppkey: decimal(30, 8)
lo_orderdate: int32
-- field metadata --
min_values: '19920101,19921018,19930804,19940521,19950307,19951223,1996' + 22
max_values: '19921018,19930804,19940521,19950307,19951223,19961009,1997' + 22
lo_orderpriority: fixed_size_binary[15]
lo_shippriority: fixed_size_binary[1]
lo_quantity: decimal(30, 8)
lo_extendedprice: decimal(30, 8)
lo_ordertotalprice: decimal(30, 8)
lo_discount: decimal(30, 8)
lo_revenue: decimal(30, 8)
lo_supplycost: decimal(30, 8)
: :
CustomMetadataフィールドを利用して、統計情報を Arrow ファイルに埋め込む。
lo_orderdate列のRecordBatchごと最大値/最小値を、
カスタムメタデータとして埋め込んでいる。
未対応のアプリケーションの場合、単純に無視される。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
30
独自機能:min/max統計情報(2/3)
postgres=# import foreign schema flineorder
from server arrow_fdw
into public options (file '/tmp/flineorder.arrow');
IMPORT FOREIGN SCHEMA
postgres=# explain (analyze, costs off)
select count(*),sum(lo_revenue)
from flineorder
where lo_orderdate between 19930101 and 19931231;
QUERY PLAN
-----------------------------------------------------------------------------------------------------
Aggregate (actual time=36.967..36.969 rows=1 loops=1)
-> Custom Scan (GpuPreAgg) on flineorder (actual time=36.945..36.950 rows=1 loops=1)
Reduction: NoGroup
Outer Scan: flineorder (actual time=10.693..20.367 rows=2606170 loops=1)
Outer Scan Filter: ((lo_orderdate >= 19930101) AND (lo_orderdate <= 19931231))
Rows Removed by Outer Scan Filter: 966184
referenced: lo_orderdate, lo_revenue
Stats-Hint: (lo_orderdate >= 19930101), (lo_orderdate <= 19931231) [loaded: 2, skipped: 7]
files0: /tmp/flineorder.arrow (read: 206.00MB, size: 2120.69MB)
Planning Time: 0.175 ms
Execution Time: 42.146 ms
(11 rows)
明らかに検索条件に合致しない RecordBatch を読み飛ばしているのが分かる
コレ
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
31
独自機能:min/max統計情報(3/3)
select sum(lo_extendedprice*lo_discount)
from lineorder,date1
where lo_orderdate = d_datekey
and d_year = 1993
and lo_discount between 1 and 3
and lo_quantity < 25;
統計情報を活用するよう、SSBMクエリQ1_1を微修正
0
50
100
150
200
250
300
350
400
PostgreSQL v13.4 PG-Strom v3.3devel [Heap] PG-Strom v3.3devel [Arrow] PG-Strom v3.3devel
[Arrow+min/max統計値]
356.29
58.59
5.19 1.78
クエリ応答時間
[秒]
select sum(lo_extendedprice*lo_discount)
from lineorder
where lo_orderdate between 19930101
and 19931231
and lo_discount between 1 and 3
and lo_quantity < 25;
GPU-Direct SQLの効果
6倍の高速化
Apache Arrowの効果
10倍の高速化
min/max統計情報の効果
3倍の高速化
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
32
実ワークロードにおける効果
~国立天文台様との共同検証~
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
33
背景
▌観測データの管理
 高解像度の画像データには、一意なIDを
付けてBLOBとしてファイルシステムに保存。
 画像とそこに写る無数の天体の特徴を表す
メタデータはPostgreSQLに保存し、研究者は、
画像や天体情報に紐づいた様々な属性に
基づいて検索を行う事ができる。
 天体メタデータは数千列×数億~数十億行の規模。
 画像メタデータだけでもかなりのサイズ。
国立天文台 ハワイ観測所 すばる望遠鏡
(画像提供:国立天文台様)
観測データ
(高解像度画像)
観測データ
(画像と天体のメタデータ)
様々な検索条件で
画像データを抽出
研究者
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
34
課題 - 検索時間がものすごくかかる
▌要因① データサイズが巨大
 いくつかのテーブルに分割されているとはいえ、1.0TB~3.0TB 程度のテーブルに
対して、複雑な検索条件(= インデックスの効かない)で問い合わせる。
➔ テーブルのスキャンに要する I/O 負荷が大きすぎる。
▌要因② 列数が多すぎる
 メタデータに含まれる列数が2000を越える。
 PostgreSQLのHeapテーブルの制限値は MaxHeapAttributeNumber (=1600)
➔ 複数のテーブルに水平分割し、実行時に JOIN せざるを得ない。
一回の検索に数十分~数時間を要し、研究活動に支障を生じる
1,556
7,160
14,310
1,859
96
10,391
Q1 Q2 Q3 Q4 Q6 Q7
検索クエリ応答時間
[sec]
国立天文台様 検索クエリ応答時間(PostgreSQL v11; 1-node)
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
35
検証シナリオ(1/3)
▌課題の分析
 2000以上の列定義を有するものの、当然、検索クエリで同時に参照する
列ははるかに少ない。
➔列形式データであれば、1~2%程度を読み出すだけで十分では?
 テーブルを水平分割するのは、PostgreSQL Heapテーブルの列数制限に
起因するワークアラウンド
➔では、より多くの列を定義できるデータ形式を使用すれば?
 観測データの更新/削除はあるか?
➔ ない。日々の新しい観測データを追加する事はある。
▌解決策
 現在、PostgreSQLで管理している観測データを pg2arrow を用いて
Arrowファイルに変換し、それに対して同一の検索クエリを実行する。
観測データをArrow化し、データサイズおよび列数制限に関わる
問題を解消した上で、GPUによる並列処理を適用
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
36
検証シナリオ(2/3)
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
37
NVME-SSDx4 (計4.0TB) に対して、GPUx1をPCI-SW経由で直結させる構成
NVIDIA A100
(PCI-E; 40GB) x2
PCI-SW PCI-SW
NVME
HCA
A100
GPU0
A100
GPU1
NVME
HCA
PCI-SW PCI-SW
NVME-SSD1
NVME-SSD2
NVME-SSD3
NVME-SSD4
NVME-SSD5
NVME-SSD6
NVME-SSD7
NVME-SSD8
NVME
HCA
CPU2
Intel DC P4510
(1.0TB; U.2) x8
4
of
PCI-E
3.0
x4
SSD-A
SSD-B
SSD-C
SSD-D
Intel DC P4500
(1.0TB; U.2) x4
Intel DC P4500
(1.0TB; U.2) x4
作業用低速SSD
(4.0TB; U.2) x4
CPU1
PostgreSQL
テーブル
検証シナリオ(3/3)
• Arrow形式に列数制限はないため、全ての必要な属性を予めフラット化
• SSD容量の都合で、データ量は約半分に切り下げ。
pdr2_wide
_forced:part2
(1228GB)
[Query-03; Original]
SELECT object_id,
f1.ra,
:
f2.r_psfflux_mag - f2.i_psfflux_mag AS r_i
FROM
pdr2_wide.forced AS f1
LEFT JOIN
pdr2_wide.forced2 AS f2 USING (object_id)
LEFT JOIN
pdr2_wide.meas2 AS m2 USING (object_id)
WHERE f2.i_psfflux_mag < 16.2
:
AND f1.isprimary;
pdr2_wide
_forced:part1
(554GB)
pdr2_wide
_forced:position
(94GB)
pdr2_wide
_meas:part2
(1213GB)
pdr2_wide.forced ビュー pdr2_wide.
forced2 ビュー
pdr2_wide.
meas2 ビュー
データセット:合計3.1TB
[Query-03; PG-Strom]
SELECT object_id,
f1.ra,
:
f2.r_psfflux_mag - f2.i_psfflux_mag AS r_i
FROM
pdr2_arrow_wide
WHERE f2.i_psfflux_mag < 16.2
:
AND f1.isprimary;
public.
pdr2_arrow_wide ビュー
/opt/nvme1/
pdr2_wide.full.arrow
(1464GB)
pg2arrow
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
38
問題①:PostgreSQLの1600列制限について(1/2)
struct HeapTupleHeaderData
{
union
{
HeapTupleFields t_heap;
DatumTupleFields t_datum;
} t_choice;
ItemPointerData t_ctid; /* current TID of this or newer tuple (or a
* speculative insertion token) */
/* Fields below here must match MinimalTupleData! */
uint16 t_infomask2; /* number of attributes + various flags */
uint16 t_infomask; /* various flag bits, see below */
uint8 t_hoff; /* sizeof header incl. bitmap, padding */
/* ^ - 23 bytes - ^ */
bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]; /* bitmap of NULLs */
/* MORE DATA FOLLOWS AT END OF STRUCT */
};
 PostgreSQLの行データは、HeapTupleHeaderData とそれに続く NULL-bitmap + ペイロードの
組み合わせとして表現されている。
 ペイロード部分は (char *)((char *)htup + htup->t_hoff) で高速に参照できるが、
t_hoffは8bit変数かつ64bitアラインなので、最大でも +248 でペイロードが始まる。
 ヘッダは最低23バイト。OIDが4バイトを取る可能性があるため、NULL-bitmapの最大長は
248 - 23 - 4 = 221byte = 1768bit となる。
将来の拡張可能性など多少のマージンを考慮し、列数上限が1600と定義されている。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
39
問題①:PostgreSQLの1600列制限について(2/2)
▌pg2arrowで1600列を越えるArrowファイルを生成する
 SELECT ... FROM t1 NATURAL JOIN t2 ...; で結果が制限値を越えるとエラー。
➔ DB側で実行できないなら、クライアント側でJOINを実行すればよい。
$ pg2arrow -d postgres -o /tmp/test1.arrow ¥
-c ‘SELECT * FROM t_a’ ¥
--inner-join 'SELECT b1,b2,b3,b4 FROM t_b WHERE $(id) = id'
 メインのSQLコマンド(-cオプション)の結果からid列を取り出し、その値を$(id)と
置き換えて --inner-join コマンドを実行。その結果と結合して Arrow ファイルを生成する。
 詳しくは、海外の俺メモ:Pg2Arrowに『ぐるぐるSQL』モードをつけてみた。
https://kaigai.hatenablog.com/entry/2021/02/09/011940
▌1600列を越える外部テーブルを定義する
 本来は HeapTuple 形式の制限なので、外部テーブルに対しては無意味な制限ではあるが…。
 通常の CREATE FOREIGN TABLE で1600列を越える外部テーブルを定義しようとすると、
エラーが発生して怒られが発生する。
➔ 直接、システムカタログを更新してしまえば良いじゃないか。
=# pgstrom.arrow_fdw_import_file(‘f_mytable’, -- relation name
‘/tmp/mytable.arrow’); -- file name
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
40
問題②:contrib/{cube, earthdistance} モジュール
▌PG-Stromでの未対応データ型/演算子
 一部の検索条件が {cube, earthdistance} モジュールに由来する型・演算子を
用いている。
SELECT object_id, ...
FROM t_observation
WHERE coord <@ ‘(123.456, ...., 456.789)’::cube
AND ...;
 coord列 ... earthdistance型の列
 <@演算子 ... {cube, earthdistance} 型同士の包含関係を判定する。
▌Apache Arrowでの cube データ型の扱い
 Apache Arrowの基本データ型ではない。
 CustomMetadataを利用し、’pg_type=cube’ を付加した Binary 型としてダンプしている。
 他に類似の対応:inet型、macaddr型
▌GPUで利用できる演算子の扱い
 特定ワークロードのため、専用演算子のサポートを追加する事になると、
PG-Stromのコードベースに収拾がつかなくなってしまう。
 『PG-Stromに対する拡張モジュール』で、GPU演算子・関数を追加できるように。
➔ 細かいAPIを調整の上、v4.0では正式機能化の予定。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
41
検証:ベンチマーク結果
✓ 対PostgreSQLで100~350倍程度の実行性能を記録
✓ クエリの種類によらず、ほぼ計算量とI/O量に比例した応答時間を記録
➔ 「数時間」が「十数秒」レベルに改善している。
Q1 Q2 Q3 Q4 Q6 Q7
PostgreSQL v12.5 651.66 2769.61 4968.67 712.17 46.70 3444.27
Arrow_Fdw (only CPU) 462.61 467.41 467.22 471.26 302.47 512.03
PG-Strom (GPUDirect) 6.28 12.65 14.28 8.52 1.13 13.62
0
1,000
2,000
3,000
4,000
5,000
Query
Response
Time
[sec] Benchmark results on the observation data at the National Astronomical Observatory of Japan
103倍 218倍 347倍 83倍 41倍 252倍
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
42
検証まとめ
▌結論
 元々の課題
✓ データサイズの巨大化に伴う、検索時の
I/O 負荷の増大
✓ PostgreSQLの列数制限に伴う JOIN の発生
➔ これらは、Apache Arrow の適用により
大幅な負荷軽減に。
(「数時間」➔「数分」レベル)
 GPUの適用と並列処理の効果により、
さらに「十数秒」レベルにまで
応答時間を短縮する事を実証。
▌望ましいシステム構成
 この結果を踏まえると、次のような
システム構成が望ましいと考える。
✓ 観測データが蓄積するたびに、適宜、
PostgreSQLテーブルから、Arrowファイルに
移送する。
✓ 検索時は(継承などを使い)両方のテーブ
ルを同時に検索する。
pg2arrowを用いるなどして、
定期的に PostgreSQL テーブル
の内容を、Arrowファイルに
追記する。
既存の測定データテーブル群
新規)Arrowファイルを
マップした外部テーブル
測定データ 検索クエリ
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
43
まとめ
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
44
まとめ
▌IoT/M2MログデータにApache Arrowを使うと…。
 列データなので、必要最小限のデータを読み出すだけで検索・分析が可能。
 特に、GPUやSIMD命令の処理性能を最大化するようなデータ配置。
 外部から「データを取り込む」場合でも、ファイルコピーのみで完了。
 一方で、更新/削除はできないので『追記のみ(Insert-only)』なデータで
ある事が必須。(トランザクション向きではない)
▌PG-Strom (Arrow_Fdw) を使うと…?
 GPU-Direct SQLで「ほぼほぼH/W限界値」な処理速度を実現できる。
 使い慣れたSQLで操作でき、他のデータと組み合わせた分析も容易。
 独自機能の min/max統計情報 は、列だけでなく、行方向の絞り込みを
可能にするインデックスとして機能する。
 pg2arrow, pcap2arrowなど。fluentd向けArrow出力プラグインも開発中。
▌実際のワークロードでの検証
 特にフィールド数の多いセンサデータであり、Arrow化の効果が極めて大。
 GPUの並列処理効果も併せ、元の処理速度から比較して最大350倍の高速化。
➔ センサデータの検索・分析にPG-Strom + Arrow が有効であることを実証した。
Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理
45
オモシロ技術を、カタチにする。

More Related Content

What's hot

20191115-PGconf.Japan
20191115-PGconf.Japan20191115-PGconf.Japan
20191115-PGconf.JapanKohei KaiGai
 
20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdwKohei KaiGai
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCacheKohei KaiGai
 
20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0Kohei KaiGai
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8Kohei KaiGai
 
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望Kohei KaiGai
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpuKohei KaiGai
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
 
20170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#120170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#1Kohei KaiGai
 
SQL+GPU+SSD=∞ (Japanese)
SQL+GPU+SSD=∞ (Japanese)SQL+GPU+SSD=∞ (Japanese)
SQL+GPU+SSD=∞ (Japanese)Kohei KaiGai
 
20170329_BigData基盤研究会#7
20170329_BigData基盤研究会#720170329_BigData基盤研究会#7
20170329_BigData基盤研究会#7Kohei KaiGai
 
An Intelligent Storage?
An Intelligent Storage?An Intelligent Storage?
An Intelligent Storage?Kohei KaiGai
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)NTT DATA Technology & Innovation
 
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...Insight Technology, Inc.
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstromKohei KaiGai
 
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]Kohei KaiGai
 
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigDataKohei KaiGai
 
20180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #1020180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #10Kohei KaiGai
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】Kohei KaiGai
 
20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDBKohei KaiGai
 

What's hot (20)

20191115-PGconf.Japan
20191115-PGconf.Japan20191115-PGconf.Japan
20191115-PGconf.Japan
 
20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache
 
20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8
 
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpu
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
20170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#120170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#1
 
SQL+GPU+SSD=∞ (Japanese)
SQL+GPU+SSD=∞ (Japanese)SQL+GPU+SSD=∞ (Japanese)
SQL+GPU+SSD=∞ (Japanese)
 
20170329_BigData基盤研究会#7
20170329_BigData基盤研究会#720170329_BigData基盤研究会#7
20170329_BigData基盤研究会#7
 
An Intelligent Storage?
An Intelligent Storage?An Intelligent Storage?
An Intelligent Storage?
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
 
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom
 
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
 
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
 
20180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #1020180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #10
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
 
20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB
 

Similar to 20211112_jpugcon_gpu_and_arrow

20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_FdwKohei KaiGai
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014Shigeru Hanada
 
外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張Shigeru Hanada
 
Pgx user meeting_20170602
Pgx user meeting_20170602Pgx user meeting_20170602
Pgx user meeting_20170602Nao Oec
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureRyota Watabe
 
The overview of Server-ide Bulk Loader
 The overview of Server-ide Bulk Loader The overview of Server-ide Bulk Loader
The overview of Server-ide Bulk LoaderTreasure Data, Inc.
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extensionToshi Harada
 
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化gree_tech
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsKohei KaiGai
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速するKohei KaiGai
 
DB TechShowcase Tokyo - Intelligent Data Platform
DB TechShowcase Tokyo - Intelligent Data PlatformDB TechShowcase Tokyo - Intelligent Data Platform
DB TechShowcase Tokyo - Intelligent Data PlatformDaiyu Hatakeyama
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
A Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on TezA Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on TezGw Liu
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSNoriyoshi Shinoda
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5Toshi Harada
 
ビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年versionビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年versionTetsutaro Watanabe
 
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善株式会社MonotaRO Tech Team
 

Similar to 20211112_jpugcon_gpu_and_arrow (20)

20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張
 
Pgx user meeting_20170602
Pgx user meeting_20170602Pgx user meeting_20170602
Pgx user meeting_20170602
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
 
The overview of Server-ide Bulk Loader
 The overview of Server-ide Bulk Loader The overview of Server-ide Bulk Loader
The overview of Server-ide Bulk Loader
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
 
R -> Python
R -> PythonR -> Python
R -> Python
 
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する
 
DB TechShowcase Tokyo - Intelligent Data Platform
DB TechShowcase Tokyo - Intelligent Data PlatformDB TechShowcase Tokyo - Intelligent Data Platform
DB TechShowcase Tokyo - Intelligent Data Platform
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
A Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on TezA Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on Tez
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5
 
ビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年versionビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年version
 
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
 

More from Kohei KaiGai

20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_HistoryKohei KaiGai
 
20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_APIKohei KaiGai
 
20210928_pgunconf_hll_count
20210928_pgunconf_hll_count20210928_pgunconf_hll_count
20210928_pgunconf_hll_countKohei KaiGai
 
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_IndexKohei KaiGai
 
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGISKohei KaiGai
 
20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_ProcessingKohei KaiGai
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_BetaKohei KaiGai
 
20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGaiKohei KaiGai
 
20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - EnglishKohei KaiGai
 
20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA UnconferenceKohei KaiGai
 
20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQL20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQLKohei KaiGai
 
20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multiKohei KaiGai
 
20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdwKohei KaiGai
 
20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_ENKohei KaiGai
 
20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JPKohei KaiGai
 

More from Kohei KaiGai (15)

20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History
 
20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API
 
20210928_pgunconf_hll_count
20210928_pgunconf_hll_count20210928_pgunconf_hll_count
20210928_pgunconf_hll_count
 
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
 
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS
 
20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
 
20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai
 
20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English
 
20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference
 
20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQL20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQL
 
20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi
 
20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw
 
20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN
 
20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP
 

Recently uploaded

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (9)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

20211112_jpugcon_gpu_and_arrow

  • 2. 自己紹介/会社紹介 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 3 会社概要  商号 ヘテロDB株式会社  創業 2017年7月4日  拠点 品川区北品川5-5-15 大崎ブライトコア4F  事業内容 高速データ処理製品の開発・販売 GPU&DB領域の技術コンサルティング ヘテロジニアスコンピューティング技術をデータベース領域に適用し、 誰もが使いやすく、シンプルで高速な大量データ分析基盤を提供する。 代表者プロフィール  海外 浩平(KaiGai Kohei)  OSS開発者コミュニティにおいて、PostgreSQLやLinux kernelの 開発に15年以上従事。主にセキュリティ・FDW等の分野で PostgreSQLのメインライン機能の強化に貢献。  IPA未踏ソフト事業において“天才プログラマー”認定 (2006)  GPU Technology Conference Japan 2017でInception Awardを受賞
  • 3. PostgreSQLの各種インフラ PG-Strom - GPUを用いてSQLを並列処理する SQL パーサ SQL オプティマイザ トランザクション 共有バッファ 各種関数・演算子 プロセス間通信 実行結果 GPUコード生成 代替実行計画作成 PG-Stromのインフラ機能 GPUデバイス管理 JITコンパイル GPU- Direct SQL データの読み出し GPUカーネル実行 SQL エグゼキュータ PG-Strom拡張モジュール Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 4
  • 4. GPUとはどんなプロセッサなのか? Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 5 主にHPC分野で実績があり、機械学習用途で爆発的に普及 NVIDIA A100 スーパーコンピュータ (東京工業大学 TSUBAME3.0) CG(Computer Graphics) 機械学習 数千コアの並列処理ユニット、TB/sのスループットに達する広帯域メモリを ワンチップに実装した半導体デバイス。 “同じ計算を大量のデータに並列実行” を最も得意とする シミュレーション
  • 5. GPU-Direct SQL(1/4) PCI-E Bus Buffer Copy Buffer Copy SCAN JOIN GROUP BY Storage Block Read 大量の ”ゴミデータ” も含む Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 6
  • 6. GPU-Direct SQL(2/4) P2P-DMAを利用し、NVME-SSDとGPUを直結してデータ転送 PCI-E Bus SCAN JOIN GROUP BY Storage Block Read by NVIDIA GPUDirect Storage P2P-DMA P2P-DMA : Peer-to-Peer Direct Memory Access Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 7
  • 7. GPU-Direct SQL(3/4) P2P-RDMAを用いて、他ノードのストレージから直接読み出しも可 PCI-E Bus Storage Block Read by NVIDIA GPUDirect Storage PCI-E Bus SCAN JOIN GROUP BY 100Gb Network P2P-RDMA P2P-RDMA : Peer-to-Peer Remote Direct Memory Access Storage Server DB/GPU Server Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 8
  • 8. GPU-Direct SQL(4/4) 0 5,000 10,000 15,000 20,000 0 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400 Total Storage Read Throughput [MB/s] Elapsed Time [sec] Query Execution with GPU-Direct SQL nvme3 nvme2 nvme1 nvme0 Query Execution with Filesystem on PostgreSQL Heap Tables 2,648 2,687 2,690 2,500 2,491 2,480 2,128 2,633 2,531 2,572 2,079 2,124 2,152 18,915 18,902 19,164 18,351 17,220 19,158 15,995 16,068 17,278 18,317 15,978 16,020 16,410 0 5,000 10,000 15,000 20,000 Q1_1 Q1_2 Q1_3 Q2_1 Q2_2 Q2_3 Q3_1 Q3_2 Q3_3 Q3_4 Q4_1 Q4_2 Q4_3 Query Execution Throughput [MB/s] Star Schema Benchmark (SF=999; 875GB) CPU: AMD EPYC 7402P (24C; 2.8GHz), GPU: NVIDIA A100 [PCI-E; 40GB], SSD: Intel D7-5510 (U.2; 3.84TB) x4 PostgreSQL v13.4 PG-Strom v3.3devel [Heap] Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 9
  • 9. ココまでが前振りです Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 10
  • 10. 大量データの処理を考える(1/3) Manufacturing Home electronics Logistics Mobile WHERE JOIN GROUP BY PostGIS JSONB GPU-Direct SQL Log collector Server DB/GPU Server DB Admin BI Tools (Visualization) AL/ML (異常検知など) IoT/M2M Devices Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 11
  • 11. 大量データの処理を考える(2/3) ▌ワークロードの特性  多くの場合、テーブルのフルスキャンを伴う。  テーブル単位のデータ分割が一般的(パーティションなど)  ストレージからの読み出し速度で律速 ▌どうする?  列指向データの利用 … 参照しないデータを読み出さない 検索・集計処理がツラい…。 Big Table Big Data Summary, Report Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 12
  • 12. 大量データの処理を考える(3/3) ▌ワークロードの特性  大量の元データを読み出して、DBの内部形式に変換してテーブルへ書き込み。  データ形式を変換するCPU、ストレージへの書き込み速度で律速  並列度を上げにくいことも多い(順次読み出し前提のデータ形式) ▌どうする?  外部データを “そのまま” 読み出す … インポート自体の必要性をなくす そもそもDBへのインポートもツラい…。 Big Table Big Data Summary, Report Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 13
  • 13. Apache Arrowデータ形式(1/3) ▌列指向の構造化データ形式  被参照列のみ読み出す(= I/O量の削減)が可能  データが隣接しているため、SIMD命令やGPUでの処理性能を引き出しやすい ▌多くのビッグデータ系OSSで対応が進んでいる  SparkやDrill、Python(PyArrow)など。PG-Strom (Arrow_Fdw) もその一つ。 ▌留意点  更新はほぼ不可能。追記のみ(Insert-Only)と考えた方がよい PG-Strom (Arrow_Fdw) Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 14
  • 14. Apache Arrowデータ形式(2/3) Header “ARROW1¥0¥0” Schema Definition Footer Schema Definition Custom Metadata Apache Arrow File RecordBatch-1 RecordBatch-k RecordBatch-N Terminator “ARROW1” RecordBatch: 長さの同じ配列を 列ごとに寄せ集め たもの。 Schema Definition: 列名やデータ型、属性が 列の数だけ列挙されている。 テーブル定義に相当する。 A列 B列 C列 D列 物理的な(ファイル上の)レイアウト A列 NULL-Bitmap A列 Values-array B列 NULL-Bitmap B列 Values-index B列 Values-body C列 NULL-Bitmap C列 Values-array D列 NULL-Bitmap D列 Values-array Record Batch-k SELECT SUM(D) FROM f_arrow_tbl WHERE B LIKE ‘%abc%’; 被参照列のみの ロードが容易 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 15
  • 15. Apache Arrowデータ形式(3/3) 補足:可変長データ B[0] = ‘dog’ B[1] = ‘panda’ B[2] = NULL B[3] = ‘capybara’ B[4] = ‘cat’ B列 Null-Bitmap B列 Values-Index B列 Values-Body 1 1 0 3 ‘d’ ‘o’ ‘g’ ‘p’ ‘a’ ‘n’ ‘d’ ‘a’ ‘c’ ‘a’ ‘p’ ‘y’ ‘b’ ‘a’ ‘r’ ‘a’ 8 8 ‘c’ ‘a’ ‘t’ 0 1 1 16 19 文字列長 3-0=3 文字列長 8-3=5 文字列長 16-8=8 文字列長 19-16=3 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 16
  • 16. Apache Arrowならデータのインポートが不要 ✓ PostgreSQLのFDW機能(Arrow_Fdw)を使用して、 Arrowファイルに紐付けた外部テーブル(Foreign Table)を定義する。 ✓ データの移動を伴わないため、一瞬で完了する。 (Arrowファイル自体の移動は OS 上のファイルコピー) CSV Files PostgreSQL Table INSERT INTO COPY … FROM Foreign Table mapping by IMPORT FOREIGN SCHEMA 複製 ✓ CSVなど外部ファイルを、読み出し、データ形式を変換し、 PostgreSQLのテーブルに複製を書き込むことになる。 ✓ データの件数が多い場合、非常に時間を要する処理になる。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 17
  • 17. Arrow_Fdwによる外部テーブルの定義(1/3) postgres=# drop foreign table f_mytest ; DROP FOREIGN TABLE postgres=# CREATE FOREIGN TABLE f_mytest ( id int, ts timestamp, x float8, y text, z numeric ) SERVER arrow_fdw OPTIONS (file '/tmp/mytest.arrow'); CREATE FOREIGN TABLE postgres=# SELECT * FROM f_mytest; id | ts | x | y | z ----+----------------------------+--------------------+--------------+--------- 1 | 2022-08-02 00:34:44.210589 | 77.4344383633856 | 65ac7f6 | 38.6218 2 | 2019-05-11 03:06:16.353798 | 95.33235230265761 | 9105319395 | 51.8267 3 | 2015-01-04 11:02:25.66779 | 93.67415248121794 | b56930f7834 | 84.9033 : : : : : 24 | 2022-09-24 06:26:02.058316 | 17.668632938372266 | c5e35 | 55.9739 25 | 2016-08-08 18:16:12.248363 | 92.2211769466387 | fa889dd51692 | 19.246 (25 rows) Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 18
  • 18. Arrow_Fdwによる外部テーブルの定義(2/3) postgres=# import foreign schema f_mytest from server arrow_fdw into public options (file '/tmp/mytest.arrow'); IMPORT FOREIGN SCHEMA postgres=# ¥d f_mytest Foreign table "public.f_mytest" Column | Type | Collation | Nullable | Default | FDW options --------+-----------------------------+-----------+----------+---------+------------- id | integer | | | | ts | timestamp without time zone | | | | x | double precision | | | | y | text | | | | z | numeric | | | | Server: arrow_fdw FDW options: (file '/tmp/mytest.arrow’) IMPORT FOREIGN SCHEMAで、Arrowファイルのスキーマ定義ごと取り込むのが楽 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 19
  • 19. Arrow_Fdwによる外部テーブルの定義(3/3) $ python3 -q >>> import pyarrow as pa >>> X = pa.RecordBatchFileReader('/tmp/mytest.arrow') >>> X.schema id: int32 -- field metadata -- min_values: '1' max_values: '25' ts: timestamp[us] x: double y: string z: decimal(30, 8) -- schema metadata -- sql_command: 'SELECT * FROM mytest' >>> X.get_record_batch(0).to_pandas() id ts x y z 0 1 2022-08-02 00:34:44.210589 77.434438 65ac7f6 38.62180000 1 2 2019-05-11 03:06:16.353798 95.332352 9105319395 51.82670000 2 3 2015-01-04 11:02:25.667790 93.674152 b56930f7834 84.90330000 3 4 2017-02-10 21:05:26.631906 90.553723 2103 86.78170000 : : : : : : 22 23 2019-05-19 02:06:38.668702 47.295458 6e00a6e037ad 11.02260000 23 24 2022-09-24 06:26:02.058316 17.668633 c5e35 55.97390000 24 25 2016-08-08 18:16:12.248363 92.221177 fa889dd51692 19.24600000 ファイル形式は共通なので、当然、Pythonでも普通に読める Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 20
  • 20. Arrowファイルの作り方(1/4) RDBMSから [kaigai@magro ~]$ pg2arrow -d postgres ¥ -c "select * from lineorder ¥ where lo_orderpriority in ('1-URGENT','2-HIGH','3-MEDIUM’) ¥ order by lo_orderdate" ¥ -o /tmp/flineorder.arrow --progress ¥ --stat=lo_orderdate RecordBatch[0]: offset=1712 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[1]: offset=268438792 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[2]: offset=536875872 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[3]: offset=805312952 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[4]: offset=1073750032 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[5]: offset=1342187112 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[6]: offset=1610624192 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[7]: offset=1879061272 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[8]: offset=2147498352 length=76206296 (meta=920, body=76205376) nitems=369928 $ ls -lh /tmp/flineorder.arrow -rw-r--r--. 1 kaigai users 2.1G Oct 12 20:17 /tmp/flineorder.arrow pg2arrowによる PostgreSQL からのダンプ ✓ -c オプションで指定したクエリの実行結果をArrowファイルとして保存 ✓ 単純なダンプと異なり、検索条件を指定したり、ソートやJOINなども可能 ✓ デフォルトで 256MB 毎に RecordBatch を作る(-s オプションで変更可能) ✓ --stat オプションはmin/max統計情報の採取を有効にする。(後述) Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 21
  • 21. Arrowファイルの作り方(2/4) NICから # pcap2arrow -i lo,eno1 -o /tmp/my_packets.arrow -p 'tcp4,udp4,icmp4’ ^C # ls -lh /tmp/my_packets.arrow -rw-r--r--. 1 root root 57K 10月 12 22:19 /tmp/my_packets.arrow $ psql postgres postgres=# import foreign schema my_packets from server arrow_fdw into public options (file '/tmp/my_packets.arrow'); IMPORT FOREIGN SCHEMA postgres=# select timestamp, src_addr, dst_addr, protocol, length(payload) from my_packets; timestamp | src_addr | dst_addr | protocol | length ----------------------------+----------------+-----------------+----------+-------- 2021-10-12 13:18:22.684989 | 192.168.77.72 | 192.168.77.106 | 6 | 6 2021-10-12 13:18:31.531827 | 192.168.77.72 | 192.168.77.106 | 6 | 36 2021-10-12 13:19:00.000605 | 192.168.77.254 | 239.255.255.250 | 17 | 472 2021-10-12 13:19:00.000929 | 192.168.77.254 | 239.255.255.250 | 17 | 448 : : : : : pcap2arrowによるネットワークキャプチャ ✓ -i で指定したネットワークデバイスからパケットをキャプチャし、 Arrowファイルとして書き出す。 ✓ スキーマ構造は -p で指定したプロトコルのヘッダ構造に準ずる。 ✓ PF_RINGドライバを使用しており、50Gbps近辺までのキャプチャまでは実証済。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 22
  • 22. Arrowファイルの作り方(3/4) Manufacturing Home electronics Logistics Mobile WHERE JOIN GROUP BY PostGIS JSONB GPU-Direct SQL Log collector Server DB/GPU Server DB Admin BI Tools (Visualization) AL/ML (異常検知など) IoT/M2M Devices Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 23
  • 23. Arrowファイルの作り方(4/4)汎用ログコレクタから【開発中】 ✓ IoT/M2M機器から受信したログを、直接 Arrow ファイルとして出力 (現在、fluentd向けプラグインを開発中) ✓ Arrowファイルは、高速100Gbネットワークを介してGPU-Direct SQLで DB/GPUサーバに転送する。 WHERE JOIN GROUP BY PostGIS JSONB GPU-Direct SQL with NFS-over-RDMA Log collector Server DB/GPU Server input plugin output plugin 高速100Gb ネットワーク NFS Server 各種IoT/M2M機器 works in progress ハナっから Arrow形式で 書き出す プラグイン Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 24
  • 24. Apache Arrowを使うメリット ▌列形式の構造化データ  分析処理の際に、被参照列のみを読み出す事が容易であるため、 大量データの分析時にボトルネックとなる I/O ワークロードの軽減に繋がる。 ※ 特に、センサデータの場合フィールド数が非常に多い事がある。  固定長データの場合、GPUやSIMD命令でプロセッサの性能を引き出しやすい 構造をしている。 ▌インポートが不要  外部のデータファイルを「そのまま」読み出せるため、わざわざ、 PostgreSQL内部のデータ形式に変換して複製を作る必要はない。 ▌長期保管にも適する  長期保管の際は、zipで固めて安価なストレージに放り込んでおくだけでよい。  圧縮自体をフォーマットに組み込んだ Parquet よりは一手間増えるが、 検索・分析処理フェーズでの展開処理とのトレードオフ  ファイル自体がスキーマ定義を内包するため、当時のスキーマ定義散逸したり して、読めなくなるという事がない。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 25
  • 25. Apache Arrowを使う上での留意点 ▌追記のみ(Insert-only)のデータ形式である事  RDBMSのような行単位の更新・削除は実装が難しい  Arrow_Fdwでも追記または全削除(Truncate)にしか対応していない。 追記は簡単 元のフッタを上書きして、新たに RecordBatch[k+1]のポインタを持つ フッタを付ければよい。 上書き前のフッタを保持しておき、 元の位置に書き戻してファイルサ イズを元に戻せば、ロールバック 処理も簡単に実装できる。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 26
  • 26. PG-Strom + Arrowのベンチマーク(1/3) PostgreSQL Conference Japan 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 27 ■ クエリ例 SELECT sum(lo_revenue), d_year, p_brand1 FROM lineorder, date1, part, supplier WHERE lo_orderdate = d_datekey AND lo_partkey = p_partkey AND lo_suppkey = s_suppkey AND p_category = 'MFGR#12‘ AND s_region = 'AMERICA‘ GROUP BY d_year, p_brand1 ORDER BY d_year, p_brand1; customer 3,000万件 (4.0GB) date1 2500件 (400KB) part 200万件 (229MB) supplier 1,000万件 (1.3GB) lineorder 60億件 (875GB) NVIDIA A100x1 と PCIe 4.0世代のNVME-SSD 4枚のストライピング構成 SeqRead: 6500MB/s Intel SSD D7-5510 [3.84TB] x4 6912コア搭載 NVIDIA A100 [40GB; PCI-E] 測定環境 Chassis Supermicro AS-2014CS-TR CPU AMD EPYC 7402P (24C/2.85GHz) RAM 128GB [16GB DDR4-3200; ECC] x8 GPU NVIDIA A100 (6912C; 40GB; PCI-E) x1 SSD Intel SSD D7-5510 (U.2; 3.84TB) x4 OS Red Hat Enterprise Linux 8.4 CUDA 11.5 + driver 495.29.05 DB PostgreSQL v13.x + PG-Strom v3.3devel
  • 27. PG-Strom + Arrowのベンチマーク(2/3)  PostgreSQL(CPU並列)より圧倒的に速かった GPU-Direct SQL より圧倒的に速い GPU-Direct SQL on Apache Arrow  約681GB、60億件のArrowファイルの処理に要したのは5~20秒程度  列データ構造とGPUでの並列処理、PCI-E 4.0の広帯域の効果といえる。 17.71 17.97 17.99 16.72 16.66 16.59 14.23 17.61 16.93 17.20 13.91 14.20 14.39 126.51 126.42 128.18 122.74 115.18 128.14 106.98 107.47 115.56 122.51 106.86 107.15 109.75 1189.4 1249.1 1250.2 650.3 447.3 702.7 369.0 514.2 397.9 467.9 308.5 331.3 337.5 0 200 400 600 800 1,000 1,200 Q1_1 Q1_2 Q1_3 Q2_1 Q2_2 Q2_3 Q3_1 Q3_2 Q3_3 Q3_4 Q4_1 Q4_2 Q4_3 Number of Rows processes per Second [million rows/sec] Star Schema Benchmark (SF=999; 6.0 billion rows) CPU: AMD EPYC 7402P (24C; 2.8GHz), GPU: NVIDIA A100 [PCI-E; 40GB], SSD: Intel D7-5510 (U.2; 3.84TB) x4 PostgreSQL v13.4 PG-Strom v3.3devel [Heap] PG-Strom v3.3devel [Arrow] 681GB中89GBのみを読み出し。 毎秒12億行相当を処理している。 本来はQ2_1やQ2_3程度まで出るハズだが、 オプティマイザの「やらかし」により、 やや応答時間が伸びている。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 28
  • 28. ところで、、、 [kaigai@magro ~]$ pg2arrow -d postgres ¥ -c "select * from lineorder ¥ where lo_orderpriority in ('1-URGENT','2-HIGH','3-MEDIUM’) ¥ order by lo_orderdate" ¥ -o /tmp/flineorder.arrow --progress ¥ --stat=lo_orderdate RecordBatch[0]: offset=1712 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[1]: offset=268438792 length=268437080 (meta=920, body=268436160) nitems=1303085 RecordBatch[2]: offset=536875872 length=268437080 (meta=920, body=268436160) nitems=1303085 : : : : : : さっきのコレ、覚えてますか? ✓ --stat オプションはmin/max統計情報の採取を有効にする。 どういうことか? ✓ 各RecordBatchが保持する約130件ごとに、lo_orderdate列の最大値/最小値を それぞれ記録し、カスタムメタデータとして埋め込んでおく。 ✓ 最大値/最小値が分かれば、明らかに検索条件に合致しないRecordBatchを 読み飛ばすことができる。 ✓ ログデータのタイムスタンプには効果が高い。 コレ Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 29
  • 29. 独自機能:min/max統計情報(1/3) $ python3 -q >>> import pyarrow as pa >>> X = pa.RecordBatchFileReader('/tmp/flineorder.arrow’) >>> X.num_record_batches 9 >>> X.schema lo_orderkey: decimal(30, 8) lo_linenumber: int32 lo_custkey: decimal(30, 8) lo_partkey: int32 lo_suppkey: decimal(30, 8) lo_orderdate: int32 -- field metadata -- min_values: '19920101,19921018,19930804,19940521,19950307,19951223,1996' + 22 max_values: '19921018,19930804,19940521,19950307,19951223,19961009,1997' + 22 lo_orderpriority: fixed_size_binary[15] lo_shippriority: fixed_size_binary[1] lo_quantity: decimal(30, 8) lo_extendedprice: decimal(30, 8) lo_ordertotalprice: decimal(30, 8) lo_discount: decimal(30, 8) lo_revenue: decimal(30, 8) lo_supplycost: decimal(30, 8) : : CustomMetadataフィールドを利用して、統計情報を Arrow ファイルに埋め込む。 lo_orderdate列のRecordBatchごと最大値/最小値を、 カスタムメタデータとして埋め込んでいる。 未対応のアプリケーションの場合、単純に無視される。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 30
  • 30. 独自機能:min/max統計情報(2/3) postgres=# import foreign schema flineorder from server arrow_fdw into public options (file '/tmp/flineorder.arrow'); IMPORT FOREIGN SCHEMA postgres=# explain (analyze, costs off) select count(*),sum(lo_revenue) from flineorder where lo_orderdate between 19930101 and 19931231; QUERY PLAN ----------------------------------------------------------------------------------------------------- Aggregate (actual time=36.967..36.969 rows=1 loops=1) -> Custom Scan (GpuPreAgg) on flineorder (actual time=36.945..36.950 rows=1 loops=1) Reduction: NoGroup Outer Scan: flineorder (actual time=10.693..20.367 rows=2606170 loops=1) Outer Scan Filter: ((lo_orderdate >= 19930101) AND (lo_orderdate <= 19931231)) Rows Removed by Outer Scan Filter: 966184 referenced: lo_orderdate, lo_revenue Stats-Hint: (lo_orderdate >= 19930101), (lo_orderdate <= 19931231) [loaded: 2, skipped: 7] files0: /tmp/flineorder.arrow (read: 206.00MB, size: 2120.69MB) Planning Time: 0.175 ms Execution Time: 42.146 ms (11 rows) 明らかに検索条件に合致しない RecordBatch を読み飛ばしているのが分かる コレ Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 31
  • 31. 独自機能:min/max統計情報(3/3) select sum(lo_extendedprice*lo_discount) from lineorder,date1 where lo_orderdate = d_datekey and d_year = 1993 and lo_discount between 1 and 3 and lo_quantity < 25; 統計情報を活用するよう、SSBMクエリQ1_1を微修正 0 50 100 150 200 250 300 350 400 PostgreSQL v13.4 PG-Strom v3.3devel [Heap] PG-Strom v3.3devel [Arrow] PG-Strom v3.3devel [Arrow+min/max統計値] 356.29 58.59 5.19 1.78 クエリ応答時間 [秒] select sum(lo_extendedprice*lo_discount) from lineorder where lo_orderdate between 19930101 and 19931231 and lo_discount between 1 and 3 and lo_quantity < 25; GPU-Direct SQLの効果 6倍の高速化 Apache Arrowの効果 10倍の高速化 min/max統計情報の効果 3倍の高速化 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 32
  • 33. 背景 ▌観測データの管理  高解像度の画像データには、一意なIDを 付けてBLOBとしてファイルシステムに保存。  画像とそこに写る無数の天体の特徴を表す メタデータはPostgreSQLに保存し、研究者は、 画像や天体情報に紐づいた様々な属性に 基づいて検索を行う事ができる。  天体メタデータは数千列×数億~数十億行の規模。  画像メタデータだけでもかなりのサイズ。 国立天文台 ハワイ観測所 すばる望遠鏡 (画像提供:国立天文台様) 観測データ (高解像度画像) 観測データ (画像と天体のメタデータ) 様々な検索条件で 画像データを抽出 研究者 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 34
  • 34. 課題 - 検索時間がものすごくかかる ▌要因① データサイズが巨大  いくつかのテーブルに分割されているとはいえ、1.0TB~3.0TB 程度のテーブルに 対して、複雑な検索条件(= インデックスの効かない)で問い合わせる。 ➔ テーブルのスキャンに要する I/O 負荷が大きすぎる。 ▌要因② 列数が多すぎる  メタデータに含まれる列数が2000を越える。  PostgreSQLのHeapテーブルの制限値は MaxHeapAttributeNumber (=1600) ➔ 複数のテーブルに水平分割し、実行時に JOIN せざるを得ない。 一回の検索に数十分~数時間を要し、研究活動に支障を生じる 1,556 7,160 14,310 1,859 96 10,391 Q1 Q2 Q3 Q4 Q6 Q7 検索クエリ応答時間 [sec] 国立天文台様 検索クエリ応答時間(PostgreSQL v11; 1-node) Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 35
  • 35. 検証シナリオ(1/3) ▌課題の分析  2000以上の列定義を有するものの、当然、検索クエリで同時に参照する 列ははるかに少ない。 ➔列形式データであれば、1~2%程度を読み出すだけで十分では?  テーブルを水平分割するのは、PostgreSQL Heapテーブルの列数制限に 起因するワークアラウンド ➔では、より多くの列を定義できるデータ形式を使用すれば?  観測データの更新/削除はあるか? ➔ ない。日々の新しい観測データを追加する事はある。 ▌解決策  現在、PostgreSQLで管理している観測データを pg2arrow を用いて Arrowファイルに変換し、それに対して同一の検索クエリを実行する。 観測データをArrow化し、データサイズおよび列数制限に関わる 問題を解消した上で、GPUによる並列処理を適用 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 36
  • 36. 検証シナリオ(2/3) Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 37 NVME-SSDx4 (計4.0TB) に対して、GPUx1をPCI-SW経由で直結させる構成 NVIDIA A100 (PCI-E; 40GB) x2 PCI-SW PCI-SW NVME HCA A100 GPU0 A100 GPU1 NVME HCA PCI-SW PCI-SW NVME-SSD1 NVME-SSD2 NVME-SSD3 NVME-SSD4 NVME-SSD5 NVME-SSD6 NVME-SSD7 NVME-SSD8 NVME HCA CPU2 Intel DC P4510 (1.0TB; U.2) x8 4 of PCI-E 3.0 x4 SSD-A SSD-B SSD-C SSD-D Intel DC P4500 (1.0TB; U.2) x4 Intel DC P4500 (1.0TB; U.2) x4 作業用低速SSD (4.0TB; U.2) x4 CPU1 PostgreSQL テーブル
  • 37. 検証シナリオ(3/3) • Arrow形式に列数制限はないため、全ての必要な属性を予めフラット化 • SSD容量の都合で、データ量は約半分に切り下げ。 pdr2_wide _forced:part2 (1228GB) [Query-03; Original] SELECT object_id, f1.ra, : f2.r_psfflux_mag - f2.i_psfflux_mag AS r_i FROM pdr2_wide.forced AS f1 LEFT JOIN pdr2_wide.forced2 AS f2 USING (object_id) LEFT JOIN pdr2_wide.meas2 AS m2 USING (object_id) WHERE f2.i_psfflux_mag < 16.2 : AND f1.isprimary; pdr2_wide _forced:part1 (554GB) pdr2_wide _forced:position (94GB) pdr2_wide _meas:part2 (1213GB) pdr2_wide.forced ビュー pdr2_wide. forced2 ビュー pdr2_wide. meas2 ビュー データセット:合計3.1TB [Query-03; PG-Strom] SELECT object_id, f1.ra, : f2.r_psfflux_mag - f2.i_psfflux_mag AS r_i FROM pdr2_arrow_wide WHERE f2.i_psfflux_mag < 16.2 : AND f1.isprimary; public. pdr2_arrow_wide ビュー /opt/nvme1/ pdr2_wide.full.arrow (1464GB) pg2arrow Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 38
  • 38. 問題①:PostgreSQLの1600列制限について(1/2) struct HeapTupleHeaderData { union { HeapTupleFields t_heap; DatumTupleFields t_datum; } t_choice; ItemPointerData t_ctid; /* current TID of this or newer tuple (or a * speculative insertion token) */ /* Fields below here must match MinimalTupleData! */ uint16 t_infomask2; /* number of attributes + various flags */ uint16 t_infomask; /* various flag bits, see below */ uint8 t_hoff; /* sizeof header incl. bitmap, padding */ /* ^ - 23 bytes - ^ */ bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]; /* bitmap of NULLs */ /* MORE DATA FOLLOWS AT END OF STRUCT */ };  PostgreSQLの行データは、HeapTupleHeaderData とそれに続く NULL-bitmap + ペイロードの 組み合わせとして表現されている。  ペイロード部分は (char *)((char *)htup + htup->t_hoff) で高速に参照できるが、 t_hoffは8bit変数かつ64bitアラインなので、最大でも +248 でペイロードが始まる。  ヘッダは最低23バイト。OIDが4バイトを取る可能性があるため、NULL-bitmapの最大長は 248 - 23 - 4 = 221byte = 1768bit となる。 将来の拡張可能性など多少のマージンを考慮し、列数上限が1600と定義されている。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 39
  • 39. 問題①:PostgreSQLの1600列制限について(2/2) ▌pg2arrowで1600列を越えるArrowファイルを生成する  SELECT ... FROM t1 NATURAL JOIN t2 ...; で結果が制限値を越えるとエラー。 ➔ DB側で実行できないなら、クライアント側でJOINを実行すればよい。 $ pg2arrow -d postgres -o /tmp/test1.arrow ¥ -c ‘SELECT * FROM t_a’ ¥ --inner-join 'SELECT b1,b2,b3,b4 FROM t_b WHERE $(id) = id'  メインのSQLコマンド(-cオプション)の結果からid列を取り出し、その値を$(id)と 置き換えて --inner-join コマンドを実行。その結果と結合して Arrow ファイルを生成する。  詳しくは、海外の俺メモ:Pg2Arrowに『ぐるぐるSQL』モードをつけてみた。 https://kaigai.hatenablog.com/entry/2021/02/09/011940 ▌1600列を越える外部テーブルを定義する  本来は HeapTuple 形式の制限なので、外部テーブルに対しては無意味な制限ではあるが…。  通常の CREATE FOREIGN TABLE で1600列を越える外部テーブルを定義しようとすると、 エラーが発生して怒られが発生する。 ➔ 直接、システムカタログを更新してしまえば良いじゃないか。 =# pgstrom.arrow_fdw_import_file(‘f_mytable’, -- relation name ‘/tmp/mytable.arrow’); -- file name Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 40
  • 40. 問題②:contrib/{cube, earthdistance} モジュール ▌PG-Stromでの未対応データ型/演算子  一部の検索条件が {cube, earthdistance} モジュールに由来する型・演算子を 用いている。 SELECT object_id, ... FROM t_observation WHERE coord <@ ‘(123.456, ...., 456.789)’::cube AND ...;  coord列 ... earthdistance型の列  <@演算子 ... {cube, earthdistance} 型同士の包含関係を判定する。 ▌Apache Arrowでの cube データ型の扱い  Apache Arrowの基本データ型ではない。  CustomMetadataを利用し、’pg_type=cube’ を付加した Binary 型としてダンプしている。  他に類似の対応:inet型、macaddr型 ▌GPUで利用できる演算子の扱い  特定ワークロードのため、専用演算子のサポートを追加する事になると、 PG-Stromのコードベースに収拾がつかなくなってしまう。  『PG-Stromに対する拡張モジュール』で、GPU演算子・関数を追加できるように。 ➔ 細かいAPIを調整の上、v4.0では正式機能化の予定。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 41
  • 41. 検証:ベンチマーク結果 ✓ 対PostgreSQLで100~350倍程度の実行性能を記録 ✓ クエリの種類によらず、ほぼ計算量とI/O量に比例した応答時間を記録 ➔ 「数時間」が「十数秒」レベルに改善している。 Q1 Q2 Q3 Q4 Q6 Q7 PostgreSQL v12.5 651.66 2769.61 4968.67 712.17 46.70 3444.27 Arrow_Fdw (only CPU) 462.61 467.41 467.22 471.26 302.47 512.03 PG-Strom (GPUDirect) 6.28 12.65 14.28 8.52 1.13 13.62 0 1,000 2,000 3,000 4,000 5,000 Query Response Time [sec] Benchmark results on the observation data at the National Astronomical Observatory of Japan 103倍 218倍 347倍 83倍 41倍 252倍 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 42
  • 42. 検証まとめ ▌結論  元々の課題 ✓ データサイズの巨大化に伴う、検索時の I/O 負荷の増大 ✓ PostgreSQLの列数制限に伴う JOIN の発生 ➔ これらは、Apache Arrow の適用により 大幅な負荷軽減に。 (「数時間」➔「数分」レベル)  GPUの適用と並列処理の効果により、 さらに「十数秒」レベルにまで 応答時間を短縮する事を実証。 ▌望ましいシステム構成  この結果を踏まえると、次のような システム構成が望ましいと考える。 ✓ 観測データが蓄積するたびに、適宜、 PostgreSQLテーブルから、Arrowファイルに 移送する。 ✓ 検索時は(継承などを使い)両方のテーブ ルを同時に検索する。 pg2arrowを用いるなどして、 定期的に PostgreSQL テーブル の内容を、Arrowファイルに 追記する。 既存の測定データテーブル群 新規)Arrowファイルを マップした外部テーブル 測定データ 検索クエリ Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 43
  • 43. まとめ Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 44
  • 44. まとめ ▌IoT/M2MログデータにApache Arrowを使うと…。  列データなので、必要最小限のデータを読み出すだけで検索・分析が可能。  特に、GPUやSIMD命令の処理性能を最大化するようなデータ配置。  外部から「データを取り込む」場合でも、ファイルコピーのみで完了。  一方で、更新/削除はできないので『追記のみ(Insert-only)』なデータで ある事が必須。(トランザクション向きではない) ▌PG-Strom (Arrow_Fdw) を使うと…?  GPU-Direct SQLで「ほぼほぼH/W限界値」な処理速度を実現できる。  使い慣れたSQLで操作でき、他のデータと組み合わせた分析も容易。  独自機能の min/max統計情報 は、列だけでなく、行方向の絞り込みを 可能にするインデックスとして機能する。  pg2arrow, pcap2arrowなど。fluentd向けArrow出力プラグインも開発中。 ▌実際のワークロードでの検証  特にフィールド数の多いセンサデータであり、Arrow化の効果が極めて大。  GPUの並列処理効果も併せ、元の処理速度から比較して最大350倍の高速化。 ➔ センサデータの検索・分析にPG-Strom + Arrow が有効であることを実証した。 Japan PostgreSQL Conference 2021 - PostgreSQLとArrowとGPUで楽々大量データ処理 45