|
Gitはコードバージョン管理の事実上の標準となっています。Gitは非常に普及していますが、ソースコードリポジトリの履歴と内容を詳細に分析するためにGitを使用するのは、依然として複雑な作業です。 一方、SQL は大規模なコードベースのクエリに適した実績のある言語であり、Spark や BigQuery などのプロジェクトではクエリ言語として SQL が使用されています。 そのため、source{d} では、これら 2 つのテクノロジを自然に組み合わせて、SQL を使用して Git リポジトリの大規模な分析を実行する「コードとしてのデータ」ソリューションである Gitbase を作成しました。 Gitbaseは、巨人たちの支援によって開発が実現した完全なオープンソースプロジェクトです。この記事では、その基盤となる主要なコンポーネントに焦点を当てます。 Gitbase Testbed は、 Gitbase を視覚的に使用するための方法を提供します。 Vitess による SQL の解析GitbaseはユーザーインターフェースとしてSQLを使用しています。つまり、MySQLプロトコルを介して送信されるSQLリクエストを解析して理解する必要があります。幸いなことに、YouTubeの仲間たちと彼らのVitessプロジェクトは既にこれを実装しています。Vitessは、MySQLの水平スケーリングのためのデータベースクラスタリングシステムです。 いくつかのキーとなるコードスニペットを抽出し、オープンソースプロジェクトとして公開しました。このプロジェクトでは、誰でも数分でMySQLサーバーを構築できます(justforfuncの特集記事「CSVQL - SQLによるCSV処理」で実演しました)。 go-git で Git リポジトリを読み取るリクエストの解析に成功したら、データセット内のGitリポジトリを読み取って、どのように応答するかを判断する必要があります。このため、source{d}で最も成功したリポジトリであるgo-gitを統合しました。go-gitは、非常にスケーラブルで純粋なGo Git実装です。 これにより、ディスク上に siva ファイル形式で保存されたソース コード リポジトリ (siva も source{d} のオープン ソース プロジェクトです)、または Enry を使用してプログラミング言語を検出し、Babelfish を使用してファイルを解析します。Gitbase の分析機能は Git の履歴だけにとどまりません。オープンソースプロジェクト Enry を利用した(そしておそらく Enry も利用していると思われる)言語検出機能も統合し、コードファイルを汎用抽象構文木 (UAST) に変換する汎用ソースコード解析用のセルフホストサーバーである Babelfish を用いたプログラム解析も実装しています。 これら2つの関数は、Gitbaseではユーザー関数 早く実行させるGitbaseは、GitHubの3TBのソースコードを含む公開Gitアーカイブなど、非常に大規模なデータセットを頻繁に分析します(発表内容をご覧ください)。これを実行するには、CPUユニットごとの処理能力が不可欠です。 そのため、Rubex と Pilosa という 2 つのプロジェクトをさらに統合しました。 RubexとOnigurumaを使って正規表現を高速化するRubexは、Goの Rubex の高いパフォーマンスは、ライブラリの呼び出しに cgo を使用する、高度に最適化された C ライブラリ Oniguruma のおかげです。 クエリを高速化するには、Pilosa インデックスを使用します。インデックスはほとんどすべてのリレーショナル データベースでよく知られた機能ですが、Vitess では実際には必要ないためインデックスを実装していません。 ありがたいことに、オープンソースのPilosaが再び私たちを救ってくれました。これはGo言語で実装された分散ビットマップインデックスで、Gitbaseを大規模データセットで使用できるようになります。Pilosaはオープンソースであり、複数の大規模データセットに対するクエリを大幅に高速化します。 要約このブログ投稿を通して、誰も予想していなかった短期間でGitbaseを構築することを可能にしてくれたオープンソースコミュニティの皆様に、心から感謝申し上げます。source{d}はオープンソースを強く信じており、 Gitbaseを試してみませんか?最も速くて簡単な方法は、source{d}エンジンを使うことです。sourced.tech もっと詳しく知りたいですか?Go SFミートアップでの私のプレゼンテーションの録画をご覧ください。 |