LIVESENSE ENGINEER BLOG

リブセンスエンジニアの活動や注目していることを発信しています

Redshiftのメタデータをドキュメント化するツールをdmemoからSchemaSpyに移行した

データプラットフォームグループの毛利です。全社横断のデータ基盤であるLivesense Analytics(以降LA)の開発、運用を行っています。LAではDWHとしてAWS Redshiftを採用しており、社内の誰でも利用できるようにしています。

今回はRedshiftのメタデータ*1をドキュメント化するツールを、dmemoからSchemaSpyに移行した話について紹介していきます。

これまでのドキュメントツール

dmemoとは

LAでは、誰もがデータの内容を理解できるようにするためにメタデータをドキュメント化しています。ドキュメントを管理するツールとして、dmemoを活用していました。
dmemoについては、オープンソースとして公開しているクックパッドさんの記事が詳しいので、ぜひご覧ください。 techlife.cookpad.com

dmemoはRuby on Rails製アプリケーションであり、Redshiftからテーブル定義*2を取得して、Webブラウザから参照できます。テーブル定義は自動的に取得しますが、テーブルコメント*3はWebブラウザで追加更新します。またテーブルコメントは、dmemoが管理するDBに記録されるので、更新履歴を確認することができます。
データ作成者や分析者が更新し、データを用いたコミュニケーション時に役立てていました。

運用課題

dmemoはテーブルコメントをWebブラウザで誰でも簡単に更新できる利点があります。しかし、誰もが簡単に操作できるだけでは誰もやりません。誰がどのタイミングで更新するか、が明確になっていなかったため、数あるテーブルの更新が途絶える結果になりました。
そこで運用方法を見直し、テーブル作成者がデータオーナーとなり、テーブル作成及び更新時にテーブルコメントを更新することにしました。ただ、複数テーブルを一括更新しづらいという別の課題が発生しました。Redshiftのテーブルコメントを利用することができれば一括更新しやすくなるのではないか、そんな時に見つけたツールがSchemaSpyです。

これからのドキュメントツール

SchemaSpyとは

schemaspy.org

DBにあるメタデータをドキュメント化し、HTMLを生成するツールです。 SchemaSpyは、Redshiftをはじめ様々なDBからメタデータを取得してドキュメント化することに特化しています。HTMLなどのファイルを生成するだけなので、DBが不要でシンプルなインフラにできます。

なぜSchemaSpyを選んだか

SchemaSpyは、上述した通りテーブルコメント等を管理するDBは不要で、Redshiftのテーブルコメントを利用することできます。ドキュメントの生成を目的としたツールになります。また、他事業部が管理するDBのドキュメント生成でも使われているので社内でも実績があり、利用もしやすかったので採用しました。

Schemaspyへの移行で引っかかったこと

テーブルコメントの移行

dmemoにはエクスポート機能がないため、dmemoからRedshiftへテーブルコメントを移行するのは苦労しました。地道にWebブラウザからdmemoにあるテーブルコメントを取得しました。取得したテーブルコメントは、LAではテーブル定義をgitでファイル管理しているので、テーブル定義ファイルに追記するようにしました。

CREATE TABLE IF NOT EXISTS schema_1.table_1 (
    col1 character varying(256),
    col2 integer
)
;
 
COMMENT ON TABLE schema_1.table_1 IS 'sample table.';
COMMENT ON COLUMN schema_1.table_1.col1 IS 'hoge.';
COMMENT ON COLUMN schema_1.table_1.col2 IS 'fuga.';

メタデータの更新履歴はgit上で確認することができます。またファイル管理のため、一括更新しやすくなりました。

Redshift Spectrumの対応

LAではS3に格納されているデータをRedshiftで分析するため、Redshift Spectrumを活用しています。Redshift Spectrumは外部テーブルでRedshiftとは異なり、テーブルコメントは弊社の設定ではGlueデータカタログで管理されています。Redshiftが用意するシステムテーブルからテーブル定義は取得できますが、テーブルコメントは取得できませんでした。そこで、SchemaSpyではxmlファイルによりコメントを追加することができるので、その機能を利用することにしました。

