📈

R パッケージを Azure Synapse Analytics Apache Spark プール のワークスペースパッケージとして利用する

2022/12/16に公開

自前の R パッケージを Azure Synapse Analytics Apache Spark プール のワークスペースパッケージとして使用する

本記事執筆時点ではパブリックプレビューですが、 Azure Synapse AnalyticsApache Spark プール では Python (PySpark), Scala, C# (.NET Spark), SQL だけでなく、R言語 (SparkR) も使用することができます。Apache Spark のバージョンとしては 3 以上で利用でき、本記事執筆時点で利用可能なバージョンは 3.1, 3.2, 3.3 (プレビュー) の 3 種類です。

Apache Spark プールで R のパッケージを利用する方法は 2 通りです。

  1. ノートブック セッション パッケージ
  2. ワークスペース パッケージ

前者の方が一時的なもので、後者の方が恒久的なものです。

なお、Python の場合は上記以外に Spark プール パッケージ という方法もあり、上記の中だと中間に位置します。

ノートブック セッション パッケージ の方が簡単です。ノートブックのセル内で

install.packages("パッケージ名")

と実行すれば、CRAN (Comprehensive R Archive Network) から依存関係も含めてパッケージをダウンロードし、コンパイル等してインストールしてくれます。フィーリングとしては Gentoo LinuxPortage に似ていると思います。また、上記以外にも devtools が利用可能です。

ただ、ノートブック セッション パッケージ はお手軽である反面、Spark のセッションが終了したらインストールしたパッケージも消えてしまうのがデメリットです。CRAN からのインストールの際にアーキテクチャに合ったバイナリをインストールしてくれれば早いのですが、そうではなく逐一コンパイルをするため、R パッケージのインストールには時間がかかります。

一方、ワークスペース パッケージ を利用すれば、Spark のセッションが終了しても、Spark クラスターにパッケージがインストールされたままとなります。こちらの方が良さそうに見えますが、デメリットとしては、依存関係が解決されないことです。

本記事では、前提となる環境構築手順を示した上で、R をワークスペース パッケージ として利用する際の失敗例と、問題の解決方法を示します。長くなるので、最初から解決方法を見ていただいても構いません。
なお、サンプルとして利用する R パッケージは C50 とします。

環境構築

Apache Spark プールにクラスターを作成します。






失敗例

まず、ワークスペース パッケージに C50 を登録します。





ワークスペース パッケージ として C50 を登録できたので、次は Apache Spark クラスターにこれをインストールするため、ワークスペース パッケージ から選択を行います。








ここで、インストールには時間がかかるので、気長に待ちます。

そして、インストールは失敗します。エラーは以下の通りです。

ProxyLivyApiAsyncError
LibraryManagement - Spark Job for Small3NodesNoAS in workspace workshop-demo-for-ricoh in subscription ********-****-****-****-************ failed with status: 
{"id":2,"appId":"application_1671094646994_0001","appInfo":{"driverLogUrl":"http://vm-44405081:8042/node/containerlogs/container_1671094646994_0001_01_000001/trusted-service-user","sparkUiUrl":"http://vm-44405081:8088/proxy/application_1671094646994_0001/","isSessionTimedOut":null,"isStreamingQueryExists":"false","impulseErrorCode":"Spark_Ambiguous_NonJvmUserApp_ExitWithStatus1","impulseTsg":null,"impulseClassification":"Ambiguous"},"state":"dead","log":["In install.packages(\"C50\", contriburl = \"file://usr/lib/library-manager/bin/lmjob/Small3NodesNoAS/libraries/R/\") :","  installation of package ‘C50’ had non-zero exit status","22/12/15 08:59:39 INFO ","22/12/15 08:59:39 INFO Ran Rscript -e 'install.packages(\"C50\", contriburl=\"file://usr/lib/library-manager/bin/lmjob/Small3NodesNoAS/libraries/R/\")' successfully","22/12/15 08:59:39 INFO Running Rscript -e 'library(\"C50\")'","Error in library(\"C50\") : there is no package called ‘C50’","Execution halted","22/12/15 08:59:40 ERROR b''","22/12/15 08:59:40 INFO Cleanup following folders and files from staging directory:","22/12/15 08:59:40 INFO Staging directory cleaned up successfully"],"registeredSources":null}

ノートブックを作成し、パッケージを呼び出してみます。







インストールされているパッケージの一覧に C50 はありません。

