RedshiftのPython UDFの同時実行数
Python UDFとは
Redshiftには、関数が呼び出されると実行され、単一値を返す Python プログラムを実行出来る。
Python UDFの作成自体はcreate funtion
を使用する
create OR REPLACE function testudfpython (a float, b float)
returns float
stable
as $$
import time
if a > b:
c = a + b
elif a < b:
c = a * b
else:
return 0
return c
$$ language plpythonu;
テスト用テーブルの作成
drop table testtable;
create table testtable(a numeric,b numeric,c numeric);
insert into testtable values(1,1,1);
insert into testtable values(2,4,6);
insert into testtable values(4,8,12);
mydb=# select * from testtable;
a | b | c
---+---+----
1 | 1 | 1
2 | 4 | 6
4 | 8 | 12
(3 rows)
Python UDFの実行
select testudfpython(b,c) from testtable where a=4;
select testudfpython(b,c) from testtable where a=2;
実行結果
mydb=# select testudfpython(b,c) from testtable where a=4;
testudfpython
---------------
96
(1 row)
mydb=# select testudfpython(b,c) from testtable where a=2;
testudfpython
---------------
24
(1 row)
Python UDFの制約
Amazon Redshift Python UDF には以下の制約がある。
- Python UDF は、ネットワークにアクセスすることもファイルシステムに読み書きすることもできません。
- ユーザーがインストールする Python ライブラリの合計サイズは 100 MB を超えられません。
- 1 つのクラスターで同時に実行できる Python UDF の数は、そのクラスターの合計同時実行レベルの 4 分の 1 に制限されています。たとえば、クラスターの同時実行レベルが 15 に設定されている場合は、最大で 3 つの UDF を同時に実行できます。この制限に達すると、UDF はワークロード管理キュー内で実行されるのを待ちます。SQL UDF に同時実行の制限はありません。詳細については、「ワークロード管理の実装」を参照してください。
- Amazon Redshift で Python UDF を使用する場合、SUPER および HLLSKETCH データタイプはサポートされせん。
特に同時実行数に関してだが、マニュアルの記載を見ると同時実行数を設定した1/4まで実行出来るように見受けられるが、同時実行数を設定するのはManual WLMであり、デフォルトのWLMの場合がどうなのかは記載がない。
強制的にSleepするPython UDFを作成して複数クライアントから実行してみる。この状態のキューの状態も合わせて確認する。
create OR REPLACE function testudfpython (a float, b float)
returns float
stable
as $$
import time
time.sleep(90)
if a > b:
c = a + b
elif a < b:
c = a * b
else:
return 0
return c
$$ language plpythonu;
確認結果①
Auto WLMの場合で複数セッションからPython UDFを実行した場合、同時実行数は「1」のようだ。Sleepを90秒入れているため2つめのセッションで180秒掛かっている。
確認結果②:キューの状態とクエリの状態を確認
psql -h redshift-ra3.ciwori21oiel.ap-northeast-1.redshift.amazonaws.com -U benchuser -d mydb -p 5439 -f /home/ec2-user/amazon-redshift-utils/src/AdminScripts/queuing_queries.sql
psql -h redshift-ra3.ciwori21oiel.ap-northeast-1.redshift.amazonaws.com -U benchuser -d mydb -p 5439 -f /home/ec2-user/amazon-redshift-utils/src/AdminScripts/top_queries.sql
該当するクエリは無し。あくまでPython UDFであり、SQLということでもないので上がってこないらしい。
確認結果③:マネージメントコンソールからのキューの状態
実行しているSQLとしては上がってくるが、キューに入るわけではないようだ。
結論
Auto WLMの場合、同時実行数は1となっている。複数クライアントから実行するようなPython UDFには注意が必要。(そもそも個人的にはデータベース側にロジックを持たせるのはあまり好きではない。こういうUDFやストアド等。)
関連しているかもしれない記事
- RedshiftのLambda UDFの設定
- Redshift Spectrumの同時実行性能パフォーマンス
- Redshiftから特定区切り文字でファイル出力する
- Redshift SpectrumからGlue Data Catalogのテーブルを参照する
- Redshift Spectrumのベストプラクティス