Greenplumの手続き型プログラミング言語(1)

目次

1.言語への手続き化とは何ですか?

1.1特別な手続き化が言語になる

1.2手続き型プログラミング言語を作成する

1.3 PL / lauの処理におけるpgとgpの違い

2、PL / Python

2.1はじめに

2.2 PL / Python関数を作成して実行する方法

2.3 plpythonu uの最後の文字はなぜですか?

2.3.1信頼できる手続き型プログラミング言語

3、型変換

4、PL / Python関数でのデータ共有

5、Greenplumデータ計算Pythonパッケージコレクションをインストールします


PostgreSQLは手続き型プログラミング言語(Procedural Language)をサポートしています。ユーザーは、psqlクライアントでcreate language(初期バージョン)またはcreate extension(PostgreSQL 9.1以降)コマンドを実行することにより、データベースに指定された手続き型プログラミング言語を作成できます。ユーザーはこの言語を使用してカスタム関数(つまり、ユーザー定義関数、略してUDF)を記述し、SQLで実行できます。

手続き型プログラミング言語は、本質的に拡張機能と見なすこともできます。特定のプログラミング言語(Python、R、Javaなど)に精通している開発者は、言語の豊富な開発ライブラリを呼び出して、必要な関数を備えた関数をすばやく実装できます。データベースへのデータのロードと書き込み、およびユーザーのコードは同じプロセスで実行されるため、計算のパフォーマンスも保証されます。PostgreSQLは、公式および非公式を含むさまざまな手続き型プログラミング言語をサポートしており、Greenplumはいくつかの主流の手続き型プログラミング言語をシームレスに使用できます(プログラミング構文は同じです)。

1.言語への手続き化とは何ですか?

手続き型プログラミング言語は、ユーザーが非Cプログラミング言語を使用してUDFを記述できることを意味します異なる言語の場合、PostgreSQL / Greenplumは、これらのプログラミング言語に基づいて関数を実行するために、異なる組み込みインタープリターまたはエグゼキューターを必要とします。PostgreSQL / Greenplumでは、各言語のインタプリタがコンパイルされてダイナミックリンクライブラリが生成されます。ダイナミックリンクライブラリは、必要に応じて現在のセッションによって動的にロードされます。

GreenplumはPostgreSQLで一般的なサポートを提供します

  • PL / Python
  • PL / R
  • PL / pgSQL
  • PL / Java
  • PL / Perl

他の手続き型プログラミング言語の機能は、基本的に対応するPostgreSQLバージョンの機能と同じです。

1.1特別な手続き化が言語になる

Greenplumは、特別な手続き型プログラミング言語PL / Containerもサポートしています。

PL / Containerは特定のプログラミング言語に対応していませんが、処理コードのコンテナ化により、Greenplumクラスターコンピューティングから分離されているため、手続き型プログラミング言語の計算のセキュリティが向上し、いくつかの異常な状況でGreenplumクラスターの安定性、プログラミング言語の複数のバージョンまたは複数のオペレーティングシステムのサポートにおける柔軟性が向上しています。

PL / Containerは現在、ビッグデータ分析の分野で最も広く使用されている2つのプログラミング言語であるRとPythonの2つの言語をサポートしています。

1.2手続き型プログラミング言語を作成する

  • psqlセッションでcreateextensionコマンドを実行して、PL / Container言語を作成します
  • 他の手続き型プログラミング言語(PL / Python、PL / R、PL / Javaなど)は、従来のcreate languagepsqlコマンドを使用して一時的に管理されます

1.3 PL / lauの処理におけるpgとgpの違い

PostgreSQLと比較して、分散データベースGreenplumは、手続き型プログラミング言語を使用してすべてのマシンノードで並列クエリと計算を行い、出力を集約して、ビッグデータの高速分析と処理のニーズを満たすことができます。以下に示すように

2、PL / Python

2.1はじめに

Greenplum PL / PythonはPostgreSQLPL / Pythonを継承しているため、GreenplumPL / Pythonは、豊富なデータ型のサポート、さまざまな組み込みPL / Python関数、共有データ、内部トランザクションなど、PostgreSQL PL / Pythonのほとんどの関数もサポートします。 。トリガーなどのごく少数のPostgreSQLPL / Python関数は、現在Greenplum PL / Pythonでサポートされていません。

データベースでPL / Pythonを使用するには、最初にデータベースに対応する手続き型プログラミング言語を作成する必要があります。次のコマンドは、Greenplumに付属のcreatelangアプリケーションを使用して、postgresデータベースにPL / Python手続き型プログラミング言語を作成します(他のデータベースに置き換えることができます。この章の後半の例は、postgresデータベースに基づいています)。完了後のみこのステップでは、Pythonベースの関数を作成します。