SchemaSpy公式ドキュメントより抜粋)

<schemaMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schemaspy.org/xsd/6/schemameta.xsd" >
    <comments>Database comment</comments>
    <tables>
        <table name="ACCOUNT" comments="Table comment">
            <column name="accountId" comments="Column comment"/>
        </table>
    </tables>
</schemaMeta>

またRedshift Spectrumのテーブル定義は、SchemaSpyが用意するDatabaseTyperedshiftでは取得できないため、独自DatabaseTypeを使うようにしました。
Redshift Spectrum用のプロパティファイルを用意します。

connectionSpec=jdbc:redshift://<hostOptionalPort>/<db>
driver=com.amazon.redshift.jdbc42.Driver
selectTablesSql=SELECT table_name, table_schema FROM SVV_TABLES WHERE table_schema = :schema

HTML生成時に、上記プロパティファイル及びxmlファイルを用いることで対応しました。

複数スキーマの対応

SchemaSpyは単一スキーマのドキュメントをHTMLに出力しますが、LAではRedshift上に複数のスキーマを保有しています。複数スキーマのドキュメントを生成するのに一工夫必要でした。
シェルスクリプトでスキーマ毎にHTMLを生成して、出力先のフォルダにドキュメント情報を格納します。出力先フォルダのファイル構成は、次のようになります。

- output
  - schema_1
    - index.html
    - tables
      - table_1.html
      - table_2.html
      - table_3.html
    - …
  - schema_2
    - index.html
    - tables
      - table_1.html
      - table_2.html
    - …
  …
  - schema_n
    - index.html
    - tables
      - table_1.html
    - …

単一スキーマであれば、index.htmlを起点にメタデータを確認することができます。しかし、これでは複数スキーマを横断して確認することができません。
そこで、シェルスクリプトで出力先フォルダのファイル情報を元に、各スキーマ及びテーブルのリンクを集めたトップページを作成することで、複数スキーマに対応しました。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8" />
        <title>SchemaSpy</title>
        <link rel="stylesheet" href="sakura.css" type="text/css">
    </head>
    <body>
        <h1>SchemaSpy リンク集</h1>
        <h2>スキーマ一覧</h2>
        <ul>
          <li><a href="./schema_1/">schema_1</a></li>
          <li><a href="./schema_2/">schema_2</a></li>
          <li><a href="./schema_n/">schema_n</a></li>
        </ul>
        <h2>テーブル一覧</h2>
        <ul>
          <li><a href="./schema_1/tables/table_1.html">schema_1.table_1</a></li>
          <li><a href="./schema_1/tables/table_2.html">schema_1.table_2</a></li>
          <li><a href="./schema_1/tables/table_3.html">schema_1.table_3</a></li>
          <li><a href="./schema_2/tables/table_1.html">schema_2.table_1</a></li>
          <li><a href="./schema_2/tables/table_2.html">schema_2.table_2</a></li>
          <li><a href="./schema_n/tables/table_1.html">schema_n.table_1</a></li>
        </ul>
    </body>
</html>

おわりに

今回のSchemaSpyへの移行を通じて、Redshiftのテーブルコメントを最新化することができました。ただドキュメントは継続的に更新していかないと、あっという間に情報が古くなってしまいます。定期的に情報を更新していくには、メタデータのメンテナンスのしやすさが重要です。「ここをみれば、テーブル情報が分かる」そう認知し続けてもらうために、ドキュメントの整備を続けていきます。

dmemoは長年の間、大変お世話になりました。dmemoの開発者の皆様、本当にありがとうございました。

*1:本ブログでは総じて、「テーブル定義」及び「テーブルコメント」をメタデータと呼びます。

*2:テーブルのカラム名及びデータ型、制約等を指します。

*3:テーブル及びカラム説明を指します。