Databricksノートブックのカタログ化、高速検索の実現

[How to Catalog and Discover Your Databricks Notebooks Faster \- The Databricks Blog](https://databricks.com/blog/2021/09/22/catalog-and-discover-your-databricks-notebooks-faster.html)の翻訳です。

> この記事はDatabricksとElsevierとの共同記事です。ElsevierのDirector Disruptive TechnologiesであるDarin McBeathと他の方々に感謝の意を評します。

情報と分析におけるグローバルリーダーとして、[Elsevier](https://www.elsevier.com/)は研究者とヘルスケアプロフェッショナルが社会の利益に寄与するようにサイエンスを先端的なものとし、ヘルスケア成果を改善することを支援します。140年以上に渡り、リサーチ、ヘルスケアパートナーの作業をサポートし続けています。出自が出版であることから、Elsevierは社会の進展を促進するようなブレークスルーをユーザーが生み出せる様に価値のある分析、知識を提供しています。[ScienceDirect](https://www.elsevier.com/solutions/sciencedirect)、[Scopus](https://www.elsevier.com/solutions/scopus)、[SciVal](https://www.elsevier.com/solutions/scival)、[ClinicalKey](https://www.elsevier.com/solutions/clinicalkey)、[Sherpath](https://www.elsevier.com/solutions/sherpath)のようなデジタルソリューションが[戦略的研究管理](https://www.elsevier.com/research-intelligence)、[R&Dパフォーマンス](https://www.elsevier.com/rd-solutions)、[医療決定支援](https://www.elsevier.com/clinical-solutions)、[ヘルス教育](https://www.elsevier.com/education)をサポートします。研究者とヘルスケアプロフェッショナルはElsevierの[The Lancet](https://www.thelancet.com/)や[Cell](https://www.cell.com/)を含む2,500以上のデジタル化されたジャーナル、40,000のeBookタイトル、*Gray’s Anatomy*のようなアイコンとなるリファレンスワークに依存しています。

ElsevierがDatabricksの顧客になって6年が経っています。ワークスペースには数百のユーザー、数万のノートブックが存在しています。以前作成したノートブックを検索するには非常にノートブックが存在するため、ある程度はElsevierのDatabricksユーザーは彼ら自身の成功の犠牲者となっているとも言えます。

Databricksワークスペースではキーワード検索が可能ですが、多くの場合、作成者、最終更新日、プログラミング言語、ノートブックコマンド、結果などアドバンストな検索条件を定義する必要に迫られます。

興味深いことに、Databricks機能を活用した100%ノートブックベースのソリューションを用いて、この目標を達成しました。以下で説明する様に、お客様のDatabricks環境で容易にセットアップすることができます。

# ノートブックをスキャンするためのAPIファーストアプローチ

Databricksではプログラムからアカウント、ワークスペースを管理できる様にするために一連の堅牢な[API](https://docs.databricks.com/dev-tools/api/latest/index.html)を提供しています。このソリューションにおいては、ワークスペース内のノートブックとフォルダーをリスト、エクスポートするために[Workspace API](https://docs.databricks.com/dev-tools/api/latest/workspace.html)を活用します。

カタログ生成のプロセスを高速化するためにAPIコールを並列化し、Databricksにおける秒あたり30リクエストのリミット内で設定できる様にします。「429: Too Many Requests」エラーを回避するために、[Delta Sharing](https://qiita.com/taka_yayoi/items/f93f1b70fef0f75585be) [Apache Spark™コネクター](https://github.com/delta-io/delta-sharing/blob/main/spark/src/main/scala/io/delta/sharing/spark/util/RetryUtils.scala)からのインスピレーションを受けた、指数関数的リトライ機構を実装しました。

## Parquetを使ったカタログ作成

このソリューションは、SolrやElasticSearchのようないかなる外部全文検索システムを必要としません。代わりにノートブックのインデックスとしてParquetファイルを活用します。インデックスはシンプルに、それぞれの行が別々のコマンドセルを記述するデータテーブルとなります。それぞれの行には以下のフィールドが含まれます。

- ノートブック情報: 言語(nbLang)、名前(nbName)、フォルダーパス(nbFolder)、URL(nbUrl)
- コマンド情報: セルテキスト(cText)、最終実行日(cDateTime)、セルの言語(cLang)、URL(cUrl)
![](https://databricks.com/wp-content/uploads/2021/09/Databricks-Notebook-Catalog-and-Discovery-blog-img-1.jpg)

# ノートブック検索に対するノートブックベースソリューション

インデックスと検索機能は3つのノートブック(*NotebookIndex*、*NotebookSearch*、*NotebookSimilarity*)によって提供されます。2つのヘルパーノートブック(*NotebookIndexRun*、*NotebookSimilarityRun*)によって、インデックス、類似検索機能を容易に設定できる様になります。

## NotebookIndex

この[ノートブックベースソリューション](https://github.com/elsevierlabs-os/NotebookDiscovery)では、プログラムからノートブックをエクスポートし、Parquetテーブルにデータを投入するためにWorkspace APIを活用します。

多くの企業では[ワークスペースオブジェクトに対するアクセスコントロール](https://qiita.com/taka_yayoi/items/2dd6711b7b254505e4a3)が有効化されており、ユーザーは自身のノートブックとSharedフォルダーに対してのみアクセス権を有しています。NotebookIndexはユーザーのアクセス権を用いて実行され、ユーザーが参照できるノートブックのみに限定されます。

企業がワークスペース上のすべてのノートブックに対して完全なカタログを作成したいのであれば、ワークスペースレベルのカタログを作成するために、管理者がインデックス作成処理を実行する必要があります。また、ユーザー、ワークグループが参照できるノートブックのレコードのみを格納する自身のインデックスファイルを作成することも想定します。

## NotebookIndexRun

これは、ユーザー、グループがインデックス作成処理を実行する際に使用するヘルパーノートブックとなります。これにより、自身のフォルダー、グループのメンバーのフォルダーなどスキャンされるユーザーフォルダーを選択することができます。Elsevierにおいては、研究所グループのユーザーにとってこの機能が特に有用であることを発見しました。

上で述べた通り、インデックス作成ノートブックを実行するユーザーによって読み取れるノートブックのみがインデックスに現れます。以下の例では、`/Shared/`フォルダー、`someone1`、`someone2`、`someone3`、`someone4`ユーザーフォルダーのインデックスが作成されます。
![](https://databricks.com/wp-content/uploads/2021/09/Databricks-Notebook-Catalog-and-Discovery-blog-img-2.jpg)

## NotebookSearch

NotebookSearchを使用したいユーザーは、それぞれこのノートブックを自身のワーク右sペースにクローンする必要があります。このノートブックは上で述べたインデックステーブルを検索するサンプルを提供します。ここでは、ユーザーは自身のニーズに応じてコピーを編集して、使用するテーブルを指定し、カスタマイズを行います。この記事の後半で検索例を説明します。

サンプル以外にも、結果をよりユーザーフレンドリーなものにするためにHTMLを用いて検索結果を表示するdisplaySearchResults関数を提供しています。

- languageカラムではコマンドの言語を表示し、folderカラムにはノートブック(notebookカラムに表示されます)が格納されているフォルダーの場所を表示します。
- notebookのリンクをクリックすることで当該ノートブックに移動できます。
- commandリンクをクリックすることで、ノートブックの当該セルに移動できます。
![](https://databricks.com/wp-content/uploads/2021/09/Databricks-Notebook-Catalog-and-Discovery-blog-img-3.jpg)

## NotebookSimilarity、NotebookSimilarityRun

これでワークスペース上の全てのノートブック、全てのセルをキャプチャすることができたので、ノートブックのカタログに対してさらに分析を行うことができます。アイデアの一つとして、自然言語処理(NLP)技術を用いた類似ノートブック検索が挙げられます。

ノートブックがクローンされたことを追跡する機能が現状ないため、この機能を用いることである閾値以上の類似度を持つノートブックを特定することで、クローンされた可能性があるノートブックを探し出すことができます。

類似度の指標にはいくつかありますが、それぞれが自身の特性を持っています。NotebookSimilarityノートブックでは、ノートブックを一連の単語として表現し、Jaccard距離を計算するシンプルな例をデモンストレーションします。

マークダウン、結果、空白セルを除外するためにシンプルな前処理を行い、全てのノートブックコマンドを文字列として結合します。MLlibでJaccard距離を計算するために[MinHash関数](https://spark.apache.org/docs/latest/ml-features.html#minhash-for-jaccard-distance)を使用することで、数万のノートブックにスケールすることができます。

類似スコアを計算するために、インデックステーブルにあるノートブックを比較します。全ての類似度の完全なマトリクスを持つのではなく、類似度距離の最大値(例:0.1)を指定します。全てのノートブックに対して、その距離内にあるノートブックのリストに対して検索が行えます。
![](https://databricks.com/wp-content/uploads/2021/09/Databricks-Notebook-Catalog-and-Discovery-blog-img-4.jpg)

## サンプルユースケース：シェル、Spark SQLおよびScala

シェルコマンドを使っているコマンドを含むノートブックを知ることができたら素敵だと思いませんか？以下の例では、シェルコマンドを検索しています。言い換えると、マジックコマンド`%sh`で始まるセルを検索しています(注意:シェルコマンドを使用している特定のセルを検索していますが、セルは全体的なデフォルト言語を持つノートブック内に現れます。このため、最初のカラムにデフォルト言語を表示することは適切であると言えます)。
![](https://databricks.com/wp-content/uploads/2021/09/Databricks-Notebook-Catalog-and-Discovery-blog-img-5.jpg)

同僚がおそらく使用しただろう特定のSpark SQL関数の使い方を思い出そうとしたことはありませんか？Webサーチで妥協して、ウェブの大海から一つの例を探し出すよりも、コンテキストを踏まえた例を見る方が役立つと思いませんか？以下の例では、"collect_list"の文字列を含む特定のユーザー領域を検索しています。
![](https://databricks.com/wp-content/uploads/2021/09/Databricks-Notebook-Catalog-and-Discovery-blog-img-6.jpg)

最近実行したノートブックが分からなくなったりしていませんか？以下の例では、2021/8/12以降に実行されたセルを含むノートブックを検索しています。`distinctNotebooks=true`を指定することで、同じノートブックにおける(マッチしたものを含む)全てのコマンドを1つの検索結果にまとめて、ノートブックへのリンクのみを表示することができます。
![](https://databricks.com/wp-content/uploads/2021/09/Databricks-Notebook-Catalog-and-Discovery-blog-img-7.jpg)

上述した基本的な例は、インデックステーブルに対する検索のほんの一部に触れたに過ぎません。過去数年間を通じて[Databricks Community](https://community.databricks.com/)(以前のフォーラム)に投稿された代表的な質問を以下に示します。これらはノートブック検索で容易に対応することができます。

- ソーステーブルを更新していますが、そのテーブルを持っている全てのノートブックを探す必要があります。Databricks UIの検索機能を試しましたが、他のユーザーのフォルダーの結果も表示されてしまいます。条件を指定して検索結果を特定のフォルダーに限定することはできませんか？
- 完全フレーズ一致、部分一致(除外)、ワイルドカード、正規表現を用いたノートブックの検索はできませんか？
- 全てのノートブックの文字列を検索する方法はありませんか？Deltaテーブルを使用しているノートブックを探したいのです。
- デバッグのために他のノートブックで使われている類似コマンドを検索できませんか？

# 使ってみる

[Elsevier Labs](http://labs.elsevier.com/)はこのソリューションを[ノートブックディスカバリー](https://github.com/elsevierlabs-os/NotebookDiscovery)ツールとしてリリースしており、非常に緩やかなMITライセンスの元でオープンソース化しています。ノートブックディスカバリーはDBC(Databricksアーカイブ)ファイルとして提供されており、すぐに使い始めることができます。

1. **アーカイブのダウンロード:** Notebook Discoveryアーカイブ(DBCファイル)をお使いのマシンにダウンロードします。
1. **ノートブックのインポート:** ダウンロードしたDBCファイルをDatabricks UIからフォルダーにインポートします。アーカイブをインポートしたワークスペースフォルダーと、インデックスを作成したいワークスペースフォルダーは無関係です。
1. **インデックスファイルの作成:** インデックスファイルを作成する人は、NotebookIndexRunヘルパーを編集し、インデックスを作成するフォルダー、インデックスファイルの場所を指定する必要があります。インデックス作成処理がスタートし、処理が完了するとインデックスファイルが生成されます。
1. **ノートブックの検索:** 他のユーザーはNotebookSearchノートブックを自身の領域にクローンし、適切なインデックスファイルを使う様に変更します。その後で好きな様に検索を編集することができます。
1. **類似ノートブックの検知:** 類似のノートブックを検索したい場合、NotebookSimilarityRunノートブックを編集し、類似度ファイルを生成するためにジョブを実行する必要があります。

これまでの数ヶ月間で、ElsevierのユーザーはNotebook Discoveryが非常に有用であることを確認し、コミュニティにシェアする決断をしました。この[ツール](https://github.com/elsevierlabs-os/NotebookDiscovery)が皆様の役に立つことをを願っています。

:::note info
こちらに日本語化したものもございます
:::

https://github.com/taka-yayoi/public_repo/tree/main/NotebookDiscovery

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)