参考
メモ
特徴
特徴については以下を参照。
リファレンスサーバを動かす
公式GitHub のREADMEを参考に、リファレンスサーバを動かす。
前提
- OS: CentOS Linux release 7.8.2003 (Core)、CentOS Linux release 7.9.2009 (Core)
- 必要なライブラリ
- bzip2-devel、readline-devel、openssl-devel、sqlite-devel、libffi-devel
- Python: 3.7.10
- pipでjupyter labを入れておく。
- Spark:3.1.2 w/ Hadoop3.2
- pipか公式サイトからダウンロードしたパッケージを利用してインストールしておく。
- 今回は簡易的な動作確認のため、Spark単体(ローカルモード)で動作させる。Hadoopとの連係はさせない。
サンプルスクリプト
Delta
Sharing Example
にこの記事で取り扱うサンプルスクリプト(Jupyterのノートブック)を置いてある。
なお、このプロジェクトには、Jupyter
LabをPySparkと一緒に起動するサンプル補助スクリプト
./bin/pyspark_jupyter.sh が入っている。
適宜編集して利用されたし。
以降の手順では、このノートブック群を利用した例を示す。 利用する場合はサブモジュールごと以下のようにクローンすると便利。
1 | mkdir -p -/Sources |
.profileについて
なお、この補助スクリプトは同一ディレクトリに .profile
があれば、それを読み込むようになっている。 特に、環境変数
OPTIONS や S3_TEST_URL
に個人的な値を設定するために利用するとよい。
.profileで設定する環境変数について
OPTIONS: Jupyter Lab起動時に、Sparkに渡すオプションを設定するために用意した。S3_TEST_URL: ノートブック内で読み書き動作確認用に用いるS3のURLを設定するために用意した。
基本的な動作
以下の流れで試す。
- S3上にサンプルデータを作成する
- 手元のマシンでDelta Sharingのサーバを立ち上げる
- githubからクローンしたライブラリをローカル環境にインストール
- S3に置いたサンプルデータをDelta Sharingのサーバ経由で取得する
S3上にサンプルデータを作成する
まずはS3上にデータを置く。なんの手段でも良いが、S3へのアクセスロールを持つEC2インスタンス上で CreateDeltaTableS3 を実行する。
なお、PySparkをJupyter Labで起動する補助するスクリプトの例がpyspark_jupyterに載っている。 CreateDeltaTableS3 のレポジトリにおいても当該スクリプトがサブモジュールとして読み込まれる。
手元のマシンでDelta Sharingのサーバを立ち上げる
つづいて、Delta Sharingのソースコードをクローンする。 なお、公式でリリースされたパッケージを用いてもよいのだが、 Delta Sharingはまだプロダクトが若く、変更も多いためmainブランチを パッケージ化して用いることにする。
1 | mkdir -p -/Sources |
これで
server/target/universal/delta-sharing-server-0.3.0-SNAPSHOT.zip
ができたはず。(2021/9現在。これ以降だと、バージョンが上がっている可能性がある)
これを適当なディレクトリに展開して用いるようにする。
1 | mkdir -p ~/DeltaSharing |
展開したパッケージの中に、設定のテンプレートが入っているのでコピーして 自分の環境に合わせて編集する。
1 | cd ~/DeltaSharing/delta-sharing-server-0.2.0-SNAPSHOT |
設定ファイルの例
1 | # The format version of this config file |
サーバを起動する。
1 | ./bin/delta-sharing-server -- --config conf/delta-sharing-server.yaml |
githubからクローンしたライブラリをローカル環境にインストール
起動したサーバとは別のターミナルを開き、Pythonクライアントを試す。
先ほどクローンしたDelta Sharingのレポジトリを利用し、 venvなどで構築した環境下にpipでdelta sharingのPythonクライアントライブラリをインストールする。
1 | pip install ~/Sources/delta-sharing/python/ |
なお、もしすでに一度インストールしたことがあるようであれば、アップデートするようにするなど工夫すること。
つづいて、Spark用のパッケージを作る。
1 | cd ~/Sources/delta-sharing |
spark/target/scala-2.12/delta-sharing-spark_2.12-0.3.0-SNAPSHOT.jar
にJarファイルができる。
これをコネクタの起動時にロードするようにする。 例えば、PySparkのJupyter Lab起動時に以下のようなオプションを渡す。
1 | --jars /home/centos/Sources/delta-sharing/spark/target/scala-2.12/delta-sharing-spark_2.12-0.3.0-SNAPSHOT.jar |
のような
S3に置いたサンプルデータをDelta Sharingのサーバ経由で取得する
PythonConnectorExample にPythonのクライアントライブラリを用いた例を示す。 Pandas DataFrameで取得する例を掲載している。
上記スクリプト内でも利用している通り、クライアントがアクセスするためには、 以下のようなプロファイルを渡す必要がある。
1 | { |
このプロファイルは以下の通り、ファイルのPATH等を渡すか、delta_sharing.protocol.DeltaSharingProfileインスタンスを渡すかすれば良さそう。
後者の場合、JSONテキストから生成できる。
delta_sharing/delta_sharing.py:92
1 | def __init__(self, profile: Union[str, BinaryIO, TextIO, Path, DeltaSharingProfile]): |
一方、 delta_sharing.delta_sharing.load_as_pandas
メソッドを用いて、 Pandas
DataFrameで取得する場合は、その引数に渡すプロファイルはURLのテキストが期待されている。
1 | def load_as_pandas(url: str) -> pd.DataFrame: |
クライアントと同様に、JSONのテキストでも受け付けられるようにしたら便利か。 そもそもプロファイルとスキーマ等の指定が必ずしもひとつのURLになっていなくてもよいのでは…?と思う節もある。 が、共有は基本的にすべてURLで…という統一性を大事にするのも分かる。
プロファイルの場所にURLを指定できるか?
Spark Connector利用時は、例えばS3に置いたプロファイルを使用できるか?の確認をする。
◇補足: というのも、Spark
Connectorを利用している際、Sparkのコンフィグにて、
HADOOP_HOME
を設定し、Hadoopを利用するようにしてみたらどうやらHDFS
を探しに行っているようだったため、SparkのAPIを通じてプロファイルを読みに行っているのだとしたら、S3等に置かれたプロファイルを読めるはずだ、と考えたため。
ここでは、 s3://hoge/fuga/deltasharing.json
のようなURLを渡すことにする。
結論から言えば、delta sharingはプロファイルの読み出しにfsspecを利用しているため、仕様上はリモートのファイルを読み出せるようになっている。
ここで実行したノートブックは TestProfileOnS3 に置いてある。
delta sharing clientの生成
まず、共有データ一覧を取得するために用いるクライアントだが、
1 | client = delta_sharing.SharingClient(profile_file) |
の引数にS3のURLを渡したら、以下のエラーになった。
1 | ImportError: Install s3fs to access S3 |
これは、delta sharing内で用いられるfsspecにより出された例外である。
python/delta_sharing/protocol.py:41
1 |
|
ということで、Python環境にpipでs3fsをインストールしてからもう一度試したところ、ひとまず動作した。
fsspecを利用しているということは、仕様上はリモートに置いてあるファイルシステムにも対応可能である、ということだった。
Pandas DataFrame、Spark DataFrameそれぞれへの読み出しについて、動作した。
認可
Autorization の通り、Bearer認証を利用できるようだ。
REST APIでアクセス
REST API を参考に確認する。
Shareのリスト
ひとまず一番簡単な、Share一覧を取得する。
1 | curl http://127.0.0.1:80/delta-sharing/shares | jq |
テーブルバージョンの取得
Tableバージョンの取得 の通り。 なお、なぜか2行出力される。
1 | curl -I -D - http://127.0.0.1:80/delta-sharing/shares/share1/schemas/schema1/tables/table1 |
Shareの取得にあるようにクエリパラメタとして
maxResult やページングの情報を渡せる。
メタデータの取得
テーブルメタデータの取得 の通り。
1 | curl http://127.0.0.1:80/delta-sharing/shares/share1/schemas/schema1/tables/table1/metadata | jq |
データの取得
テーブルデータの読み出し に従うと、「ヒント句」を渡しながら、データ(のアクセスURL)を取得できるようだ。 ドキュメントを読む限り、このヒントが働くかどうかはベストエフォートとのこと。
1 | $ curl -X POST -H "Content-Type: application/json; charset=utf-8" http://127.0.0.1:80/delta-sharing/shares/share1/schemas/schema1/tables/table1/query -d @- << EOL |
このヒントの働きについては、別途調査する。