そして、パッケージを呼び出そうとするとエラーになりました。

解決方法

パッケージの依存関係を解決します。

ただ、依存関係を特定した上で、当該 Apache Spark クラスターのノードにどのパッケージがインストール済みか(※)、そしてそれぞれの依存パッケージのバージョンがインストールしようとしているパッケージの要件を満たしているか、確認するのは大変です。

※例えば Spark 3.3 ランタイムであれば、インストール済みのパッケージのリストは こちら にあります。

そこで、いったん ノートブック セッション パッケージ として依存関係を含めて目当てのパッケージをインストールし、そのログから ワークスペース パッケージ としてインストールする際に必要な依存パッケージを特定すると、誰でも簡単にこの問題を解決することができます。

その流れを以下に示します。


install.packages("C50") の出力には以下のような文字列が含まれています。

also installing the dependencies ‘libcoin’, ‘mvtnorm’, ‘Formula’, ‘inum’, ‘partykit’, ‘Cubist’

trying URL 'https://cloud.r-project.org/src/contrib/libcoin_1.0-9.tar.gz'
Content type 'application/x-gzip' length 992315 bytes (969 KB)
==================================================
downloaded 969 KB

trying URL 'https://cloud.r-project.org/src/contrib/mvtnorm_1.1-3.tar.gz'
Content type 'application/x-gzip' length 166421 bytes (162 KB)
==================================================
downloaded 162 KB

trying URL 'https://cloud.r-project.org/src/contrib/Formula_1.2-4.tar.gz'
Content type 'application/x-gzip' length 164214 bytes (160 KB)
==================================================
downloaded 160 KB

trying URL 'https://cloud.r-project.org/src/contrib/inum_1.0-4.tar.gz'
Content type 'application/x-gzip' length 12142 bytes (11 KB)
==================================================
downloaded 11 KB

trying URL 'https://cloud.r-project.org/src/contrib/partykit_1.2-16.tar.gz'
Content type 'application/x-gzip' length 2121360 bytes (2.0 MB)
==================================================
downloaded 2.0 MB

trying URL 'https://cloud.r-project.org/src/contrib/Cubist_0.4.1.tar.gz'
Content type 'application/x-gzip' length 1523257 bytes (1.5 MB)
==================================================
downloaded 1.5 MB

trying URL 'https://cloud.r-project.org/src/contrib/C50_0.1.7.tar.gz'
Content type 'application/x-gzip' length 304504 bytes (297 KB)
==================================================
downloaded 297 KB

Loading required package: usethis
* installing *source* package ‘mvtnorm’ ...
** package ‘mvtnorm’ successfully unpacked and MD5 sums checked
** using staged installation

そして、出力は

* DONE (C50)

The downloaded source packages are in
	‘/tmp/RtmplbLWPy/downloaded_packages’
[notebook] install.packages pkgs=C50 cost [101s] time:2022-12-15 16:08:45

という形でエラー無く DONE となっており、library() の結果に C50 は含まれていますし、

library(C50) でパッケージの読み込みもできます。

ワークスペース パッケージ としてパッケージをインストールする際に同時に必要となる依存パッケージは、上記の出力に含まれる .tar.gz の URI から wget 等でダウンロードしてくれば良いのです。

そして、Apache Spark プールのクラスターに、ワークスペース パッケージ からインストールを行います。











インストールに成功しました。それでは、ワークスペース パッケージ からインストールしたパッケージを、ノートブックから呼び出してみましょう。





成功です。

最後に、セッションを一度終了しても、ワークスペース パッケージ としてインストールされたパッケージが再度利用できることを確認しておきましょう。





問題ありません。これで、Apache Spark クラスターとのセッション状態とは関係無く、R パッケージを恒久的に利用できるようになりました。

まとめ

Azure Synapse AnalyticsApache Spark プール で R言語を利用する場合、かつ自前のパッケージをインストールしたり ワークスペース パッケージ を利用する場合に、自分で依存関係を解決する方法を解説しました。

少し回り道にはなりますが、一度 ノートブック セッション パッケージ として CRAN 等を使ってインストールすることで、依存パッケージをバージョンや URI も含めて特定することができ、誰でも簡単に R パッケージのインストールを恒久化することができます。

Azure Synapse Analytics 上で R によるデータ分析をゴリゴリやる方には必須知識だと思いますので、ぜひお役立てください。

See also

Discussion