Secret Ninja Blog

Support Engineering Manager してます

SupersetとTreasureDataの暫定的な連携方法(パッチ必要有)

SupersetとTreasureDataの連携方法について、2019年3月31日時点での暫定的な手順を紹介します。

背景

OSSのBI / Dashboardツールとして、redash / superset / Metabaseが日本で今の所人気かなと思っています。 このうちのredash / metabaseについての接続方法については、あれこれ検証したりpluginをつくったりして、Treasure Dataに対してクエリを実行することが可能になっています。

ただ、supersetについてはPrestoのAPIを使ってのアクセスができず、何度か手元で試しては諦めてしまっていました。 (supersetでDBとの接続に利用しているSQL Alchemyというライブラリとかに対して素人なので何が原因かの判断がつけられていなかったため。)

ひさしぶりにもう一回トライした結果、原因が特定できたので、修正のPRを作り、下記のPRがPyHiveに取り込まれるとTreasureDataに接続できるようになります。

Fix get/delete requests in Presto to accept headers by toru-takahashi · Pull Request #200 · dropbox/PyHive · GitHub

具体的には、Treasure DataのPrestoのAPIエンドポイントではPrestobaseというゲートウェイサーバが認証の仕組みを提供しています。 Prestobaseでは、X-Presto-Userというヘッダー情報に含まれるTDのAPIKEYを元に認証を行います。 しかし、Prestoへのリクエストを行うライブラリPyHiveにて、GETリクエストを行う際にヘッダー情報を含んでおらず、認証エラーが発生する状態になっていたことが原因でした。

上記のPRにより下記の方法で現在のところ接続が可能です。

接続方法

PyHiveにパッチを適用する(暫定対応)

SupersetからTreasureDataにアクセスするためには、まず上記PRを取り込む必要があります。下記のパッチをapplyしましょう (パッチ作成時点では、pyhiveのバージョンはv0.5.1です。)

pyhive.patch · GitHub

インストール済みのsupersetのサーバにて、PyHiveインストールディレクトリ移動してパッチを適用します。

patch -u presto.py < pyhive.patch

もしもライブラリのディレクトリにpresto.pycがあれば、それは削除して、supersetを起動してください。

Treasure Dataへの接続設定方法

  • SQLAlchemy URIの設定
presto://api-presto.treasuredata.com/td-presto/<default_db_name>
  • Extraの設定
{
    "metadata_params": {},
    "engine_params":{"connect_args":{"username":"TD_APIKEY","port":443,"protocol":"https"}}
}

f:id:toru-takahashi:20180331130942p:plain

これで接続の設定は完了です。あとは、supersetの他の接続と同じようにTableの設定などを実施してください。

テーブル設定の推奨

Superset自体の設定に詳しくないのでこれがベストかは不明ですが、下記を考慮ください。

Treasure Dataのテーブルは、timeカラム(unixtime)のデータをベースにhourlyベースでパーティショニングが行われています。 supersetではそれをbigintのデータとして扱ってしまうので、時間のデータとして扱えません。 そのため、テーブルの設定にて、下記の設定をしておくとtimestamp型としてデフォルトで扱えるので良いかと思います。

  • Type: TIMESTAMP
  • Expression: CAST(TD_TIME_FORMAT(time, 'yyyy-MM-dd HH:mm:ss') AS TIMESTAMP)
  • Is temporal: TRUE

f:id:toru-takahashi:20180331132104p:plain

PRがPyHiveに取り込まれると簡単に使えるようになるので、使いたい方はPRにいいね!をしておいてもらえると嬉しいです。