Redash1.0.3で日本語を含むTreasureDataのクエリがエラーになる件について

こんにちは、WEBサービス開発部あらためWEBサービス開発グループの伊達です。つい先週部署名が変わりました。

ニフティのウェブサービスでは、サービスの各種データやお客様の行動ログをTreasureDataに蓄積し、Redashで可視化することでサービスの分析に役立てています。

TreasureData

TreasureDataはfluentdやembulkでおなじみのトレジャーデータ社のデータ管理サービスです。類似のサービスには、GoogleのBigQueryがありますね。ニフティでは、@nifty不動産@nifty温泉を始めとした多くのサービスでスマホアプリのイベントデータやウェブサイトのログをTreasureDataに溜めています。

redash

Redashは、RDB、NoSQL、あるいはTreasureDataやBigQueryなどのマネージドサービスのデータソースから抽出したデータをグラフなどで可視化できるソフトウェアです。有償のSaaS版と無償で利用できるOSS版があり、ニフティでは後者を活用しています。

TreasureDataはクエリ課金型ではありませんので、従量課金死の心配なくRedashなどのツールと連携して利用できます。そんな便利なTreasureDataとRedashですが、Redash上で日本語を含むクエリをTreasureDataに対して実行しようとするとエラーになる問題がv1.0.3にあるため、今回はその回避策について共有します。

環境構築から順を踏んで説明しますので、お急ぎの方は「エラーになるクエリ」からお読みください。

Redash環境を作る

今回はDocker Composeで環境を作ります。詳しくは Setting up a Redash instance のDocker Composeの項を参照ください。

  1. docker-compose.yml を用意します。今回はproduction用のをそのまま使います
    (実用する際には、REDASH_COOKIE_SECRETやpostgresのvolumesを設定してください)
  2. docker-compose -f docker-compose.production.yml run --rm server create_db を実行して、データベースの初期化をします
  3. docker-compose -f docker-compose.production.yml upを実行するとRedashが動きます

docker-compose.production.ymlを使いますと、Redash本体はserverとworkerの2コンテナが立ち上がります。manage.pyコマンドを実行するとバージョンの確認ができます。

(※ serverコンテナの名前がredash_server_1だった場合)

2017/06/22現在、redash/redash:latestのイメージを使用すると、上記の通り1.0.3+b2850です。

Adminユーザの設定

Adminユーザの設定

http://サーバのIPアドレス:5000/ にアクセスすると初回のみAdminユーザの設定画面が表示されます。

適当に入力して「Setup」をクリックしてください。

TreasureDataのデータソースを設定

トップ画面

さて、Adminユーザの設定が終わりますと、上記のような画面が表示されます。

データソースを設定しないと始まりませんので、右上のData Sourcesアイコンをクリックしてください。

データソース設定

続けて、「New Data Source」をクリック。

データソースの作成

TreasureDataのサンプルのデータセットをデータソースに設定してみます。Typeにはクエリの種類を指定できます。契約しているプランに応じて、hiveまたはprestoを記入してください。

クエリを実行する

新しいクエリ

さて、やっと本題に入ります。まず、画面上部のメニューの Queries> New Query を選んで新しいクエリの作成画面に遷移します。

クエリを試す

例えばサンプルのデータベース www_access から1行取得してみます。

とクエリ欄に記入してExecuteをクリックすればスクリーンショットのように結果が返ってきます。

そして、例えば以下のようなクエリを実行すると、

クエリ実行結果1

という結果になります。

エラーになるクエリ

ところが、ここで文字列を日本語にするとエラーが発生します。

調べたところ、TreasureDataがデータソースであり、非ASCII文字が含まれている場合には、どんなクエリでもエラーが発生するようでした。

原因

結論としては、Redashが使っているTreasureData接続用のライブラリであるtd-clientのバージョンが古いのが原因です。

requirements_all_ds.txt に依存ライブラリが記載されていますが、1.0.3+b2850ではtd-client==0.4.1となっています。

対処方法

2.0.0を使う

このコミットで使用するtd-clientが0.8.0に変更されていますので、未リリースですが2.0.0であれば問題は改善されています。

Docker Hubのredash/redashには2.0.0のタグもありますので、それを使うのも手です。

td-clientのバージョンを上げる

あるいは、Redashは1.0.3を使いつつ、td-clientのバージョンだけ上げても問題は起きなくなります。本当はイメージをビルドすべきですが、簡単のためコンテナにアタッチしてtd-clientのバージョンだけ上げてみます。

アプリケーションを再起動すれば完了です。

日本語入りクエリ成功

再び日本語を含むクエリを実行してみますと、エラーは起きず結果が得られました。

クエリ実行結果2

ということで、快適な可視化生活を送ることができるようになりました。