2.2 PL / Python関数を作成して実行する方法

まず、createlangを使用て、対応する言語作成します。Createlangは、C言語で実装されたアプリケーションであり、データベースに接続してcreatelanguageを呼び出すことにより、手続き型プログラミング言語を作成します。

PL / Pythonで使用されるPythonインタープリターには、ディレクトリ$ GPHOME / ext / pythonの下にあるGreenplumが付属しており、バージョンは2.7.12です。

~]$ createlang plpythonu -d postgres
createlang: language "plpythonu" is already installed in database "postgres"

これで、PL / Python関数を作成して実行できます

postgres=# create function pyinc(a integer)returns int as
$$ return a+1 
$$ language plpythonu;
CREATE FUNCTION

postgres=# create table test(a int);
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Greenplum Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
postgres=# insert into test values(1),(2),(3);
INSERT 0 3
postgres=# select pyinc(a) from test;
 pyinc 
-------
     2
     4
     3
(3 rows)

この手続き型プログラミング言語はpostgresデータベースでは不要になり、次のコマンドで削除できます。 

 ~]$ droplang plpythonu -d postgres

2.3 plpythonu uの最後の文字はなぜですか?

上記のコマンドラインのplpythonuの最後にある文字uについては、単にplpythonという名前を付けないのはなぜですか?PL / Pythonの実装では、言語名の最後にuを追加すると、実際には、このPL / Python実装が信頼できる手続き型プログラミング言語(信頼できない言語)ではないことがユーザーに通知されますセキュリティ上の理由から、GreenplumではデータベーススーパーユーザーのみがPL / Pythonを有効にしてPL / Python関数を記述できますが、通常のユーザーはPL / Python関数のみを実行できます。もちろん、信頼できない言語の名前の後にu文字を追加することは、PostgreSQLまたはGreenplumには必要ありませんが、追加すると、ユーザーはこの言語のセキュリティ属性をすばやく理解するのに役立ちます。

2.3.1信頼できる手続き型プログラミング言語

手続き型プログラミング言語が信頼できる場合、通常のデータベース権限を持つユーザーもこの言語に基づいて関数を作成できることを意味します。セキュリティの観点から、これは、関数がデータベースマシン上のファイルシステムまたはデータベース内の機密データにアクセスできないことを意味します。一般的に、信頼できる手続き型プログラミング言語を実装するには、関数処理コードは、特権操作が制限された実行環境(サンドボックス)を実装する必要があります。PL / RとPL / Pythonは信頼できる手続き型プログラミング言語ではないと言います。これは、ユーザー関数が対応するライブラリ関数を介してこのマシンのファイルシステムに簡単にアクセスできるためです。PL / Javaは信頼できる手続き型プログラミング言語であり、PL / Perlは少し特別です。plperlとplperluの2つの手続き型プログラミング言語があり、plperlは信頼され、plperluは信頼されていません。すべての信頼できる手続き型プログラミング言語には、共通点が1つあります。つまり、言語の解釈または解析の実装にはサンドボックス機能があります。

3、型変換

Greenplumでは、PL / Python関数定義の構文は次のとおりです。

関数の開始と終了におけるPythonタイプとSQLタイプの間のマッピングには特別な注意を払う必要があります。たとえば、エントリパラメータでは、SQLのブール値はPython boolオブジェクトに変換され、intはPython intオブジェクトに変換され、配列はPythonリストに変換されます。関数が戻ると、PL / PythonはPythonオブジェクトも変換します。さまざまなSQLタイプに。PostgreSQLの公式ドキュメントで、すべてのタイプのマッピングの詳細を確認できます。前述のpyinc()関数とテーブルtest_tblを例として取り上げます。次のSQLクエリの場合、エグゼキュータはtest_tblの各タプルの列aを読み取ります。Aはtest_tblテーブルでint形式として定義され、Pythonインタープリターを呼び出す前にpyinc()関数でPythonコードを実行するために、エグゼキュータは列のデータをPythonintオブジェクトに変換します。

postgres=# select pyinc(a) from test;

PL / Python関数は、セットを返す関数もサポートしています。セット戻り関数は、単純にイテレータとして理解できます関数呼び出しはデータのセットを返し、最終的なクエリ出力はデータの各セットまたは出力を複数の行に展開するため、この種の関数にはパフォーマンスの点で特定の利点があります。

セット戻り関数の例:

postgres=# create or replace function pyreturnsetofint(num int) returns setof int as $BODY$
postgres$# return [x for x in range(num)]
postgres$# $BODY$ language plpythonu;
CREATE FUNCTION
postgres=# select pyreturnsetofint(10);
 pyreturnsetofint 
