SlideShare a Scribd company logo
© 2019 Cloudera, Inc. All rights reserved. 1
2020 年 3月
https://github.com/inoue-katsumi
https://katsumiinoue.wordpress.com/
PostgreSQL UDF in Rust@新宿
© 2019 Cloudera, Inc. All rights reserved. 3
自己紹介
• ブログ: https://katsumiinoue.wordpress.com/
• Cloudera: BigData 系OSS {サービス|packaging|サポート}
– Apache {Hadoop|Spark|Impala|…}
• コントロールプレーン系担当
– 管理、監視
– メトリック
– 認証認可
– 開発ツール
© 2019 Cloudera, Inc. All rights reserved. 4
PostgreSQL UDFって?
• PostgreSQL拡張の中の一つの種類
• UDF == User Defined Function、ユーザー定義関数
• 実体は共有ライブラリで
配置されサーバー側で
ロードされる
• DBアクセスドライバーや
ORM(例:Diesel)ではない
– 右のPDFは次スライド
参照
© 2019 Cloudera, Inc. All rights reserved. 5
実装その1
• 最も本格的な実装か。
• 左下はPDFプレゼン資料
© 2019 Cloudera, Inc. All rights reserved. 6
実装その2、3
• 6年前のおそらく最初の実装 • 今回試したもの
© 2019 Cloudera, Inc. All rights reserved. 7
最終結果 #1
時間あれば後でデモします
PostgreSQLバージョンt
SQL CLIツール
Postgres server process
DLL 8個
© 2019 Cloudera, Inc. All rights reserved. 8
最終結果 #2
時間あれば後でデモします
Rust UDF呼び出し.
“SELECT 3+1” と同じ(笑
実装が入っているdynlib
© 2019 Cloudera, Inc. All rights reserved. 9
最終結果 #3
時間あれば後でデモします
実装が入っている別の
DLL(dylib)が新しくロード
される
© 2019 Cloudera, Inc. All rights reserved. 10
最終結果 #4 パフォーマンス比較
時間あれば後でデモします
• 200万行データで (列1)+(列2)+(列3)
• ほぼ同じ
– Debug build だと18% ぐらいのオーバーヘッドあり
© 2019 Cloudera, Inc. All rights reserved. 11
他の言語での実装
• 右: C言語
– マクロ多用
• 左下: PL/Python
– PL/Python自体がExtension
© 2019 Cloudera, Inc. All rights reserved. 12
Rust ソース
© 2019 Cloudera, Inc. All rights reserved. 13
パニック処理
• SIGSEGV などが発生してもPostgreSQL
サーバープロセスを落とさない。
• 割り算での divide_by_zero は明示的に
例外処理しなくても一応問題無さそう。
/// my divide by 0 test
#[pg_extern]
fn divide_six(value: i32) -> i32 {
(6 / value)
}
© 2019 Cloudera, Inc. All rights reserved. 14
パニックに対応していない場合の結果
• DBセッションがabortするのでトランザクションがCOMMITされず再実行
が必要になる。
• 以下がGithub issuesに報告されています。
© 2019 Cloudera, Inc. All rights reserved. 15
パニック系動作確認 #1
pg_extend_rs_test_db=# create table tbl_div6(col1 int2);
CREATE TABLE
pg_extend_rs_test_db=# commit;
COMMIT
pg_extend_rs_test_db=# insert into tbl_div6 values(1),(2),(3),(6);
INSERT 0 4
pg_extend_rs_test_db=# select divide_six(col1)from tbl_div6;
divide_six
------------
6
3
2
1
(4 rows)
pg_extend_rs_test_db=# commit;
COMMIT
pg_extend_rs_test_db=# insert into tbl_div6 values(0);
INSERT 0 1
© 2019 Cloudera, Inc. All rights reserved. 16
パニック系動作確認 #2
pg_extend_rs_test_db=# select divide_six(col1)from tbl_div6;
NOTICE: PG longjmped: 1
NOTICE: continuing longjmp: panicked at pg-extend/src/lib.rs:183:9
ERROR: panic in Rust extension: panicked at 'attempt to divide by zero', examples/adding/src/lib.rs:26:5
pg_extend_rs_test_db=# commit;
ROLLBACK
pg_extend_rs_test_db=# select * from tbl_div6;
col1
------
1
2
3
6
pg_extend_rs_test_db=# insert into tbl_div6 values(0);
INSERT 0 1
pg_extend_rs_test_db=# select divide_six(col1)from tbl_div6;
server closed the connection unexpectedly. This probably means the server terminated abnormally
before or while processing the request. The connection to the server was lost. Attempting reset: Failed.
!> commit;
You are currently not connected to a database.
!> ¥q
-bash-4.2$
LLVMレイヤ
ーのエラー
COMMITでき
ない
© 2019 Cloudera, Inc. All rights reserved. 17
この実装の特徴など
• Cargo make で PostgreSQLの指定バージョンの tar ボールを落としてきて
展開し、テスト
• CentOS 7.7 では llvm ver.7 を非標準レポジトリーから yum でインストー
ルする必要あり
– PostgreSQL 12.1
• Windows10 WSL(Ubuntu 18.04)での方が簡単に試せた。
– PostgreSQL 11.x
• 小さい共有ライブラリー *.so(*.dll,*.dylib)ファイルをビルドするのに10分以
上かかる。
• 引数の型は固定かも
– Polymorphism はまだできない可能性あり
– C でのUDFとの違い
© 2019 Cloudera, Inc. All rights reserved. 18
Attribute Macro (https://docs.rs/pg-extern-attr/0.2.2/pg_extern_attr/attr.pg_extern.html)
postgres_12.1/include/server/fmgr.h
に定義あり
© 2019 Cloudera, Inc. All rights reserved. 19
比較的シンプルなRustアプリのUDF化に挑戦
• 諦めました
orz
振り仮名
(ルビ振り)
© 2019 Cloudera, Inc. All rights reserved. 20
参考: UDF定義のDDL
# grep pg-extend-rs /root/pg-extend-rs/target/postgres-12.1.log |sed 's/^.*statement: //;s/^[ ¥t]*//' |sort|uniq
CREATE or REPLACE FUNCTION add_big_one(int8) RETURNSint8 AS '/root/pg-extend-rs/target/debug/libadding.so',
'pg_add_big_one'LANGUAGE C STRICT;
CREATE or REPLACE FUNCTION add_one(int4) RETURNS int4 AS '/root/pg-extend-rs/target/debug/libadding.so', 'pg_add_one'
LANGUAGE C STRICT;
CREATE or REPLACE FUNCTION add_small_one(int2) RETURNS int2 AS '/root/pg-extend-rs/target/debug/libadding.so',
'pg_add_small_one'LANGUAGE C STRICT;
CREATE or REPLACE FUNCTION add_together(int8,int4,int2) RETURNS int8 AS '/root/pg-extend-rs/target/debug/libadding.so',
'pg_add_together'LANGUAGE C STRICT;
CREATE or REPLACE FUNCTION allocate() RETURNS void AS '/root/pg-extend-rs/target/debug/libmemory_context.so', 'pg_allocat
LANGUAGE C;
CREATE or REPLACE FUNCTION concat_rs(text,text) RETURNS text AS '/root/pg-extend-rs/target/debug/libstrings.so', 'pg_concat_
LANGUAGE C STRICT;
CREATE or REPLACE FUNCTION get_null() RETURNS int4 AS '/root/pg-extend-rs/target/debug/libnullable.so', 'pg_get_null'
LANGUAGE C;
CREATE or REPLACE FUNCTION longjmping(int4) RETURNS int4 AS '/root/pg-extend-rs/target/debug/libpanicking.so',
'pg_longjmping' LANGUAGE C STRICT;
CREATE or REPLACE FUNCTION panicking(int4) RETURNS int4 AS '/root/pg-extend-rs/target/debug/libpanicking.so', 'pg_panicking
LANGUAGE C STRICT;
...(以下同例10個ほど)…
ありがとうございました。

More Related Content

What's hot

Terraform Bootcamp - Azure Infrastructure as Code隊
Terraform Bootcamp - Azure Infrastructure as Code隊Terraform Bootcamp - Azure Infrastructure as Code隊
Terraform Bootcamp - Azure Infrastructure as Code隊
Toru Makabe
 
Cloud Foundry as Containerized Services - Cloud Foundry Days Tokyo 2016
Cloud Foundry as Containerized Services - Cloud Foundry Days Tokyo 2016Cloud Foundry as Containerized Services - Cloud Foundry Days Tokyo 2016
Cloud Foundry as Containerized Services - Cloud Foundry Days Tokyo 2016
JUNICHI YOSHISE
 
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
はじめての Cloud Foundry: .NET アプリケーションのはじめ方はじめての Cloud Foundry: .NET アプリケーションのはじめ方
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
Akihiro Kitada
 
Zabbix による ms sql監視 ~データベースモニタリング~ odbc
Zabbix による ms sql監視 ~データベースモニタリング~ odbcZabbix による ms sql監視 ~データベースモニタリング~ odbc
Zabbix による ms sql監視 ~データベースモニタリング~ odbc
真乙 九龍
 
cf-containers-broker を使ってローカル環境もサービスの恩恵をうける
cf-containers-broker を使ってローカル環境もサービスの恩恵をうけるcf-containers-broker を使ってローカル環境もサービスの恩恵をうける
cf-containers-broker を使ってローカル環境もサービスの恩恵をうける
Takeshi Morikawa
 
自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版
Kazuto Kusama
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらインターネット株式会社
 
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
Nozomi Kurihara
 
[JANOG35.5] WhiteBox SW検証 ~サーバサイド編~
[JANOG35.5] WhiteBox SW検証  ~サーバサイド編~[JANOG35.5] WhiteBox SW検証  ~サーバサイド編~
[JANOG35.5] WhiteBox SW検証 ~サーバサイド編~
gree_tech
 
MaxScaleを触ってみた
MaxScaleを触ってみたMaxScaleを触ってみた
MaxScaleを触ってみた
Fujishiro Takuya
 
ECS-CLI in Action
ECS-CLI in ActionECS-CLI in Action
ECS-CLI in Action
Ryo Nakamaru
 
CFの便利機能を他の環境でも。Open Service Broker
CFの便利機能を他の環境でも。Open Service BrokerCFの便利機能を他の環境でも。Open Service Broker
CFの便利機能を他の環境でも。Open Service Broker
Kazuto Kusama
 
Cloud Foundryは何故動くのか
Cloud Foundryは何故動くのかCloud Foundryは何故動くのか
Cloud Foundryは何故動くのか
Kazuto Kusama
 
すごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼうすごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼう
i_yudai
 
CloudFoundryをつかってみよう
CloudFoundryをつかってみようCloudFoundryをつかってみよう
CloudFoundryをつかってみよう
Kazuto Kusama
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Takahiro Moteki
 
DC/OS as PaaS : paasjp#36
DC/OS as PaaS : paasjp#36DC/OS as PaaS : paasjp#36
DC/OS as PaaS : paasjp#36
JUNICHI YOSHISE
 
Persistence on Azure - Microsoft Azure の永続化
Persistence on Azure - Microsoft Azure の永続化Persistence on Azure - Microsoft Azure の永続化
Persistence on Azure - Microsoft Azure の永続化
Takekazu Omi
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Yahoo!デベロッパーネットワーク
 

What's hot (20)

Terraform Bootcamp - Azure Infrastructure as Code隊
Terraform Bootcamp - Azure Infrastructure as Code隊Terraform Bootcamp - Azure Infrastructure as Code隊
Terraform Bootcamp - Azure Infrastructure as Code隊
 
Cloud Foundry as Containerized Services - Cloud Foundry Days Tokyo 2016
Cloud Foundry as Containerized Services - Cloud Foundry Days Tokyo 2016Cloud Foundry as Containerized Services - Cloud Foundry Days Tokyo 2016
Cloud Foundry as Containerized Services - Cloud Foundry Days Tokyo 2016
 
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
はじめての Cloud Foundry: .NET アプリケーションのはじめ方はじめての Cloud Foundry: .NET アプリケーションのはじめ方
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
 
Zabbix による ms sql監視 ~データベースモニタリング~ odbc
Zabbix による ms sql監視 ~データベースモニタリング~ odbcZabbix による ms sql監視 ~データベースモニタリング~ odbc
Zabbix による ms sql監視 ~データベースモニタリング~ odbc
 
cf-containers-broker を使ってローカル環境もサービスの恩恵をうける
cf-containers-broker を使ってローカル環境もサービスの恩恵をうけるcf-containers-broker を使ってローカル環境もサービスの恩恵をうける
cf-containers-broker を使ってローカル環境もサービスの恩恵をうける
 
ProjectAtomic-and-geard
ProjectAtomic-and-geardProjectAtomic-and-geard
ProjectAtomic-and-geard
 
自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
 
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
 
[JANOG35.5] WhiteBox SW検証 ~サーバサイド編~
[JANOG35.5] WhiteBox SW検証  ~サーバサイド編~[JANOG35.5] WhiteBox SW検証  ~サーバサイド編~
[JANOG35.5] WhiteBox SW検証 ~サーバサイド編~
 
MaxScaleを触ってみた
MaxScaleを触ってみたMaxScaleを触ってみた
MaxScaleを触ってみた
 
ECS-CLI in Action
ECS-CLI in ActionECS-CLI in Action
ECS-CLI in Action
 
CFの便利機能を他の環境でも。Open Service Broker
CFの便利機能を他の環境でも。Open Service BrokerCFの便利機能を他の環境でも。Open Service Broker
CFの便利機能を他の環境でも。Open Service Broker
 
Cloud Foundryは何故動くのか
Cloud Foundryは何故動くのかCloud Foundryは何故動くのか
Cloud Foundryは何故動くのか
 
すごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼうすごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼう
 
CloudFoundryをつかってみよう
CloudFoundryをつかってみようCloudFoundryをつかってみよう
CloudFoundryをつかってみよう
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 
DC/OS as PaaS : paasjp#36
DC/OS as PaaS : paasjp#36DC/OS as PaaS : paasjp#36
DC/OS as PaaS : paasjp#36
 
Persistence on Azure - Microsoft Azure の永続化
Persistence on Azure - Microsoft Azure の永続化Persistence on Azure - Microsoft Azure の永続化
Persistence on Azure - Microsoft Azure の永続化
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 

Similar to PostgreSQL UDF in Rust(Jpn) ver.2

速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
 
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC EnterpriseYusukeKuramata
 
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しサーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話し
Akira Nagata
 
マルチテナント化に向けたHadoopの最新セキュリティ事情 #hcj2014
マルチテナント化に向けたHadoopの最新セキュリティ事情 #hcj2014マルチテナント化に向けたHadoopの最新セキュリティ事情 #hcj2014
マルチテナント化に向けたHadoopの最新セキュリティ事情 #hcj2014
Cloudera Japan
 
20130203 oss-db-lpi
20130203 oss-db-lpi20130203 oss-db-lpi
20130203 oss-db-lpi
Shinichi Matsuda
 
20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー
Kazuko Itoda
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
 
Open stack reference architecture v1 2
Open stack reference architecture v1 2Open stack reference architecture v1 2
Open stack reference architecture v1 2Dell TechCenter Japan
 
オトナのDocker入門
オトナのDocker入門オトナのDocker入門
オトナのDocker入門
Tsukasa Kato
 
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築CROOZ, inc.
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
Tsuyoshi Yamamoto
 
DBP-011_Apache Spark for Azure HDInsight ~新世代の Big Data 処理基盤~
DBP-011_Apache Spark for Azure HDInsight ~新世代の Big Data 処理基盤~DBP-011_Apache Spark for Azure HDInsight ~新世代の Big Data 処理基盤~
DBP-011_Apache Spark for Azure HDInsight ~新世代の Big Data 処理基盤~
decode2016
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShiftEtsuji Nakai
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
NTT DATA Technology & Innovation
 
Cloudera in the Cloud #CWT2017
Cloudera in the Cloud #CWT2017Cloudera in the Cloud #CWT2017
Cloudera in the Cloud #CWT2017
Cloudera Japan
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
KLab株式会社
 
VYATTA USERS MEETING Spring 2014 - JAZUG
VYATTA USERS MEETING Spring 2014 - JAZUGVYATTA USERS MEETING Spring 2014 - JAZUG
VYATTA USERS MEETING Spring 2014 - JAZUG
Keiji Kamebuchi
 
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
gree_tech
 
S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較
真治 米田
 

Similar to PostgreSQL UDF in Rust(Jpn) ver.2 (20)

速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
 
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
 
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しサーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話し
 
マルチテナント化に向けたHadoopの最新セキュリティ事情 #hcj2014
マルチテナント化に向けたHadoopの最新セキュリティ事情 #hcj2014マルチテナント化に向けたHadoopの最新セキュリティ事情 #hcj2014
マルチテナント化に向けたHadoopの最新セキュリティ事情 #hcj2014
 
20130203 oss-db-lpi
20130203 oss-db-lpi20130203 oss-db-lpi
20130203 oss-db-lpi
 
20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
Open stack reference architecture v1 2
Open stack reference architecture v1 2Open stack reference architecture v1 2
Open stack reference architecture v1 2
 
オトナのDocker入門
オトナのDocker入門オトナのDocker入門
オトナのDocker入門
 
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
DBP-011_Apache Spark for Azure HDInsight ~新世代の Big Data 処理基盤~
DBP-011_Apache Spark for Azure HDInsight ~新世代の Big Data 処理基盤~DBP-011_Apache Spark for Azure HDInsight ~新世代の Big Data 処理基盤~
DBP-011_Apache Spark for Azure HDInsight ~新世代の Big Data 処理基盤~
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
 
Cloudera in the Cloud #CWT2017
Cloudera in the Cloud #CWT2017Cloudera in the Cloud #CWT2017
Cloudera in the Cloud #CWT2017
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
 
VYATTA USERS MEETING Spring 2014 - JAZUG
VYATTA USERS MEETING Spring 2014 - JAZUGVYATTA USERS MEETING Spring 2014 - JAZUG
VYATTA USERS MEETING Spring 2014 - JAZUG
 
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
 
S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較
 

Recently uploaded

ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
sugiuralab
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
ARISE analytics
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
Yuki Miyazaki
 
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
Osaka University
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 

Recently uploaded (9)

ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
 
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 

PostgreSQL UDF in Rust(Jpn) ver.2

  • 1. © 2019 Cloudera, Inc. All rights reserved. 1 2020 年 3月 https://github.com/inoue-katsumi https://katsumiinoue.wordpress.com/ PostgreSQL UDF in Rust@新宿
  • 2. © 2019 Cloudera, Inc. All rights reserved. 3 自己紹介 • ブログ: https://katsumiinoue.wordpress.com/ • Cloudera: BigData 系OSS {サービス|packaging|サポート} – Apache {Hadoop|Spark|Impala|…} • コントロールプレーン系担当 – 管理、監視 – メトリック – 認証認可 – 開発ツール
  • 3. © 2019 Cloudera, Inc. All rights reserved. 4 PostgreSQL UDFって? • PostgreSQL拡張の中の一つの種類 • UDF == User Defined Function、ユーザー定義関数 • 実体は共有ライブラリで 配置されサーバー側で ロードされる • DBアクセスドライバーや ORM(例:Diesel)ではない – 右のPDFは次スライド 参照
  • 4. © 2019 Cloudera, Inc. All rights reserved. 5 実装その1 • 最も本格的な実装か。 • 左下はPDFプレゼン資料
  • 5. © 2019 Cloudera, Inc. All rights reserved. 6 実装その2、3 • 6年前のおそらく最初の実装 • 今回試したもの
  • 6. © 2019 Cloudera, Inc. All rights reserved. 7 最終結果 #1 時間あれば後でデモします PostgreSQLバージョンt SQL CLIツール Postgres server process DLL 8個
  • 7. © 2019 Cloudera, Inc. All rights reserved. 8 最終結果 #2 時間あれば後でデモします Rust UDF呼び出し. “SELECT 3+1” と同じ(笑 実装が入っているdynlib
  • 8. © 2019 Cloudera, Inc. All rights reserved. 9 最終結果 #3 時間あれば後でデモします 実装が入っている別の DLL(dylib)が新しくロード される
  • 9. © 2019 Cloudera, Inc. All rights reserved. 10 最終結果 #4 パフォーマンス比較 時間あれば後でデモします • 200万行データで (列1)+(列2)+(列3) • ほぼ同じ – Debug build だと18% ぐらいのオーバーヘッドあり
  • 10. © 2019 Cloudera, Inc. All rights reserved. 11 他の言語での実装 • 右: C言語 – マクロ多用 • 左下: PL/Python – PL/Python自体がExtension
  • 11. © 2019 Cloudera, Inc. All rights reserved. 12 Rust ソース
  • 12. © 2019 Cloudera, Inc. All rights reserved. 13 パニック処理 • SIGSEGV などが発生してもPostgreSQL サーバープロセスを落とさない。 • 割り算での divide_by_zero は明示的に 例外処理しなくても一応問題無さそう。 /// my divide by 0 test #[pg_extern] fn divide_six(value: i32) -> i32 { (6 / value) }
  • 13. © 2019 Cloudera, Inc. All rights reserved. 14 パニックに対応していない場合の結果 • DBセッションがabortするのでトランザクションがCOMMITされず再実行 が必要になる。 • 以下がGithub issuesに報告されています。
  • 14. © 2019 Cloudera, Inc. All rights reserved. 15 パニック系動作確認 #1 pg_extend_rs_test_db=# create table tbl_div6(col1 int2); CREATE TABLE pg_extend_rs_test_db=# commit; COMMIT pg_extend_rs_test_db=# insert into tbl_div6 values(1),(2),(3),(6); INSERT 0 4 pg_extend_rs_test_db=# select divide_six(col1)from tbl_div6; divide_six ------------ 6 3 2 1 (4 rows) pg_extend_rs_test_db=# commit; COMMIT pg_extend_rs_test_db=# insert into tbl_div6 values(0); INSERT 0 1
  • 15. © 2019 Cloudera, Inc. All rights reserved. 16 パニック系動作確認 #2 pg_extend_rs_test_db=# select divide_six(col1)from tbl_div6; NOTICE: PG longjmped: 1 NOTICE: continuing longjmp: panicked at pg-extend/src/lib.rs:183:9 ERROR: panic in Rust extension: panicked at 'attempt to divide by zero', examples/adding/src/lib.rs:26:5 pg_extend_rs_test_db=# commit; ROLLBACK pg_extend_rs_test_db=# select * from tbl_div6; col1 ------ 1 2 3 6 pg_extend_rs_test_db=# insert into tbl_div6 values(0); INSERT 0 1 pg_extend_rs_test_db=# select divide_six(col1)from tbl_div6; server closed the connection unexpectedly. This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Failed. !> commit; You are currently not connected to a database. !> ¥q -bash-4.2$ LLVMレイヤ ーのエラー COMMITでき ない
  • 16. © 2019 Cloudera, Inc. All rights reserved. 17 この実装の特徴など • Cargo make で PostgreSQLの指定バージョンの tar ボールを落としてきて 展開し、テスト • CentOS 7.7 では llvm ver.7 を非標準レポジトリーから yum でインストー ルする必要あり – PostgreSQL 12.1 • Windows10 WSL(Ubuntu 18.04)での方が簡単に試せた。 – PostgreSQL 11.x • 小さい共有ライブラリー *.so(*.dll,*.dylib)ファイルをビルドするのに10分以 上かかる。 • 引数の型は固定かも – Polymorphism はまだできない可能性あり – C でのUDFとの違い
  • 17. © 2019 Cloudera, Inc. All rights reserved. 18 Attribute Macro (https://docs.rs/pg-extern-attr/0.2.2/pg_extern_attr/attr.pg_extern.html) postgres_12.1/include/server/fmgr.h に定義あり
  • 18. © 2019 Cloudera, Inc. All rights reserved. 19 比較的シンプルなRustアプリのUDF化に挑戦 • 諦めました orz 振り仮名 (ルビ振り)
  • 19. © 2019 Cloudera, Inc. All rights reserved. 20 参考: UDF定義のDDL # grep pg-extend-rs /root/pg-extend-rs/target/postgres-12.1.log |sed 's/^.*statement: //;s/^[ ¥t]*//' |sort|uniq CREATE or REPLACE FUNCTION add_big_one(int8) RETURNSint8 AS '/root/pg-extend-rs/target/debug/libadding.so', 'pg_add_big_one'LANGUAGE C STRICT; CREATE or REPLACE FUNCTION add_one(int4) RETURNS int4 AS '/root/pg-extend-rs/target/debug/libadding.so', 'pg_add_one' LANGUAGE C STRICT; CREATE or REPLACE FUNCTION add_small_one(int2) RETURNS int2 AS '/root/pg-extend-rs/target/debug/libadding.so', 'pg_add_small_one'LANGUAGE C STRICT; CREATE or REPLACE FUNCTION add_together(int8,int4,int2) RETURNS int8 AS '/root/pg-extend-rs/target/debug/libadding.so', 'pg_add_together'LANGUAGE C STRICT; CREATE or REPLACE FUNCTION allocate() RETURNS void AS '/root/pg-extend-rs/target/debug/libmemory_context.so', 'pg_allocat LANGUAGE C; CREATE or REPLACE FUNCTION concat_rs(text,text) RETURNS text AS '/root/pg-extend-rs/target/debug/libstrings.so', 'pg_concat_ LANGUAGE C STRICT; CREATE or REPLACE FUNCTION get_null() RETURNS int4 AS '/root/pg-extend-rs/target/debug/libnullable.so', 'pg_get_null' LANGUAGE C; CREATE or REPLACE FUNCTION longjmping(int4) RETURNS int4 AS '/root/pg-extend-rs/target/debug/libpanicking.so', 'pg_longjmping' LANGUAGE C STRICT; CREATE or REPLACE FUNCTION panicking(int4) RETURNS int4 AS '/root/pg-extend-rs/target/debug/libpanicking.so', 'pg_panicking LANGUAGE C STRICT; ...(以下同例10個ほど)…