------------------
                0
                1
                2
                3
                4
                5
                6
                7
                8
                9
(10 rows)

postgres=# select pyreturnsetofint(6);
 pyreturnsetofint 
------------------
                0
                1
                2
                3
                4
                5
(6 rows)

 

4、PL / Python関数でのデータ共有

PL / Pythonは、関数レベルおよびセッションレベルのデータ共有をサポートします。これにより、この関数呼び出しまたはこのセッションの他の関数で使用するために関数が呼び出されたときに、一部のデータをメモリに格納できます。機能レベルのデータ共有はSDディクショナリを介して実現され、セッションレベルのデータ共有はGDディクショナリを介して実現されます。これらの2つの辞書を使用すると、パフォーマンスが大幅に向上する場合があります。SDとGDの使い方を説明するために、以下の関数を例として取り上げます。

postgres=# create function pylog(a integer,b integer) returns double precision as $$
postgres$# import math
postgres$# return math.log(a,b)
postgres$# $$ language plpythonu;
CREATE FUNCTION

postgres=# create table test1(a int,b int);
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Greenplum Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE

postgres=# insert into test1 values(8,2),(64,2);
INSERT 0 2
postgres=# select pylog(a,b) from test1;
       pylog       
-------------------
                 6
                 3

この関数の関数は、Pythonパッケージmathを使用するtest2テーブルの各行のログ関数を計算することです。Greenplumエグゼキューターは、tblテーブルの各行を処理するときにこの関数を実行し、実行するたびにPythonパッケージの計算をインポートします。これはパフォーマンスに影響します。ただし、関数が次のように変更された場合: 

postgres=# create or replace function pylog1(a integer,b integer) returns double precision as $$
if 'math' not in GD:
  import math
  GD['math']
return GD['math'].log(a,b)
$$ language plpythonu;
CREATE FUNCTION

グローバルディクショナリGDのおかげで、数学パッケージはこのセッションで1回のインポート操作のみを必要とし、他の関数はこのディクショナリアイテムを引き続き使用できます。もちろん、他の機能の使用を考慮しない場合は、ここでSD辞書を使用することもできます。SDディクショナリは関数レベルであり、この関数の複数の呼び出しでのみ共有および使用できます。以下は、一般的に使用されるSDの例です(GDはセッションレベルであり、セッション内の他の機能も使用できるため、使用するときは安全性に注意してください)。

上記の例では、SPIを使用してSQLクエリを事前に計画し(Plan)、各行の計画を回避するために事前に保存します。これにより、通常、パフォーマンスが大幅に向上します。PL / Pythonは、さまざまなレベルの情報ログ機能も提供します

  • ❏plpy.debug(msg)
  • ❏plpy.log(msg)
  • ❏plpy.info(msg)
  • ❏plpy.notice(msg)
  • ❏plpy.warning(msg)
  • ❏plpy.error(msg)
  • ❏plpy.fatal(msg)

これらの関数のレベル定義ロジックは、Greenplumコードで広く使用されている情報出力関数elog()のレベル定義と同じです。実際、これらの関数の内部実装はelog()関数を介して行われるため、Greenplumの情報ログに関連するGUCもこれらの関数に適用されます。たとえば、log_min_messagesとclient_min_messagesは、それぞれシステムログファイルとクライアント情報の出力レベルを制御します。plpy.errorとplpy.fatalは、異なるPython例外をスローするのに対し、他の関数はログを出力するだけなので、特別であることに注意してください。PL / Pythonでサポートされる機能はこれに限定されません。たとえば、PL / Pythonはサブトランザクションなどもサポートします。

5、Greenplumデータ計算Pythonパッケージコレクションをインストールします

 

このPythonパッケージをインストールする前に、まずPivotalの公式Webサイトからパッケージをダウンロードする必要があります。パッケージの形式はGreenplumのカスタムgppkg形式です。公式サイトのディレクトリレベルは以下の通りです

インストールコマンドは次のとおりです。

gppkgは、これらのパッケージをすべてのノードにインストールします。これらのパッケージをインストールした後、sourceコマンドを使用して環境変数をリロードし、Greenplumクラスターを再起動する必要があることに注意してください。これは、これらのPythonパッケージが$ GPHOME / ext / DataSciencePython /ディレクトリに配置されているため、PYTHONPATHを変更する必要があるためです。 PL / PythonへのLD_LIBRARY_PATH環境変数はこれらのパッケージを呼び出すことができ、これらの環境変数の変更はgreenplum_path.shファイルに保存されます。同様に、アンインストールする必要がある場合は、sourceコマンドを使用して新しい環境変数スクリプトを再ロードし、クラスターを再起動します。

 

 

 

 

おすすめ

転載: blog.csdn.net/MyySophia/article/details/113832218