Quantcast
Channel: treasuredata - IDCF テックブログ
Viewing all 15 articles
Browse latest View live

Yahoo!ビッグデータインサイトを使ってみた

$
0
0

※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。

本日2014年9月25日 10時にYahoo!ビッグデータインサイトがリリースされました! やっとリリースできました。。。私自身は今年の4月からこのサービスに関わっていますが、長い人は1年以上このサービスに関わっている人もいてなかなか感慨深げでした。

さてリリースされた嬉しさもあり、初めてのエンジニアブログを書くこととなりました。

今回はYahoo!ビッグデータインサイトへの初めてのエントリーですので、簡単なサービス概要と簡単な使い方としてWebサーバーであるNginxのログデータをtd-agent経由でYahoo!ビッグデータインサイトに放りこむ手順をご紹介します。

Yahoo!ビッグデータインサイトに記載があるように、すぐにアカウント登録でき簡単に使い始められることを実感していただけると思います。

Yahoo!ビッグデータインサイトとは

サービスページに色々書かれていると思いますが、個人的には以下だと思っています。

  • 大容量データを貯めるための箱
  • 大容量データを効率的に分析するための基盤
  • 分析対象データのアップロード、分析結果のアウトプットを補助してくれるツールが豊富なサービス

Visualization機能は提供しておりませんが、Visualization以外のデータ分析の機能を提供してくれるサービスだと思っています。

今回やること

IDCフロンティアが提供するセルフクラウドで作成したVM(Ubuntu 12.04)上のWebサーバー(Nginx 1.1.19)のログをtd-agent経由でYahoo!ビッグデータインサイトにアップロードさせてみます。

セルフクラウドのVMでなければ動作しない手順でもないと思うので是非皆様の環境でお試しください。 それでは始めてみましょう。

注:ここではNginxがインストールされていることを前提とします。

SingUp

SignUpがまだの方はSignUpページで必要事項を入力しサインアップをしてください。
迷うことはあまりないかもしれませんが、手順書も用意しているのでよければ参照してください。
f:id:blog-idcf:20160225205050p:plain

CLIのインストール

コマンドラインで作業をした方が楽なので、Yahoo!ビッグデータインサイトのCLI(Command Line Interface)をインストールします。 Nginxを入れているサーバーに入れる必要はありませんが、ここでは同じサーバーにインストールします。 まずは以下のコマンドRubyGemsをインストールします。

$ sudo apt-get install rubygems

CentOSの場合は以下のコマンドでインストールします。

$ sudo yum install rubygems

以下のコマンドでgemでCLIツールをインストールします。

$ sudo gem install td

td-agentのインストール

Nginxをインストールしているサーバーにログインします。 td-agentは以下のコマンドでインストールすることができます。

$ curl -L http://ybi-toolbelt.idcfcloud.com/sh/install-ubuntu-precise.sh | sh
$ sudo td-agent --version
td-agent 0.10.50

お使いの環境がCentOSの場合は以下のコマンドでtd-agentをインストールすることができます。

$ curl -L http://ybi-toolbelt.idcfcloud.com/sh/install-redhat.sh | sh

API-Keyの取得

td-agent経由でYahoo!ビッグデータインサイトにデータをアップロードするためにはAPI-Keyが必要となります。
API-Key取得のためには、まずは先ほどサインアップしてもらったアカウントでWebConsoleでサインインします。

SignIn後にWebConsoleの画面上部右のAccount > My Profile をクリックし、Profile画面を表示させます。

API Keysパネルでパスワードを入力して、Show KeysボタンをクリックすることでAPI-Keyが取得できます。

アップロード先DBの作成

Nginxのログデータを格納するDBを作成します。

まずはCLIをインストールしたサーバーで以下のコマンドを実行し、Yahoo!ビッグデータインサイトにログインします。

$ td -e http://ybi.jp-east.idcfcloud.com account -f your_email_address@example.com
Enter your Treasure Data credentials.
Password (typing will be hidden):
Authenticated successfully.
Use 'td -e http://ybi.jp-east.idcfcloud.com db:create <db_name>' to create a database.
$

次に以下のコマンドでDBを作成します

$ td -e http://ybi.jp-east.idcfcloud.com db:create nginx

td-agentの設定

td-agentをインストールしたサーバーにログインし、以下のように設定ファイル(/etc/td-agent/td-agent.conf)を編集します。

 # Tailing the Nginx Log<source>
  type tail
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx-access.pos
  tag td.nginx.access
  format nginx</source>
# Treasure Data Input and Output<match td.*.*> 
  type tdlog
  apikey ${your_api_key}
auto_create_table
buffer_type
file buffer_path /var/log/td-agent/buffer/td
endpoint http://ybi.jp-east.idcfcloud.com
flush_interval 10s
use_ssl true
</match>

上記のざっくりした意味ですが、

  • source type: tailを指定して新規で追加されたログを取得することを指定してます。
  • source path: 監視対象のパス
  • source tag: 監視対象のtag付けをして以降で設定しているmatchの処理を行うようにしている。td.nginx.accessはYahoo!ビッグデータインサイト上のnginxというDBのaccessというテーブルにデータを登録するような指定をしています。
  • flush_interval: ログデータの送出間隔を指定しています。

となります。 以上でログをアップロードさせる準備は整いました!

データアップロードの確認

さてここからが本番・・・と言いつつ準備が長くてこちらの方が文章的には短いのですが。。。

まずはNginxを起動します。

$ sudo service nginx start

次にtd-agentを起動します。

$ sudo /etc/init.d/td-agent start

次に確認のためにcurlコマンドでNginxサーバーにアクセスしてみます。 念のため5回アクセスします。

$ curl http://localhost
$ curl http://localhost
$ curl http://localhost
$ curl http://localhost
$ curl http://localhost
$ sleep 10

Nginxのログは以下のように出力されます。

$ sudo cat /var/log/nginx/access.log
127.0.0.1 - - [14/Aug/2014:01:26:09 +0900] "GET / HTTP/1.1" 404 169 "-""curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
127.0.0.1 - - [14/Aug/2014:01:26:11 +0900] "GET / HTTP/1.1" 404 169 "-""curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
127.0.0.1 - - [14/Aug/2014:01:26:12 +0900] "GET / HTTP/1.1" 404 169 "-""curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
127.0.0.1 - - [14/Aug/2014:01:26:12 +0900] "GET / HTTP/1.1" 404 169 "-""curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
127.0.0.1 - - [14/Aug/2014:01:26:13 +0900] "GET / HTTP/1.1" 404 169 "-""curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"

さていよいよYahoo!ビッグデータインサイトにデータが含まれているかを確認します。 CLIを利用して以下のコマンドでnginx.accessのデータ件数を確認します。

$ td table:list nginx
+----------+--------+------+-------+--------+---------------------------+---------------------------+-----------------------------------------------------------------------------------------------------------------------------+
| Database | Table  | Type | Count | Size   | Last import               | Last log timestamp        | Schema                                                                                                                      |
+----------+--------+------+-------+--------+---------------------------+---------------------------+-----------------------------------------------------------------------------------------------------------------------------+
| nginx    | access | log  | 5     | 0.0 GB | 2014-08-14 01:26:13 +0900 | 2014-08-14 01:26:13 +0900 | host:string, path:string, method:string, referer:string, code:string, remote:string, agent:string, user:string, size:string |
+----------+--------+------+-------+--------+---------------------------+---------------------------+-----------------------------------------------------------------------------------------------------------------------------+

データが5件入っていることがわかるかと思います。 内容も確認してみます。

$ td query -w -t hive -d nginx "SELECT * FROM access"
+------+------+--------+---------+------+-----------+-----------------------------------------------------------------------------------------------------+------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
| host | path | method | referer | code | remote    | agent                                                                                               | user | size | v                                                                                                                                                                                                                                                | time       |
+------+------+--------+---------+------+-----------+-----------------------------------------------------------------------------------------------------+------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
| -    | /    | GET    | -       | 404  | 127.0.0.1 | curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 | -    | 169  | {"host":"-","user":"-","path":"/","referer":"-","method":"GET","code":"404","size":"169","time":"1407947169","remote":"127.0.0.1","agent":"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"} | 1407947169 |
| -    | /    | GET    | -       | 404  | 127.0.0.1 | curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 | -    | 169  | {"host":"-","user":"-","path":"/","referer":"-","method":"GET","code":"404","size":"169","remote":"127.0.0.1","time":"1407947171","agent":"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"} | 1407947171 |
| -    | /    | GET    | -       | 404  | 127.0.0.1 | curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 | -    | 169  | {"host":"-","user":"-","path":"/","referer":"-","method":"GET","code":"404","size":"169","remote":"127.0.0.1","time":"1407947172","agent":"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"} | 1407947172 |
| -    | /    | GET    | -       | 404  | 127.0.0.1 | curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 | -    | 169  | {"host":"-","user":"-","path":"/","referer":"-","method":"GET","code":"404","size":"169","remote":"127.0.0.1","time":"1407947172","agent":"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"} | 1407947172 |
| -    | /    | GET    | -       | 404  | 127.0.0.1 | curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 | -    | 169  | {"host":"-","user":"-","path":"/","referer":"-","method":"GET","code":"404","size":"169","remote":"127.0.0.1","time":"1407947173","agent":"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"} | 1407947173 |
+------+------+--------+---------+------+-----------+-----------------------------------------------------------------------------------------------------+------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
5 rows in set

正しくデータが入っていることがわかるかと思います。

おわりに

いかがでしたでしょうか。 Yahoo!ビッグデータインサイトのサインアップからNginxのログをアップロードするまでを説明しましたが、簡単でしたでしょうか。 このコンテンツを作るには思いのほか時間がかかった(3hぐらいorz)のですが、作業自体は簡単にできたと思います。

今回はNginxのログをYahoo!ビッグデータインサイトにアップロードする手順を説明させてもらいましたが、もちろん独自アプリケーションログをアップロードすることもできますし、最近TreasureData社では各種SDKの開発に力を入れており、Javascript SDK、Android SDKなどを用いることでユーザの操作ログを取得することも可能です。

また解析結果の出力機能も充実しており、最近ではTableauに出力させることもできますし、Google SperadSheet、さらにオブジェクトストレージにも出力させることができます。

是非Yahoo!ビッグデータインサイトを試してみてください!利用は無料なのでw 長くなってきたので、このへんで。

<関連記事>


Yahoo!ビッグデータインサイトでクエリ結果を出力してみる

$
0
0

こんにちは。UX開発部の上野晶鋭です。

こういうブログを書くと挨拶に何を使うか迷いますよね^^;とりあえず今日は、こんにちはで!

今回は前回に引き続いてのYahoo!ビッグデータインサイトネタとなります。 前回はデータをアップロードするまでを記載したので、今回はクエリを実行して実行結果を保存するまでを記載します。

前回の「Yahoo!ビッグデータインサイトを使ってみた」に記載したのですが、Yahoo!ビッグデータインサイトは解析基盤であって、SQLライクなクエリを受け取って分散エンジンを使って解析を行うのが主な機能となります。WebConsoleで解析結果を共有することはできなくはないですが、Visualiztion(視覚化)やクラスタ分析などの高度な統計解析は苦手であり、その分野は他のツールを利用するのが良いのかなと思います。

そのためには解析結果を外部に出力する必要がありますが、そのインターフェースはTreasureData社が随時作成しており、MySQLやPostgreSQLやオブジェクトストレージなどに簡単に出力させることができます。

MySQLやPostgreSQLに出力する場合はスイッチやルータによるルーティング設定が必要なので、今回は内部サーバーに比べて比較的容易に準備と設定ができるGoogleSpreadSheetに解析結果を出力する方法をご紹介します。

まずはじめに

まずはYahoo!ビッグデータインサイトのアカウントをSignUpページで取得します。 取得方法は前回書いた「Yahoo!ビッグデータインサイトを使ってみた」を参照してください。

次にGoogleアカウントを取得します。方法は・・・多分分かると思いますので割愛します。

今回やること

今回やることは次の二つとなります。

  • WebConsole経由で解析結果をGoogleSpreadSheetに出力する
  • CLI(Command Line Interface)を利用して解析結果をGoogleSpreadSheetに出力する

今回利用する環境はIDCフロンティアが提供するセルフクラウドで作成したVM(Ubuntu 12.04)となりますが、もちろん他の環境でも動くと思いますので是非お試しください。

それでは始めてみましょう!

注:ここではCLIがインストールされていることを前提とします。インストール方法は、「Yahoo!ビッグデータインサイトを使ってみた」を参照してください。

Googleアプリ固有パスワード取得

こちらは2段階認証プロセスを設定している方は実行してください

Googleアカウントで2段階認証プロセスを設定している場合は、Yahoo!ビッグデータインサイトはアカウントのパスワードでGoogleのリソースにアクセスすることができません。 アクセスするためにはGoogleアプリ固有パスワードというものを取得する必要があります。

まずはGoogleのアカウント詳細ページにアクセスします。


セキュリティタブを選択して、アプリパスワード > 設定ボタンを押してアプリパスワード設定画面に遷移します。

端末を選択プルダウンメニュで、その他を選択します。

名前は適当なものを入力してください。ここではYahoo!ビッグデータインサイトと入力しています。 入力後生成ボタンを押します。

そうするとアプリ固有パスワードが表示されます。 これは後で利用するので記録しておいてください。

解析結果の出力先SpreadSheetの準備

解析結果を出力するSpreadSheetを作成しておきます。 ここではwww_accessという空のSpreadSheetを用意しています。


出力してみる

さて準備が整ったので解析結果を準備したGoogleSpreadSheetに出力してみます。 まずはWebConsoleで試してみます。 SignInページにアクセスして、ログインします。

次にNew QueryタブをクリックしてNew Query画面を表示させます。

ここでクエリの設定をします。 今回はYahoo!ビッグデータインサイトにデフォルトで存在するsample_dbのwww_accessというテーブル内のレスポンスコードが200以外のレコードを検索しています。

次にクエリ結果の出力先の設定をします。
Result Export > Export result to > Google Spreadsheetを選択して、Result Location設定をします。 Export typeにGoogle Spreadsheetを選択して、Email、PasswordにGoogleアカウントのEmailアドレスとパスワードを入力してCreateボタンを押します。
2段階認証プロセスを設定している方はGoogleアプリ固有パスワードを設定してください。

次にSpreadSheet名とワークシート名を入力します。 Spreadsheetに'www_access'、Worksheetに'error'を入力します。 これで準備が整いました。Runボタンを押すことでJobを実行します。

問題ない場合はSuccessと表示されJobは終了するはずです。
Job終了後、先ほど作成したSpreadSheetにアクセスしてみます。正常ならばerrorシートが作成されて、レコードが次のように出力されているはずです。

CLIを利用する場合は次のコマンドで同様のことができますのでお試しください。


$ td query --result 'gspreadsheet://${account}:${password}@gmail.com/hogehoge/test6' -w -d sample_db "SELECT * FROM www_access WHERE code != 200"

${email}にはGoogleアカウントの@以前を入力してください。

おしまいに

いかがでしたでしょうか。 結構簡単にGoogleSpreadSheetに解析結果を出力できることを確認していただけたかなと勝手に思っています。

とりあえず大量のログなどのデータをYahoo!ビッグデータインサイトに放り込んでいただき、ある期間のデータ、またはある特定のデータ、例えば今回のようなエラーデータをGoogleSpreadSheetに出力してもらって、あとはSpreadSheetでデータを解析してみたり、情報を共有するという使い方もありかなと思います。

是非お試しください! それでは!

<関連記事>

IDCFのMr. ビッグデータにインタビュー ~Yahoo!ビッグデータインサイトのハンズオンでお待ちしています!

$
0
0

11/28(金)IDCフロンティア本社で、Yahoo!ビッグデータインサイトのハンズオン「誰にでもできる!ビッグデータ分析基盤の構築術~td-agentで収集したログはこう分析する~新規ウィンドウを開きます」を行います。 今回はハンズオンの講師、UX開発部 上野にインタビューしてみました!

■社内一ビッグデータに詳しい、いわばミスタービッグデータとして今回講師に選ばれたと思うのですが、普段のお仕事は?

「ミスタービッグデータ」のところは触れずに行きますね^^ 普段は社内用システムの開発やIDCFクラウドのAPIのメンテナンス。 Yahoo! ビッグデータインサイト関連では、このサービスを開発しているトレジャーデータ社と開発中の機能や、課題の解決方法についてスケジュールの共有、協議をしています。営業同行、手順作成などなどもありますね。

■今回のハンズオンではどんなことを?

簡単に言うとWebサーバーであるNginxのログデータをYahoo!ビッグデータインサイトへストリーミングでアップロードするまでを実施します。環境はIDCFクラウドを利用します。

■ビッグデータ分析基盤の導入というと敷居が高そうですが・・?

そうですね、自前で構築するとなるとHadoopのチューニングも大変ですし、物理マシンの場合はマシン台数が多くなると機器の故障も多くなり、機器交換も大変でしょうね^^; ただこのYahoo!ビッグデータインサイトは上記チューニング作業や運用をしなくていいいので、RDBよりも敷居が低いと思います。 データは自前で用意しないといけないですけど(笑)

■Yahoo!ビッグデータインサイトのここが好き!というところは?

クライアントツールが豊富で高機能なところです。 特にJavascript SDKは自動で値を取得できるメソッドがあって、初めて使ったときは至れり尽くせりのクライアントだなと。

■ハンズオンに参加するにあたって事前準備はありますか?

ないです! 資料に仮想マシンの作成から各種設定の方法を記載していますし、当日やりながら理解できる内容だと思います。 皆さんのご参加をお待ちしております。

いかがでしたでしょうか?少しでも興味を持たれた方は

是非11/28(金)のハンズオンにご参加ください!

プライベートコネクト経由でYBIにデータをimport/exportする

$
0
0

はじめに

Yahoo!ビッグデータインサイト(以下YBI)を用いて、大量のデータを容易に分析することができますが、重要なデータをインターネット上でやりとりしたくない、そもそもインターネット接続なんてさせていない、みたいなケースがしばしばあるかと思っています。

データを扱う上でセキュリティは無視できないもの、切っても切り離せない永遠の課題です。 IDCFクラウド(オンプレでも可)ではプライベートコネクトを用いて、プライベートなネットワーク上でYBIに対してデータのimport/exportを行なうことが可能です。 (プライベートコネクトというのは、プライベートでセキュアなネットワーク、いわゆるVPNと考えてください)

f:id:inoueissei:20160920112423p:plain

プライベートコネクト側の設定

プライベートコネクト側の設定はいたって簡単です。3分くらいで終わります。 まず、プライベートコネクトのコンソール画面でYahoo!ビッグデータインサイトの接続を選択し、 f:id:inoueissei:20160920145908p:plain

任意のネットワークアドレス、プライベートIPを設定します。 つまりユーザー側で好きなプライベートIPの指定が可能です。 f:id:inoueissei:20160920112524p:plainこの例の設定では、YBIのAPIに対して192.168.20.1で、YBIのコンソールに対して192.168.20.2でアクセスできるようになります。

YBIではAPIエンドポイントに対してデータのimportを行います。以上でimport用の設定は完了です。

次にexport用の設定です。 exportはユーザーマシン(FTP、MySQL、APIサーバーなど)に解析データをexportする機能です。

"Result Export先Host"部分にexport先のマシンのプライベートIPアドレスを入力し、を押すとexport用のFQDNが自動でアサインされます。 f:id:inoueissei:20160920112600p:plainこの例では192.168.1.1のFTPサーバーと192.168.10.1のMySQLサーバーをexport先に登録する形になります。

以上でプライベートコネクト側の設定は完了です。

実際の利用方法

YBIのアカウント作成、マシン側のtd(CLIツール)、td-agentインストールまでは完了しているとします。 YBIの基本的な使い方はこちらを参考にしてください。

td コマンドを使用する際に、URL部分に先ほどのAPI用のプライベートIPを指定します。 (通常はybi.api.idcfcloud.netの部分) 例えば、下記はプライベートコネクト経由でnginx用のDBにtest というTableを作成しています。

td -e http://192.16.20.1 table:create nginx test

YBI側のコンソールを確認してみると、確かにnginxのDBにtestのTableが作成されています。 (このコンソール画面にも192.168.20.2のプライベートIPでアクセスできます。) f:id:inoueissei:20160920112638p:plain

td-agent側の設定は、/etc/td-agent/td-agent.conf で設定します。

<source>
  type tail
  format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)")?/
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx-access.pos
  tag td.nginx.test
 </source>
<match td.*.*>
  @type tdlog
  apikey 123456789012345678901234567890
  auto_create_table
  buffer_type file
  buffer_path /var/log/td-agent/buffer/td
  endpoint http://192.168.20.1   ###ここをAPIエンドポイントIPにする###
  flush_interval 10s
  <secondary>
    @type file
    path /var/log/td-agent/failed_records
  </secondary>
</match>

上記の例だと、nginxのアクセスログが、td-agentを用いて、192.168.20.1がアサインされているYBIのnginx.testにimportされていきます。当然インターネットは経由しません。

実際はこんな感じでアクセスログのデータが溜まっていきます。 f:id:inoueissei:20160920112710p:plain

YBIではデータを解析した結果を抽出するというResult Exportという機能があります。 プライベートコネクト経由でユーザーマシンにexportする際には、YBIのResult Exportの設定画面で、Hostの部分に 専用のFQDNを入れる必要があります。(※プライベートIPだと期待した動作にはならないので注意してください。)

f:id:inoueissei:20160920112734p:plain

これで適切なSQL文を書いて、実行(Run)すると、192.168.10.1 のMySQLマシンに結果がexportされます。

Yahoo!ビッグデータインサイトへのJavascriptによる情報アップロード

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

はじめに

こんにちは、UX開発部の上野です。
最近冷えてきたので、くるぶしソックスを止めようかなと思っています。ただスニーカーにはくるぶしソックスが一番似合っているかなと思っているので、その点が悩ましいところです。 さて、今回はタイトル通りJavascriptで情報をYahoo!ビッグデータインサイトへデータをアップロードする方法を記載します。Javascriptは米国トレジャーデータ社が提供するSDKを利用して実装します。 今回やることの概要図は以下となります。
f:id:toshimi727:20160225170938p:plain

そもそもなぜJavascriptで情報を取得する必要があるのか、というところですが理由は以下となります。

  • SPA(Single Page Application)に対応できるため
  • クライアントの情報はクライアントからが自然なため

まず一点目ですが、最近のWebアプリケーションの大きな流れとしてSPA(Single Page Application)というものがあります。SPAの場合ですと、基本的にはクライアント(ブラウザ)はサーバーと通信せず、画面遷移などの処理はクライアントが独立して行います。その場合ですとサーバー側でページ遷移などのイベントは検知できないので、クライアント側で実行されるJavascriptで情報を取得する必要があります。
次に二点目ですが、SPAが実現できることから最近はクライアントとなる各デバイスの性能は向上しています。情報取得処理がクライアントの負荷とならないなら、クライアントの情報はクライアントから取得するのが適当なのかなと思います。(これは個人的な意見ですが。)

さてこれまでの話でクライアントの情報はJavascript経由で取得するのが、Webアプリケーションの大きな流れとして必要であり、正しい姿だと理解して頂ければ幸いです。理解できないよ!そんな流れではない!というご意見の方も・・・少々お付き合いください。

それでは始めましょう!

前提条件

以下前提条件となります。

  • Yahoo!ビッグデータインサイトのアカウントを持っていること
  • 以下の条件を満たすUbuntu14.04マシンを持っていること
    • Webサーバーをインストールできる
    • ブラウザでアクセスできる
  • Yahoo!ビッグデータインサイトのCLIツールをインストール済みであること*

*CLIツールインストールにはRuby1.9以上が必要となりますのでご注意ください。

Ubuntu14.04の場合は、インストール直後でRuby1.9以上であるので以下のコマンドでCLIツールをインストールすることができます。


$ sudo apt-get update
$ sudo apt-get install make ruby-dev
$ gem install td
$ echo 'export TD_API_SERVER=http://ybi.jp-east.idcfcloud.com'>>
~/.bash_profile
$ source ~/.bash_profile
$ env | grep TD
TD_API_SERVER=http://ybi.jp-east.idcfcloud.com
$

その他の環境をお使いの方はYahoo!ビッグデータインサイトご利用ガイドの第4章を参照してください。

実証は弊社クラウドサービスであるIDCFクラウド上のUbuntu14.04の仮想マシンで行っているので上記の前提条件としていますが、同じことはもちろん他のOSディストリビューションでもできますので是非お試しください。

今回やること

今回やることは以下となります。

  • Step1:Webサーバーのインストール(Nginx)
  • Step2:Yahoo!ビッグデータインサイトの準備 - DB/Table作成編
  • Step3:Yahoo!ビッグデータインサイトの準備 - WriteOnlyApiKeyの取得
  • Step4:HTMLファイルの編集 - Javascript SDKの埋め込み
  • Step5:アップロード確認

Step1:Webサーバーのインストール(Nginx)

まずはクライアントであるブラウザからアクセスさせるWebサーバーを準備します。 今回はNginxをインストールします。

Step1-1:ログイン

まずはお使いのUbuntu14.04にsshなどの方法でログインします。

Step1-2:Nginxのインストール

以下のコマンドでNginxをパッケージインストールします。


$ sudo apt-get install nginx
$ nginx -v
nginx version: nginx/1.4.6 (Ubuntu)
$

Step1-3:サンプルページの準備

Nginxがデフォルトで用意しているindex.htmlにJavascript SDKを埋め込んでもいいのですが、今回は以下の二つのサンプルHTMLを用意しました。


$ tree /usr/share/nginx/html/
/usr/share/nginx/html/
├── ybi_main.html
└── ybi_sub.html

0 directories, 2 files
$

こちらがメインページとなります。

<!-- ybi_main.html --><!doctype html><!--[if lt IE 9]><html class="ie8" lang="ja"><![endif]--><!--[if (gte IE 9)|!(IE)]><!--><html lang="ja"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="format-detection" content="telephone=no"><meta name="description" content="YBI JS SDK Test"><title>YBI Javascript Sample</title></head><body data-category="top"><div id="user_info"><div id="user_mail">
    hogehoge@example.com</div><div id="user_name">
    hogehoge</div><div id="link"><a href="/ybi_sub.html">ybi_sub.html</a></div></div></body></html>

こちらがメインページ(ybi_main.html)からリンクが張られているサブページ(ybi_sub.html)となります。

<!-- ybi_sub.html --><!doctype html><!--[if lt IE 9]><html class="ie8" lang="ja"><![endif]--><!--[if (gte IE 9)|!(IE)]><!--><html lang="ja"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="format-detection" content="telephone=no"><meta name="description" content="TD JS SDK Test"><title>YBI Javascript Sample</title></head><body data-category="top"><div id="user_info"><div id="user_mail">
    hogehoge@example.com</div><div id="user_name">
    hogehoge</div><div id="link"><a href="/ybi_main.html">ybi_main.html</a></div></div></body></html>

これらにブラウザからアクセスしてみるとそれぞれ次のように表示されます。

  • ybi_main.html

  • ybi_sub.html

user_mail、user_nameという属性にそれぞれ"hogehoge@example.com"、"hogehoge"という値を設定しています。
以降はこれらのページに対してJavascriptを埋め込んで行きます。

Step2:Yahoo!ビッグデータインサイトの準備 - DB/Table作成編

さて次にYahoo!ビッグデータインサイトの準備を行います。 準備といってもデータアップロード先となるDB/Tableを作成するだけとなります。

Step2-1:DB作成

さてここではCLIツールを利用して以下のコマンドでDBを作成します。


$ td db:create js_sdk_db

Step2-2:Table作成

次に先ほど作成したjs_sdk_dbというDBに対してTableを作成します。 以下のコマンドで作成します。


$ td table:create js_sdk_db js_sdk_table

さてこれでデータのアップロード先の準備は整いました。

Step3:Yahoo!ビッグデータインサイトの準備 - WriteOnlyApiKeyの取得

アップロードされるデータとアカウントを紐付けるためにデータアップロード時にはApiKeyが必要となります。 ApiKeyには以下二つのApiKeyがあります。

  • MasterApiKey: そのアカウントに権限あるデータソースに対して読み取り/書き込み可能なApiKey
  • WriteOnlyApiKey: そのアカウントに権限があるデータソースに対して書き込むことが可能なApiKey

今回のケースですと、あるサイトにアクセスする不特定多数のクライアントに対して、ばらまくことを想定しておりますので、後者のWriteOnlyApiKeyを利用するのが良いかと思います。

Step3-1:Consoleログイン

まずはConsoleにアクセスしてログインします。

Step3-2:My Profile画面の表示

次に、 ヘッダメニュー > Account名 > My Profile でMy Profile画面を表示させます。

Step3-3:ApiKeyの表示

API Keysパネルでアカウントのパスワード入力後にShow Keysボタンを押下します。

Step3-4:WriteOnlyApiKeyの取得

これでWriteOnlyApiKeyが表示されるはずです。 まだ取得していいなければ、Generate Newボタンを押下して取得してください。

Step4:HTMLファイルの編集 - Javascript SDKの埋め込み

さてこれでアップロードする準備が整いましたので、これからデータをアップロードするためのJavascriptを埋め込んでいきます。

Step4-1:メインページ(ybi_main.html)の編集

以下TreasureData社が提供するJavascript SDKを埋め込んだ/usr/share/nginx/html/ybi_main.htmlとなります。 各コードの説明はStep4-3で行います。

<!-- /usr/share/nginx/html/ybi_main.html --><!doctype html><!--[if lt IE 9]><html class="ie8" lang="ja"><![endif]--><!--[if (gte IE 9)|!(IE)]><!--><html lang="ja"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="format-detection" content="telephone=no"><meta name="description" content="YBI JS SDK Test"><title>YBI Javascript Sample</title><script type="text/javascript">
    !function(t,e){if(void 0===e[t]){e[t]=function(){e[t].clients.push(this),this._init=[Array.prototype.slice.call(arguments)]},e[t].clients=[];for(var r=function(t){return function(){return this["_"+t]=this["_"+t]||[],this["_"+t].push(Array.prototype.slice.call(arguments)),this}},s=["addRecord","set","trackEvent","trackPageview","ready"],n=0;n<s.length;n++){var i=s[n];e[t].prototype[i]=r(i)}var a=document.createElement("script");a.type="text/javascript",a.async=!0,a.src=("https:"===document.location.protocol?"https:":"http:")+"//s3.amazonaws.com/td-cdn/sdk/td-1.2.0.js";var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(a,c)}}("Treasure",this); /* JavaScript SDK の読み込み*/
  </script></head><body data-category="top"><div id="user_info"><div id="user_mail">
    hogehoge@example.com</div><div id="user_name">
    hogehoge</div><div id="link"><a href="/ybi_sub.html">ybi_sub.html</a></div></div><!-- TD JS SDK Start --><script type="text/javascript">
  /* TreasureDataオブジェクト作成 */
  var td = new Treasure({
    host: 'mobile-ybi.jp-east.idcfcloud.com', /* エンドポイントの指定 */
    database: 'js_sdk_db', /* データベースの指定 */
    writeKey: 'xxxxxxx09d147de381c3fd23c47035132dxxxxxxx' /* WriteOnlyApiKeyの指定 */
  });
  /* データの取得 */
  var user_mail = document.getElementById('user_mail');
  var user_name = document.getElementById('user_name');
  var user = {
    id: user_mail.innerText,
    name: user_name.innerText,
  } /* データの設定 */
  td.trackEvent('js_sdk_table', user); /* データの送信 */
  console.log(user)
</script><!-- TD JS SDK End --></body></html>

*writeKeyはアカウントによって値が異なりますのでご注意ください。

Step4-2:サブページ(ybi_sub.html)の編集

以下TreasureData社が提供するJavascript SDKを埋め込んだ/usr/share/nginx/html/ybi_sub.htmlとなります。 各コードの説明はStep4-3で行います。

<!-- /usr/share/nginx/html/ybi_sub.html --><!doctype html><!--[if lt IE 9]><html class="ie8" lang="ja"><![endif]--><!--[if (gte IE 9)|!(IE)]><!--><html lang="ja"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="format-detection" content="telephone=no"><meta name="description" content="TD JS SDK Test"><title>YBI Javascript Sample</title><script type="text/javascript">
    !function(t,e){if(void 0===e[t]){e[t]=function(){e[t].clients.push(this),this._init=[Array.prototype.slice.call(arguments)]},e[t].clients=[];for(var r=function(t){return function(){return this["_"+t]=this["_"+t]||[],this["_"+t].push(Array.prototype.slice.call(arguments)),this}},s=["addRecord","set","trackEvent","trackPageview","ready"],n=0;n<s.length;n++){var i=s[n];e[t].prototype[i]=r(i)}var a=document.createElement("script");a.type="text/javascript",a.async=!0,a.src=("https:"===document.location.protocol?"https:":"http:")+"//s3.amazonaws.com/td-cdn/sdk/td-1.2.0.js";var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(a,c)}}("Treasure",this); /* JavaScript SDK の読み込み*/
  </script></head><body data-category="top"><div id="user_info"><div id="user_mail">
    hogehoge@example.com</div><div id="user_name">
    hogehoge</div><div id="link"><a href="/ybi_main.html">ybi_main.html</a></div></div><!-- TD JS SDK Start --><script type="text/javascript">
  /* TreasureDataオブジェクト作成 */
  var td = new Treasure({
    host: 'mobile-ybi.jp-east.idcfcloud.com', /* エンドポイントの指定 */
    database: 'js_sdk_db', /* データベースの指定 */
    writeKey: 'xxxxxxx09d147de381c3fd23c47035132dxxxxxxx' /* WriteOnlyApiKeyの指定 */
  });
  /* データの取得 */
  var user_mail = document.getElementById('user_mail');
  var user_name = document.getElementById('user_name');
  var user = {
    id: user_mail.innerText,
    name: user_name.innerText,
  } /* データの設定 */
  td.trackEvent('js_sdk_table', user); /* データの送信 */
  console.log(user)
</script><!-- TD JS SDK End --></body></html>

*writeKeyはアカウントによって値が異なりますのでご注意ください。

Step4-3:編集説明

Javascript関連のコードはybi_main.htmlでもybi_sub.htmlでも全く同じコードとなります。 各コードの意味は以下となります。

  • 13行目:TreasureData社が提供するJavascript SDKを取得しています。
  • 29-45行目:Javascriptのメイン部分です。
  • 31-35行目:Javascript SDKのオブジェクトを作成しています。
  • 32行目:endpointを指定しています。mobile-ybi.jp-east.idcfcloud.comを指定します。
  • 33行目:データを格納するYBIのデータベースを指定しています。ここではjs_sdk_dbを指定しています。
  • 34行目:YBIのApiKeyを指定しています。Step3で取得したApiKeyを指定してください。
  • 37-42行目:それぞれのページのDOMからIDがuser_mail、user_nameという要素のテキストの値を内部変数のuserにhash形式でそれぞれid、nameで格納しています。
  • 43行目:内部変数userに設定した値と、Javascript SDKが自動で取得している以下の値をYBIにアップロードしています。
    • td_version - td-js-sdk's version
    • td_client_id - client's uuid
    • td_charset - character set
    • td_language - browser language
    • td_color - screen color depth
    • td_screen - screen resolution
    • td_viewport - viewport size
    • td_title - document title
    • td_url - document url
    • td_host - document host
    • td_path - document pathname
    • td_referrer - document referrer
    • td_ip - request IP (server)
    • td_browser - client browser (server)
    • td_browser_version - client browser version(server)
    • td_os - client operating system (server)
    • td_os_version - client operating system version(server)
    上記取得される値についてですが、おそらく名前からも推測できると思いますが詳細を知りたい方はGitHubをご確認ください。

Step5:アップロード確認

では実際に各ページにアクセスしてデータがアップロードされることを確認しましょう。

Step5-1:ブラウザアクセス

以下の順番で各ページにアクセスします。

  1. ybi_main.html(ブラウザに直打ち)
  2. ybi_sub.html(ybi_main.html内のリンク経由)
  3. ybi_main.html(ybi_sub.html内のリンク経由)

見た目上はオリジナルページと変更がないので動きがなくてつまらないと思いますが、そこらへんはご容赦ください。

Step5-2:アップロード確認

以下のコマンドでCLIを使ってjs_sdk_db.js_sdk_tableにデータが格納されていることを確認します。

mobile-ybi.jp-east.idcfcloud.comからデータベースへのアップロードは一定の間隔で行っていますので、アップロードされるまでしばらく時間が必要となります。


$ td query -w -t hive -d js_sdk_db "SELECT * FROM js_sdk_table"
# 省略
+-----------------------+------------+----------+----------------+----------------+----------------------+--------------------------------------+---------------+--------------------+-------------+----------+------------+----------+-----------+-------------------------------------+-------------------------------------+----------------+-------------+------------+
| td_title              | td_browser | td_color | td_path        | td_ip          | id                   | td_client_id                         | td_os_version | td_browser_version | td_viewport | name     | td_charset | td_os    | td_screen | td_referrer                         | td_url                              | td_host        | td_language | time       |
+-----------------------+------------+----------+----------------+----------------+----------------------+--------------------------------------+---------------+--------------------+-------------+----------+------------+----------+-----------+-------------------------------------+-------------------------------------+----------------+-------------+------------+
| YBI Javascript Sample | Chrome     | 24-bit   | /ybi_main.html | xxx.xxx.xx.xxx | hogehoge@example.com | 540dcec4-651b-409d-e812-511c6dd10a81 | 10.9.5        | 38.0.2125          | 1366x587    | hogehoge | utf-8      | Mac OS X | 1920x1080 |                                     | http://yyy.yyy.yyy.yy/ybi_main.html | yyy.yyy.yyy.yy | ja          | 1416225567 |
| YBI Javascript Sample | Chrome     | 24-bit   | /ybi_sub.html  | xxx.xxx.xx.xxx | hogehoge@example.com | 540dcec4-651b-409d-e812-511c6dd10a81 | 10.9.5        | 38.0.2125          | 1366x587    | hogehoge | utf-8      | Mac OS X | 1920x1080 | http://yyy.yyy.yyy.yy/ybi_main.html | http://yyy.yyy.yyy.yy/ybi_sub.html  | yyy.yyy.yyy.yy | ja          | 1416225568 |
| YBI Javascript Sample | Chrome     | 24-bit   | /ybi_main.html | xxx.xxx.xx.xxx | hogehoge@example.com | 540dcec4-651b-409d-e812-511c6dd10a81 | 10.9.5        | 38.0.2125          | 1366x587    | hogehoge | utf-8      | Mac OS X | 1920x1080 | http://yyy.yyy.yyy.yy/ybi_sub.html  | http://yyy.yyy.yyy.yy/ybi_main.html | yyy.yyy.yyy.yy | ja          | 1416225571 |
+-----------------------+------------+----------+----------------+----------------+----------------------+--------------------------------------+---------------+--------------------+-------------+----------+------------+----------+-----------+-------------------------------------+-------------------------------------+----------------+-------------+------------+
3 rows in set
$

xxx.xxx.xx.xxxはブラウザが入っている機器のグローバルIPアドレス、yyy.yyy.yyy.yyはybi_main.html/ybi_sub.htmlが配置されているサーバーのグローバルIPアドレスに読み替えてください。 クエリの結果からJavascriptを埋め込んだページに、ロードした際のデータが格納されていることがわかると思います。 各カラムの説明は前Stepで説明済みなので詳細は省略しますが、クライアントを識別するID(td_client_id)、ブラウザ情報(td_browser_version, td_viewport)、OS情報(td_os_version)、機器情報(td_screen)、アクセス情報(td_path、td_referrer)や個別に指定したid、nameの情報も取得できていることがわかるかと思います。

私がChromeを使っていることも一目瞭然かと思います^^;

おわりに

いかがでしたでしょうか。 少ないコード量で、ページにアクセスしているクライアント情報の取得ができることを実感できていただけたなら幸いです。 Yahoo!ビッグデータインサイトでは今回ご紹介したJavascript SDKの他にもAndroid/iOS/UnityのSDKがありますので、是非お試しください!

ビッグデータ専門組織できました

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

IDCフロンティアでは、今年新たに「ビッグデータ戦略グループ」が組織されました。今回は、ベールに包まれたこの新組織の(といっても名称で何をするかだいたいわかる!?)メンバーをご紹介します。

 

左から、上野(技術)、赤星(サービスマネージャー)、高階(SE)
左から、上野(技術担当)、赤星(サービスマネージャー)、高階(SE)

■早速ですが、このチームのミッションは?

赤星: 昨年当社は、新領域としてデータ分析事業へ進出しました。第一弾としてYahoo!ビッグデータインサイト(以下YBI)をリリースしたのですが、この生まれたての事業をクラウド、データセンターとならぶ当社の看板事業として成長させることです。と自分で言っていて結構なプレッシャーです・・(笑)。

もともと私はサービスマネージャーとして、高階さんはSE、上野さんは技術担当として別々の部署でYBIのサービスに携わっていたのですが、新組織となり専任で担当することになりました。

高階: より多くのお客さまにYBIを使っていただくこと、というのはありますが、そもそも「ビッグデータ」という言葉がバズワード化しているというか漠然としていて、具体的にビッグデータを活用するためにどういうアクションをすればいいかわからないところが多いと感じています。やらなきゃいけないとは思うけど何から始めればいいの?といった具合に。そこに具体的な利用シーンを提示して「自分たちだったらこういう風に使える」というイメージを持っていただくことが重要だと思っています。

ちょっと壮大ですけど、「データ分析を今やらなければ」という“空気感”の醸成というか。

 

■そのためにセミナーやハンズオンも積極的に行っていますよね。参加者はこれからデータ分析基盤の導入を予定している方が多いのでしょうか?

bigdata01

赤星: 自社でHadoop環境を構築・運用されているエンジニアの方から、新たなビジネスで利用するデータ分析基盤導入を選定されている方、まだ情報収集段階のサービス開発・営業の方など、幅広い方にご参加いただいています。

セミナーに参加することで、実際のデータ分析までのイメージが湧いたという感想をいただいたり、継続して参加いただける方がいらっしゃるのはうれしいですね。

 

■上野さんはセミナーの講師もしていますが、参加者の反応はいかがでしょうか?

上野: まっさらの状態から環境を作って、データを入れて、結果を見られるところまで2時間弱のハンズオンでできるので、本当にこんなにすぐ使えるんだという感想はいただくことがありますね。

いままでのハンズオンは本当の導入部分を紹介して、まずは環境を構築するところからだったんですが、今後はそのデータを他のツールやサービスとどう連携させていくかといった内容も厚くしていきたいと思っています。実際セミナー後のアンケートでそういったご意見も多いですし。

 

■YBIの対象ユーザーはエンジニア層なのでしょうか?いわゆるマーケッター層(非エンジニア)なのでしょうか?

 赤星: YBIはインフラ構築なしで、データ分析に必要な基盤をワンストップでご利用いただけるクラウド型のサービスなので、インフラに強いエンジニアがいらっしゃらなくても簡単に導入いただけるのが特長です。特に対象ユーザーというのは限定していませんが、実際に分析するデータをどう集めてくるかといった面でのエンジニアリング知識は必要です。ですが、ビジネス開発・改善などの業務を担当されているようなマーケッター層の方、実際にデータ分析を行うデータサイエンティストの方にも安心してお使いいただけるよう、しっかり導入や使い方のサポートをさせていただきます!

高階: YBIは米国のトレジャーデータ社のサービスを使っているので、使いづらい部分や足りない機能があれば開発側にどんどんフィードバックして実装してもらうようプッシュしていきます。トレジャーデータのサービスは米国で多くの実績がありますが、今後、日本のお客さまにもより使いやすいサービスに進化させていくことは我々の務めですね。

 

■今ご利用いただいているお客さまはどんな使い方をしているのですか?

上野: 例えば、ECサイトであればサイトのログをYBIに溜めて、レコメンデーションに利用したり、モバイルアプリではユーザー動向分析に利用しています。広告や金融のお客さまも増えてきていますね。実際のお客さまの事例を詳しくご紹介できるよう準備中です。

赤星: 実は当社でもYBIを活用したデータ分析に着手しました。経営指標等のデータをYBIに集約してBIツールと連携させ、見たい人が見たい時に見たいものを自由に確認できる環境を構築しました。データの集約管理や更新の自動化、人的リソースの削減によって業務効率改善につながるのですが、業種問わずこういった使い方は有効だと思います。

bigdata02
業務効率改善

お客さま向けのサービスでの活用としては、IDCFクラウドのログをYBIに溜めて、ユーザーの行動イベントやアクションパターンを先読みしてサポートや情報提供することで、結果的にサポート稼働を削減したり、コンソール画面のUIや操作性改善といったサービスレベルの向上にもつなげています。

bigdata03
サービスレベル向上

 

高階:  先読みサポートをさらに深堀してアクティブサポートに繋げるとか、ログ解析によってニーズを把握して新サービスの開発に繋げるといったところまで広げていきたいですね。データセンター事業もそれこそデータの山なので当社内だけでも相当な活用例ができそうですね。

 

■ビッグデータ、またはYBIに興味を持っていただいている方に一言お願いします。

赤星:  「社内にデータが散在している」というのは多くの企業で共通しているお悩みのようです。何から手をつければよいかわからないという方は、まずは、”あちこちに散在しているデータをYBIに集約して溜める”というところから始めてみるのもいいのではないでしょうか。スタータープランは無料ですし、アカウント登録だけですぐに始められます。

また、我々IDCフロンティアが長年データセンター事業者として運営している日本国内のデータセンター内にデータが保存されるというのもYBIの特長のひとつです。海外持ち出し不可の機密データでも安心してご利用いただけますし、インターネットを介さない閉域網で接続することもできるので、セキュアな環境を重視されるお客さまにも是非ご利用いただきたいです。

Yahoo! JAPANでも様々なビッグデータ関連のサービスを提供していますが、今後はYBIをそれらのサービスと連携させることなども考えていきますので、ご期待ください。

bigudata02

高階:  YBIは、他のサービスと連携したり組み合わせることで、より使いやすく可能性の広がるサービスですので、そういったご提案をどんどんさせていただきたいです。

また、データ分析系のサービスに限らず、当社のクラウドデータセンターとの連携なども含め、広くインフラ全体の最適化のお手伝いができればと思います。

 

上野: エンジニアの立場からするととにかくデータ分析のための基盤導入と運用がグンと楽になるサービスです。

今は、当社のクラウドなりデータセンターなりを使っていただいているお客さまにYBIを提案して使っていただくというケースが多いですが、最初に使った当社のサービスがYBIでそれをきっかけに他のサービスを使っていただくお客さまが増えるといいですね。頑張ります!

 

※上記内容は掲載日当時のものです。

データ分析プラットフォーム(YBI)のよくある質問 - バルクインポート時の負荷

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

ビッグデータ戦略グループの高階(takashina)です。はじめまして。 IDCフロンティアが提供するデータ分析プラットフォーム「Yahoo!ビッグデータインサイト」の専任ソリューションアーキテクト兼プリセールスエンジニアとして活動しています。

「Yahoo!ビッグデータインサイト」は、一言でいうとビッグデータ分析のためのクラウドサービスです。 そのサービス名がちょっと長いので、社内外で「YBI」と略称で呼んでます。(最初の訪問でYBIと呼び始めると、お客さまも「YBI」と呼んでくれるのがうれしくなるw) YBIでは分析のための環境を一通り用意しており、「生のデータ」を用意して、データをインポートし、あとはお好きなように分析! というように明快なステップでビッグデータ分析を始める事ができます。

bulkimport

導入時サポートの1つとして過去データのインポートがあります。CSV形式などで持っている以前のデータセット一式を使って分析をしたい! って考えるでしょ?

この一括インポートには、コマンドラインツールによるバルクインポートを使うのが有効です。 しかし、コマンドラインツールを自分のサーバーにインストールしていただいて実行するため、サーバーの負荷はいったいどの程度になるのかご質問をいただくことも事実。 バルクインポートの実施方法は別の記事に譲ることとして、今日はバルクインポート実行時のサーバー負荷について検証した結果をご案内します。

バルクインポートって?

まず最初に軽くおさらい。 バルクインポートは、YBIへデータをインポートするための手段の1つで、既存の大容量データを一括でインポートするのに適した方法です。 tdコマンドラインツールを使用して実行します。

実行例

td import:auto \
 --format csv \
 --auto-create bulktestdb.importtest \
 --column-header \
 --time-column datetime \
 --time-format &quot;%Y-%m-%d %H:%M:%S&quot; \
 --parallel 2 \
 --prepare-parallel 2 \
 ./bulktestlog

オプションがいっぱいあってややこしいですね。 詳細についてはこちらの記事をご参照いただければと思います。 TreasureDataに既存データ(TSV形式)をバルクインポートしてみた

今回の検証条件

データの中身

Webのアクセスログと同等の内容を含んだCSVファイル(bulktestlog)を用意しました。

$ wc bulktestlog
10000001 135630065 1879761639 bulktestlog
$ head -1 bulktestlog
datetime,host,path,method,code,referer,agent

1,000万と1行、約1.3億の単語数、約1.9GBのデータを用意しました。 1行目はヘッダ行のため、実データはちょうど1,000万件です。

サーバー環境

IDCFクラウドに仮想マシンを作成して実行します。OSは、CentOS 6.6 64bitで実施しました。 仮想マシンサイズを3種類で比較してみます。

  • standard.M8 (2CPUx2.4GHz, 8GB RAM)
  • highcpu.L8 (4CPUx2.6GHz, 8GB RAM)
  • highmem.M16 (2CPUx2.2GHz, 16GB RAM)

測定方法

まず、td import:autoコマンドのターンアラウンドタイムは、Linuxのtimeコマンドで計測します。 また、バルクインポート実施中のサーバー負荷の計測には、
[メモリ状況]freeコマンドでbuffers/cache考慮後のfreemem、
[CPU状況]mpstatコマンドで得られる%usrと%idleを用いることにします。(複数コアのトータルの値)

$ free
             total       used       free     shared    buffers     cached
Mem:       8053600    3079032    4974568        144      31264    2828792
-/+ buffers/cache:     218976    7834624 (←freeの値)
Swap:            0          0          0
$ mpstat 1
11:32:56  CPU  %usr %nice  %sys %iowait  %irq %soft %steal %guest  %idle
11:32:57  all  0.99  0.00  0.00    0.00  0.00  0.00   0.00   0.00  99.01
                ↑                                                    ↑

結果

バルクインポート実行時間

それぞれ3回以上バルクインポートを実施した平均実行時間は次の通りでした。

仮想マシンサイズ平均実行時間
並列度1並列度2
standard.M8 (2CPUx2.4GHz, 8GB RAM)3m15.994s4m16.466s
highcpu.L8 (4CPUx2.6GHz, 8GB RAM)3m09.036s3m21.132s
highmem.M16 (2CPUx2.2GHz, 16GB RAM)3m13.532s4m47.262s

並列度は、--parallelおよび--prepare-parallelのオプションで指定できます。 今回は単一ファイルのバルクインポートを実行しており、並列度1の方が早く完了しました。 また、並列度1では仮想マシンサイズによる差はあまり見られませんが、並列度2ではhighcpu.L8が最も早く完了しました。higicpu.L8の仮想マシンはCPUクロック数が他よりも速いので、それが効いているように思います。

CPU使用率とメモリ使用量

仮想マシンのサイズ毎に、CPU使用率とメモリ使用量の推移をグラフに表しました。 いずれも並列度を1にした時の様子です。

・standard.M8 (2CPUx2.4GHz, 8GB RAM) 並列度1
stdm8_p1p1

・highcpu.L8 (4CPUx2.6GHz, 8GB RAM) 並列度1
hcl8_p1p1

・highmem.M16 (2CPUx2.2GHz, 16GB RAM) 並列度1
hmm16_p1p1

CPU使用率は、バルクインポート開始時に一旦跳ね上がった後、少し低い位置で推移しています。同じタイミングでメモリ使用も始まっています。 また、CPU使用が終了した後、しばらくはメモリ使用されている状態が継続しています。 これは、転送用ファイル(msgpack)作成の際にCPUとメモリが使用され、続くファイル転送の際にはメモリだけが使われているようです。

続いて並列度を2にした場合の様子です。

・standard.M8 (2CPUx2.4GHz, 8GB RAM) 並列度2
stdm8_p2p2

・highcpu.L8 (4CPUx2.6GHz, 8GB RAM) 並列度2
hcl8_p2p2

・highmem.M16 (2CPUx2.2GHz, 16GB RAM) 並列度2
hmm16_p2p2

CPUコア数が2であるstandard.M8とhighmem.M16の仮想マシンでは、%usrが100%近くまで到達しました。一方でCPUコア数4のhighcpu.L8の仮想マシンでは、50%近くでとどまっています。バルクインポートでは、CPUリソースを最大限近くまで使おうとしているのでしょう。

まとめ

今回の検証では、次のような結果となりました。

  • メモリ搭載量が同じの場合、CPUクロック数が速い仮想マシンでは、バルクインポート実行時間は短くなる
  • CPUコア数が同じの場合、メモリ搭載量によってバルクインポート実行時間にそう大きな差は出ない
  • 単一ファイルのバルクインポートでは、並列度を少なくした方が実行時間は短くなる
  • CPUは、前準備のステップで使用される (下記※参照)
  • メモリは前準備からアップロードのステップで使用される (下記※参照)

(※) バルクインポートの処理では、前準備としてデータを分割してmsgpack形式へ圧縮し、アップロードを行い、YBI内部の処理でファイルのインポートとテーブルへのデータ反映をしています。

バルクインポートを実行するサーバーにはCPUクロック数が速いものを準備するのが良いでしょう。 また、バルクインポート実行時にはCPUリソースを目一杯使うことになるので、並列度はCPUコア数よりも少ない程度で調整すると、他のプロセスへの影響を抑えられそうです。

検証してみて、複数ファイルをバルクインポートする時のサーバーリソースはどうなのか、疑問が湧いてきました。これは、引き続き検証したいと思います。

<関連記事>

Yahoo!ビッグデータインサイト + Pentahoによるアクセスログの可視化

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

今回紹介すること

今回ご紹介することの概要とアウトプットのイメージは以下となります。 Yahoo!ビッグデータインサイト(以下「YBI」)へのデータアップロードからYBIでの集計、MariaDBへResultExportしてその結果をPentahoで閲覧する方法までをご紹介します!

f:id:aueno1986:20150624110824p:plain

pentaho_analysis_report_9.png

はじめに

はじめまして、またはお久しぶりです、ビッグデータ戦略グループの上野です!部署名が変わりました!
梅雨で空気がまとわりつく今日この頃ですがいかがお過ごしでしょうか。

さて早速本題ですが少し前ならビッグデータ、最近だとIoTというのがバズワードとなっていると思いますが、皆さん実際にやられているでしょうか?なかなか実践出来ていないのではないでしょうか?
例えばマーケティング部門の方なら、

  • 「やりたいけど、データ取得はインフラ部門にお願いしないといけない」

データ取得をお願いされた、インフラ部門、アプリケーション開発者の方なら、

  • 「データは取りたいけど、保管する場所を確保しないといけないし、リソース管理が面倒だし、取得項目がころころ変わるから、対応が難しい」

ということが多いのではないでしょうか?
そういったときに、以下の特長を持つYahoo!ビッグデータインサイトの価値が出てくると思います。

  • マネージドクラウドサービス
  • 容量の制限がない
  • スキーマレス

上記お困りの方は本ブログを読んで少しでもYahoo!ビッグデータインサイトを知って頂ければと思います。
#すいません、宣伝ですm( )m

さて今回はWebのアクセスログをYahoo!ビッグデータインサイトを利用して傾向の可視化する方法を書かせて頂きます。 しばしお付き合いをお願いします。

Yahoo!ビッグデータインサイトとは

さてそもそもYahoo!ビッグデータインサイト(以下、YBI)とはなのですが、詳細はコーポレートサイトや以前のブログに譲りますが、一言で言えば以下だと思います。

  • 時系列データベース

そのため以前も書きましたが、実際の分析結果を視覚化(Visualization)するためには別途Visualizationツールを用意する必要があります。

最近のVisualizationツールではTableauが有名であり、実際にYBIを導入されている多くのお客様にも利用されています。 ただ手軽にやるにはフリーツールの方が良いと思いますので、今回はOSSであるPentahoとの連携方法についてご紹介します。

Pentahoとは

Pentaho社が提供するBI(Business intelligence)スイーツツールであり、データ統合、分析、マイニング、ダッシュボードの作成、レポートまでを行うことができるツールです。 なので一つのツールでデータ解析の全てができてしまうツールとなります。

ここまで言うとPentahoだけで充分では?と思ってしまうかもしれません。 しかし、Pentahoは結局はアプリケーションなので大規模データを扱うときはそれを保存する箱とそれを高速に分析するエンジンは自前で用意する必要があります。 その箱とエンジンを提供するのがYBIで、今回は検証がてら連携させてみたのでご紹介させて頂きます。

追記: OSSのBIツールには最近ですと、Re:dashがあり、巷では結構使えるという話なので今度試してみようと思います。

前提条件

以下前提条件となります。

  • ログイン可能なCentOS7があること

手順

YBIへのSignUp

YBI SignUpページにアクセスしてemailアドレスを登録すれば、認証メールが飛んできます。 その認証メール経由でSignUpができます。 無料です!

Pentahoのインストール

CentOS7へのPentahoのインストールは、以下を参考にして頂ければと思います。
Memo: Pentaho BAサーバーインストール - Qiita

MariaDBのインストール

MariaDBのインストール方法は以下を参考にして頂ければと思います。 以下の設定で作成します。

  • username: ybi
  • password:${password}
  • database: ybi

Memo: MariaDBのインストール/初期設定 - Qiita

YBIへのデータインポート

データの準備

今回は以下の形式のファイルをインポートさせます。 アクセスログとなります。


time date    host    method  status  agent   userid
1424224789  2015-02-18 10:59:49 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b
1424224789  2015-02-18 10:59:49 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b
1424224789  2015-02-18 10:59:49 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b
1424224789  2015-02-18 10:59:49 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b
1424224789  2015-02-18 10:59:49 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b
1424224789  2015-02-18 10:59:49 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b
1424224789  2015-02-18 10:59:49 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b
1424224789  2015-02-18 10:59:49 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b
1424224790  2015-02-18 10:59:50 158.205.104.203 GET 200 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36  6ee4d54a-331d-4f8d-ab11-076e6daa455b

データインポート

データのインポート方法は大きく分けて以下5つがあります。

  • バルクインポート
  • ストリーミングインポート
  • SDKインポート
  • ブラウザインポート
  • Data Connector

Data Connectorはつい最近リリースされたものですが、これはYBIから対象のリソースにアクセス可能ならばYBI側でデータの取得から保存をやってくれるものとなります。 バルクインポートでクライアント側で行っていた処理をサーバー側でやってくれるので、クライアント側には負荷がかからずより気軽にデータをYBIにデータを溜めることができると思います。 今はS3/Riak CSだけのようですが、今後拡張していくようなので期待しています。 詳細は以下を参照してください。
(新機能)「Data Connector for Amazon S3」によるデータロード革命 - トレジャーデータ(Treasure Data)公式ブログ

追記: このブログを書いている途中にMySQLにも対応したようです。やはり開発が早いですね。
(新機能)「Data Connector for MySQL」がトレジャーデータへの定時バルクロードをクライアントレスで実現

今回はブラウザインポートでインポートします。 詳細な手順は以下を参照してください。インポート先のデータベース名はybi、テーブル名はaccessとします。
YBI - Yahoo!ビッグデータインサイト - ブラウザアップロード - Qiita

データエクスポート

YBIではクエリの処理結果を外部のサーバーに吐き出す、ResultExport機能があります。 ここでは、先ほどインポートしたデータを分析してMariaDBにエクスポートさせます。

MariaDBテーブル作成

エクスポートさせるデータを保存するためのテーブルを用意する必要があります。 MariaDB上で以下のコマンドによってテーブルを作成します。 ybiというデータベース名、accessというテーブル名で作成しています。

MariaDB [ybi]> CREATE TABLE access (access_date DateTime, count INT);

アクセスログのサマリー情報を格納するテーブルなので、access_dateでアクセスされた日付、countにアクセス数を格納出来るように定義しています。

YBI ResultExport

さてこれでYBIからMariaDBに解析結果を出力する準備が整いました。

Consoleにアクセス

Yahooǃ ビッグデータインサイトにアクセスして、メールアドレス、パスワードを入力してLog inボタンを押下してログインしてください。
スクリーンショット 2015-02-23 18.00.43.png

クエリ画面を表示

ログイン後にサイドメニュータブのNew Queryをクリックしてクエリ画面を表示します。
ybi_query_1.png

ybi_query_2.png

クエリ記入

ここでは日々のアクセス数を抽出するクエリを記載します。
以下のように記載します。

  • Database: 先ほど作成したYBI上で作成したデータベース名を入力してください。

SELECT
  TD_TIME_FORMAT(time,'yyyy-MM-dd','JST') access_date,
  COUNT(1) COUNT
FROM
  access
GROUP BY
  TD_TIME_FORMAT(time,'yyyy-MM-dd','JST')

終了したら、画面中央部のResult ExportのAddボタンを押下して、ResultExport設定画面を表示してください。

ResultExport設定

次にResultExport先を設定します。 以下のように設定してください。 MariaDBはMySQLと互換性がありますので、Export toにはMySQLを指定します。

  • Export to: MySQL
  • Host: MariaDBをインストールしたサーバーのGlobalIPアドレス
  • Username: ybi
  • Password: ${password}
  • Use SSL?: no checked
  • Database: ybi
  • Table: access
  • Mode: replace

ybi_export_1.png

ybi_export_2.png

設定が完了したらUseボタンを押下して、ResultExport設定画面を閉じます。

ResultExport

さて実際にResult Exportを行います。
Runボタンを押下することで実行されます。
ybi_export_4.png

MariaDB Export確認

MariaDBにデータがExportされているかを以下のコマンドで確認します。


$ mysql -u${user_name} -D ${db_name} -p
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.41-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [ybi]>
MariaDB [ybi]> SELECT * FROM access;
+-------------+--------+
| access_date | count  |
+-------------+--------+
| 2014-09-05  |    401 |
...省略
MariaDB [ybi]>

PentahoによるVisualization

さてここから先にYBIからMariaDBにResutlExportしたデータを、Pentahoで視覚化していきます。

Pentahoデータソース設定(MariaDB)

ここでPentahoから先ほどExportしたデータを参照できるように設定します。

BAサーバーにログイン

Pentahoをインストールしたサーバーに設定したGlobalIPアドレス:8080に対してブラウザでアクセスしてみてください。 アクセスすると以下のように表示されるはずです。
pentaho_ba_signin.png

Login as an Evaluatorのドロップダウンをクリックして、AdministratorユーザーのGOボタンを押下してログインします。
ログインすると以下のように表示されます。

pentaho_ba_signin_2.png

データソース設定

次にデータソースを設定します。

接続設定

Home画面のManage Data Sourcesを選択します。
pentaho_web_create_datasource_1.png

次にConfigアイコンのプルダウンメニュでNew Connectionを選択します。 そうすると接続設定画面が表示されます。
pentaho_web_create_datasource_2.png

pentaho_data_source_2.png

以下の項目を入力してください。

  • Connection Name: YBI
  • Database Type: MySQL
  • Access: Native (JDBC)
  • Host Name: MariaDBをインストールしたサーバーのIPアドレス
  • Database Name: ybi
  • User Name: ybi
  • Password: password

入力後Testボタンを押下してください。 以下の画面が表示されれば接続されています。
pentaho_data_source_3.png

OKボタンを押下してそれぞれ閉じてください。

データソース設定

次にNew Data Sourceを選択します。
pentaho_data_source_4.png

pentaho_data_source_5.png

Data Source Wizardで以下の値を入力してNextボタンを押下します。

  • Data Source Name: access
  • Source Type: Database Table(s)
  • Connection: YBI
  • Create data source for: Reporting and Analysis

pentaho_data_source_6.png

以下のように設定してください。設定後Finishボタンを押下することでデータソースとして登録されます。

  • Schema: ybi
  • Selected Table: 'ybi'.'access'
  • Fact Table: 'ybi'.'access'

pentaho_data_source_6.png

グラフ表示

Home画面に戻ってCreate Newボタンを押下してください。
pentaho_analysis_report_1.png

そうすると、Analysis Reportメニュが表示されるのでこのAnalysis Reportを選択してください。
pentaho_analysis_report_2.png

選択後にどのデータソースを使うか聞かれるので、先ほど作成した、accessというものを選択してください。
pentaho_analysis_report_3.png

選択後にOKボタンを押下します。

表作成

さてこれからデータを色々いじることができます。 まずはフィールドリストにあるAccess dateというアイコンをドラッグして列ラベルにドロップしてください。 そしてMeasures > Countを数値フィールドにドロップしてください。 そうすると図のような表が作成されます。
pentaho_analysis_report_4.png

グラフ描画

さて時系列データなのでどうせならグラフで見たくなります。そのときは画面右上にあるグラフアイコンをクリックしてみてください。そうすると以下のように表示されます。
pentaho_analysis_report_5.png

グラフの種類はグラフアイコンのプルダウンメニューで選択することができます。 ここでは線グラフを選択してみます。 そうすると以下のように表示されます。
pentaho_analysis_report_6.png

フィルタリング

ただこのままではちょっと期間が長いので2014年10月分のみを表示させたいと思います。 フィールドリストにあるAccess dateをドラッグしてフィルターフィールドにドロップしてみてください。
そうすると以下の画面が表示されます。 特定の文字列にマッチにチェックを入れて2014-10-を含むという設定にしてください。
pentaho_analysis_report_8.png

設定後OKボタンを押下すると、以下のように2014年10月のデータのみが表示されます。
pentaho_analysis_report_9.png

おわりに

いかがでしたでしょうか。 手順的には長かったと思いますが、YBIを利用してグラフ化する方法を理解頂けたら幸いです。 YBIには定期的な処理設定が可能ですので、MariaDBなどにエクスポートしてやればPentahoによるレポートを定期的に行うことが可能です。 是非お試しください!

<関連記事>


Embulkベースのデータインポート機能「Data Connector」をYBIで試してみる

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

こんにちは、ビッグデータ戦略グループの高階(takashina)です。

DataConnector

いきなり私事ですが、今年の初めからダイエットに取り組んでいます。 成果がこれだけ出ています!

1weight体重

2bodyfat体脂肪率

3muscle筋肉量

1月に73.25kgだった体重が8月の今は65.1kg、 同じく25.6%だった体脂肪率が18.0%です。 数値が読みにくいですが、体重は落ちてきて下げ止まっている、体脂肪率は順調に落ちている最中、筋肉量は一旦落ちて戻ってきた、ということがグラフにするとわかりやすいですね。

今年どんな取り組みをしてきたかと言うと、主に次の3点です。

  1. お昼ごはんを もりそば 中心にする。
  2. 運動を増やす。特に意図的に歩く距離を増やす。
  3. 毎日計測してグラフで見る。

グラフで体重等の状況を見るのに、とあるスマホアプリを使いました。 データは体重を測ったときに手動入力していましたが、それだけでグラフにしてくれるのはとっても便利!

あ、そうそう、データを入れると言えば、Yahoo!ビッグデータインサイト(YBI)にも、新しいデータインポート方法が増えたのをご存知ですか? 前置きが長くなりましたが、今日は新しいデータインポート方法「Data Connector」をご紹介します。

Data Connectorとは

DataConnector

Data Connectorは、YBIに新しく実装されたデータインポートの機能です。Treasure Dataのエンジニアさんが開発してリリースされた、大量データセットをバルク処理で転送できるソフトウェア「Embulk」というOSS(Open Source Software)をベースにしています。

従来、クライアント上にある巨大データを一括でインポートするには「バルクインポート」機能を使うことができましたが、データインポート時にクライアントの負荷が気になるところでした。 例えば、1時間毎に生成されるログデータを定期的にインポートする必要がある場合、データを読み込み、転送する、という手順を毎時実行する度に大きな負荷がかかりました。

Data Connectorを使うと、YBIから対象のリソースにアクセス可能ならば、YBI側でデータの取得からテーブルへの保管までをやってくれます。 つまり、YBI側でデータインポートをやってくれるので、クライアント側には負荷がかからずより手軽にYBIにデータをためることができます。

インポート元として利用可能なシステムは、今オブジェクトストレージ、MySQL、PostgreSQLが挙げられますが、それ以外のシステムも順次増えていくことを期待していてください。

MySQLからデータインポート

まず、MySQLからData Connectorを使ってデータインポートしてみましょう。 ちなみに、PostgreSQLの場合も、ポート番号が違うぐらいでほぼ同じく実施可能です。

前提条件

Data ConnectorはYBIの機能の1つですので、ここから先は下記の前提で綴っていきます。

  • YBIのアカウントを持ち、YBIの基本機能を理解している
  • YBIを操作するためのtdコマンドラインツールを使用できる
  • MySQLサーバはYBIからアクセス可能である

Step0. tdコマンドラインツールのアップデート

Data Connectorを使用するためには、v0.11.9より新しいtdコマンドラインツールを使う必要があります。 バグに当たらないためにも、最新のバージョンにアップデートすることをお勧め。

$ td-agent-gem install td
$ td --version
0.12.0

Step1. Seedコンフィグファイルの作成

Data Connector利用の最初のステップは、コンフィグのymlファイルを作成することです。 下記に例を示します。

$ vi seed.yml
config:
  in:
    type: mysql
    host: mysqlhost.example.com
    port: 3306
    user: mysql_user
    password: mysql_password
    database: mysql_database
    table: mysql_table
    select: "*"
  out:
    mode: replace

host, user, password, database, tableの各パラメータは、MySQLで使用しているものを記載します。その他の細かな指定方法についてはGitHubのページを参照してください。
https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql

Step2. データフォーマットを推定してロードファイルを作成

次に、作成したseed.ymlファイルからload.ymlファイルを作成します。

$ td connector:guess seed.yml -o load.yml
Guessed configuration:

---
in:
  type: mysql
  host: mysql_host.example.com
  port: 3306
  user: mysql_user
  password: mysql_password
  database: mysql_password
  table: mysql_table
  select: "*"
filters: []
out:
  mode: replace

Created load.yml file.
Use 'td connector:preview load.yml' to see bulk load preview.

load.ymlというロードファイルが作成されました。 このload.ymlファイルに対してpreviewすることができます。

$ td connector:preview load.yml
+---------------------------+-------------+--------------------------+---------------+-----------+------------------------------+---------------------------------------------------------------------------------------+------------+
| datetime:timestamp        | host:string | path:string              | method:string | code:long | referer:string               | agent:string                                                                          | time:long  |
+---------------------------+-------------+--------------------------+---------------+-----------+------------------------------+---------------------------------------------------------------------------------------+------------+
| "2015-08-13 02:21:12 JST" | "10.0.9.1"  | "/item/sports/4642"      | "GET"         | 200       | "/search/?c=Sports+Music"    | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" | 1421115672 |
| "2015-08-13 02:21:13 JST" | "10.1.8.2"  | "/search/?c=Music+Games" | "POST"        | 200       | "/item/finance/2436"         | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"                     | 1421115673 |
| "2015-08-13 02:21:14 JST" | "10.2.7.3"  | "/category/software"     | "GET"         | 200       | "/item/books/647"            | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"              | 1421115674 |
| "2015-08-13 02:21:14 JST" | "10.3.6.4"  | "/category/games"        | "GET"         | 200       | "/category/electronics"      | "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"               | 1421115674 |
| "2015-08-13 02:21:14 JST" | "10.4.5.5"  | "/item/electronics/4504" | "GET"         | 200       | "-"                          | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"              | 1421115674 |
| "2015-08-13 02:21:15 JST" | "10.5.4.6"  | "/item/computers/1890"   | "GET"         | 200       | "/search/?c=Computers+Books" | "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"               | 1421115675 |
| "2015-08-13 02:21:15 JST" | "10.6.3.7"  | "/item/software/2872"    | "GET"         | 200       | "/search/?c=Software"        | "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"            | 1421115675 |
| "2015-08-13 02:21:15 JST" | "10.7.2.8"  | "/category/games"        | "GET"         | 200       | "-"                          | "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"               | 1421115675 |
| "2015-08-13 02:21:15 JST" | "10.8.1.9"  | "/category/office"       | "GET"         | 200       | "-"                          | "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"            | 1421115675 |
| "2015-08-13 02:21:16 JST" | "10.9.0.10" | "/category/sports"       | "GET"         | 200       | "-"                          | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" | 1421115676 |
(中略)
+---------------------------+-------------+--------------------------+---------------+-----------+------------------------------+---------------------------------------------------------------------------------------+------------+
273 rows in set
Update load.yml and use 'td connector:preview load.yml' to preview again.
Use 'td connector:issue load.yml' to run Server-side bulk load.

previewをすると、インポートしようとしているテーブル構造を事前に確認することができます。

Step3. データロードジョブの実行

作成されたload.ymlを使って、データロードジョブを実行します。データインポート先となるYBIのDBとテーブルは事前に作成しておいてください。

$ td db:create ybi_sample_db
$ td table:create ybi_sample_db ybi_sample_table
$ td connector:issue load.yml --database ybi_sample_db --table ybi_sample_table --time-column datetime

末尾にあるオプション--time-columnでtimeカラムを指定しています。(インポート元のテーブルに、そのものずばりtimeというカラムがあればこの記載は不要です)

ロードジョブを実行するとJOB IDが割り振られますので、ジョブの実行状況はWebUIにあるJobsの画面で確認することができます。
webui_bulkload
STATUSがSUCCESSになったらロード完了です。 New Queryの画面でこんな具合に、ybi_sample_dbに対してクエリを発行して確認してみましょう。

SELECT *
FROM ybi_sample_table
LIMIT 10

オブジェクトストレージからデータインポート

オブジェクトストレージに置いたCSVやTSVファイルを、Data Connectorを使ってインポートすることもできます。 今回は、TSV形式にしたWebのアクセスログをインポートしてみます。 まず、seed.ymlファイルを下記のように作成します。

$ vi seed.yml
config:
  in:
    type: riak_cs
    endpoint: ds.jp-east.idcfcloud.com
    access_key_id: xxxxxxxxxxxxxxxx
    secret_access_key: xxxxxxxxxxxxxxxxxxxxxxxx
    bucket: testbucket
    path_prefix: wwwlog.tsv.gz
    parser:
      default_timezone: 'Asia/Tokyo'
  out:
    mode: append

続いて、ロードファイルの作成を。コマンドはMySQLの時と同じです。

$ td connector:guess seed.yml -o load.yml
Guessed configuration:

---
config:
  in:
    type: riak_cs
    endpoint: ds.jp-east.idcfcloud.com
    access_key_id: xxxxxxxxxxxxxxxx
    secret_access_key: xxxxxxxxxxxxxxxxxxxxxxxx
    bucket: testbucket
    path_prefix: wwwlog.tsv.gz
    parser:
      default_timezone: Asia/Tokyo
      charset: UTF-8
      newline: CRLF
      type: csv
      delimiter: "\t"
      quote: ''
      escape: ''
      trim_if_not_quoted: false
      skip_header_lines: 1
      allow_extra_columns: false
      allow_optional_columns: false
      columns:
      - name: datetime
        type: timestamp
        format: "%Y-%m-%d %H:%M:%S"
      - name: host
        type: string
      - name: path
        type: string
      - name: method
        type: string
      - name: code
        type: long
      - name: referer
        type: string
      - name: agent
        type: string
      - name: time
        type: long
    decoders:
    - type: gzip
filters: []
out:
  mode: append

Created load.yml file.
Use 'td connector:preview load.yml' to see bulk load preview.

MySQLの時とはかなり違うload.ymlファイルができ上がりました。 connector:guessを実行するとファイルの中身を読み取って、データの型をある程度推定してくれるのです。誤りがあれば生成されたload.ymlファイルを直接編集することが可能です。カラムの名前や型をゼロから指定するのではなく、自動生成された内容を確認すれば良いので、ロードファイルを作るのも随分と楽になっていますね。

データロードの実行はMySQLの時と同じです。

 $ td connector:issue load.yml --database ybi_sample_db --table ybi_sample_table --time-column datetime

スケジューリングもできる

Data Connectorを使ったデータインポートは、cronのようにスケジューリングすることができます。 次の例のように、登録名、cron設定、インポート先DB、インポート先テーブル、ロードファイル名を指定します。

$ td connector:create \
    test_daily_import \"10 0 * * *" \
    ybi_sample_db \
    ybi_sample_table \
    load.yml \
    -t &quot;Asia/Tokyo&quot;

スケジューリングをすると、例えば、定期的にオブジェクトストレージに書き出されたTSVファイルをインポートしたり、MySQLのテーブルの中で前日分データを定期的にインポートしたりすることができます。

スケジュールの登録状況はtd connector:listで、実行状況はtd connector:historyで確認することが出来ます。

$ td connector:list
$ td connector:history test_daily_import

おわりに

いかがでしたか。 クライアント側に大きな負荷がかからず、データインポートが手軽にできるのは大きなメリットだと思います。 Data Connectorの詳しい使い方は、下記のドキュメントサイトに記載がありますので、気になる方は参照してみてください。
http://ybi-docs.idcfcloud.com/categories/data-connector

それでは、ごきげんよう!

 

<関連記事>

Windows/Macからデータ分析プラットフォーム(YBI)を使う際のあるあるトップ3

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

ybi_with_winmac

こんにちは、ビッグデータ戦略グループの高階(takashina)です。

前回のブログで、お昼ご飯にもりそばを食べてダイエットに取り組んでる旨を書きましたが、ちょっとピンチになってきました。足繁く通っていた会社近くのおそば屋さんがこの7月、8月に1軒ずつ閉店してしまいました。1か月内で同じ店には繰り返し行かないと決めているので、この閉店はとても痛い! おそば屋さんに限っては、月に2回行ってもいいことにしようかな..。新宿御苑近辺で新規開店するおそば屋さん募集中です。月1回はもりそば食べに行きます。

さて今日は、データ分析プラットフォームサービスであるYahoo! ビッグデータインサイト(以下「YBI」)をWindowsのPCやMacから使う際のつまずきポイントや、覚えておくと便利なことをランキング形式でご紹介しようと思います。YBIを使うと簡単にデータ分析が始められるのですが、アカウントを作って、ログインして、さぁ、始めよう!と思った矢先、ちょっとしたところでハマってしまうんですよね..。

第3位:チームメンバーを追加できない。。?

YBIはAccount Ownerのアカウントの中に、ユーザ数の制限なくチームメンバーを追加することができるので、同じ分析環境をチームメンバーで共有して使うことができます。 新しいチームメンバーを追加するのにメールアドレスを入力して、Add Team Memberしようとしたけどできない...なんでだぁ!
registerd

→ 追加するメールアドレスを見直そう

YBIアカウントはメールアドレスによって管理されており、アカウント登録済みのメールアドレスをさらに追加することはできません。そのため、YBIに登録済みのメールアドレスを追加しようとした場合、上の絵のように「User is already registered.」と怒られてしまいます。 もしかすると、試用でアカウント登録してあるメールアドレスなのかもしれませんね。

この場合、

  1. まず既に登録済みのアカウントのメールアドレス(A)を、別のメールアドレス(B)に変更する
  2. メールアドレス(A)をチームメンバーとして追加する (本来やりたかったこと)

というステップでチームメンバー追加することができます。

第2位:日本語のデータが文字化けしてしまう。。?

Windows PCでCSVファイルの中身を確認したり、ちょっとした編集をする際にはExcelを使ったりしますよね。 そうして編集したCSVファイルをYBIへインポートするのによく使われるのがバルクインポート。 しかし、いざバルクインポートしてみると、YBIのテーブルで文字化けしてしまう...なんでだぁ!

→ オプションを使って文字コードを変換しよう

WindowsではShift_JISの文字コードがよく使われますが、YBIではWebサービスでよく使われるUTF-8が使われています。 そのため、YBIで読める日本語にするためには、文字コード変換をしてあげればOKです。

    C:\> td import:auto ^
    --auto-create DBName.TableName ^
    --format csv ^ --column-header ^
    --encoding Windows-31J ^ 
    --time-column datetime ^
    --time-format "%Y/%m/%d %H:%M:%s" ^
    filename.csv

上記の例のように「--encoding Windows-31J」というオプションを使います。 インポートするCSVファイルの文字コードを予めUTF-8へ変換しておく手もありますが、インポートコマンドでコード変換をかける方が簡単でしょ?

第1位:tdコマンドラインツールでアカウント認証できない。。?

YBIはWebコンソールで様々な操作ができますが、tdコマンドラインツールを使うとより便利に使うことができます。 コマンドラインツールを使うとき、一番初めにアカウント認証を行うわけですが、ここでつまずき。 うまく認証ができない...なんでだぁ!

→ エンドポイントを指定しよう

YBIをコマンドラインツールで操作する際は、アカウント認証時にエンドポイントを指定しましょう。 これで解決です。

C:\> td -e https://ybi.jp-east.idcfcloud.com account -f 

これでOK!

tdコマンドラインツールを使うマシンでアカウント認証を実行すると、
Windowsの場合は、 C:\Users\[ユーザ名]\.td\td.conf
Macの場合は、 ~/.td/td.conf
のファイルにエンドポイントとユーザ名、API Keyが書き込まれるので、アカウント認証は最初に一度だけ行えばOKです。 これで最初のつまずきはクリア!

ちなみにFAQにも載ってます。
https://www.faq.idcf.jp/app/answers/detail/a_id/436/c/8

次点:バッチファイルで日付フォーマットの指定がうまくいかない。。?

これはWindowsの場合の話。 第2位の例のようにtime-formatを設定してうまくバルクインポートすることができました。これを自動的に定期実行するためにバッチファイルにしました。毎朝6時に実行することにしよう。スケジューラでセットして、と。出社したらインポートできてるはずだよね♪ で、確認したらtimeの値が全部0になってしまっている....なんでだぁ!

→ %を%%にするだけ

結論から言ってしまうと、これはYBIというよりWindowsのバッチファイルの話です。 バッチファイルでは「%hoge%」と%で挟まれた文字列を変数とみなすため、time-formatの設定がうまく効かなくなってしまいます。そこで、バッチファイルの中では「%」の代わりに「%%」にすることで解決です。上記の該当箇所は、バッチファイルでは下記のように書き換えます。

--time-format "%%Y/%%m/%%d %%H:%%M:%%s" ^

最近、Data Connectorによるデータインポートがリリースされたので、新たにバルクインポートを自動化することは少ないかと思いますが、バッチファイルでうまくいっていない場合は確認してみるといいかもしれません。

おわりに

今日は、YBIを使い始めてよく行き当たるつまずきポイントの解決方法についてまとめてみました。 データ発生元となるWebサーバやデータベースサーバはLinuxを使うことが多いですが、操作する皆さんの端末はWindowsやMacのことが多いですからね。この記事が皆さんのお役に立てれば幸いです。 YBIを使っていて不明な点がありましたらWebUI上部の「Email Support」からどしどしご質問ください。 無償アカウントをお持ちの方からのご質問でも大歓迎です。

また、YBIでは、これからビッグデータ分析を始める方向けに「Yahoo! ビッグデータインサイト めちゃ楽ガイド」をリリースしました。極力専門用語を使わずに、YBIを使う大まかな流れを理解できるようにしたドキュメントですので、是非読んでみてください。
こちらからダウンロードできます。
http://www.idcf.jp/bigdata/

それでは、ごきげんよう!

<関連記事>

WindowsのイベントログをfluentdでYBIへインポートする (前編)

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

ビッグデータ・ソリューションアーキテクトの高階(たかしな)です。 新年あけましておめでとうございます、ってもう月末だろが! もうすぐ豆まきだろうが!

私の所属するビッグデータ戦略グループも発足から早一年が経ちました。 昨年は、おかげさまでたくさんのみなさんにビッグデータ分析基盤サービスの「Yahoo!ビッグデータインサイト」(略してYBI)を知っていただいたり利用していただいたりしたのですが、まだまだ認知向上が足りないなーと感じています。 もっともっと、YBIの良さやメリットを知っていただかなきゃあいけませんね。

YBIは、fluentdを使ったデータインポートが非常にやりやすいソリューションなので、Linux系OS環境からのデータインポートは結構使われています。このようにOSSを使う場合、Windowsサーバーは置いてけぼりになってしまう事が多いですよね..。そのままだと意外と見づらいイベントログ、何か一括管理できるいい方法はないものか..? そんなWindowsサーバー管理者のみなさん、安心してください!インポートできますよ! 実は(と言うことでもないが)Windows環境からだってfluentdでインポートできるようになっているんです。
winevt_to_YBI

そこで今回はIDCFクラウド上に作ったWindows Server 2012 R2 Std (64-bit)のサーバーで、fluentdをサービスとして動作させ、Windowsイベントログをfluentdで収集し、YBIへインポートする手順をご紹介します。

YBI関連でお客さんとお話ししている際に「Windowsのイベントログをインポートしたい」という声があり、Web上の記事から調べてみるとnxlogというソフトウェアを使う方法がありました。(fluentdの公式サイトでも紹介) また、fluentdがWindowsを正式サポートしたという記事も見つけました。そこで「fluentdだけでYBI(TD)へデータインポートできたらもっと便利だな」と考え、いろいろ試したのが今回の記事を書いたきっかけです。 この記事が悩まれている方の参考になれば嬉しいです。
winevttoYBI1

今回の記事、内容が長いので前後編の2回に分けます。
前編は上の図の通り、必要なソフトウェアのインストールと、fluentdをWindowsサービスとして動かすまでの紹介です。

1. Rubyのインストール

まず、fluentdを動かすためにRubyをインストールします。
http://rubyinstaller.org/downloads/

ここから、「Ruby 2.2.3 (x64)」をダウンロードしてインストールします。 途中、「Rubyの実行ファイルへ環境変数PATHを設定する」にチェックしましょう。
01_ruby_install

続いて、上記リンクからDevKitをダウンロードして解凍します。
ダウンロードするファイルは Devkit-mingw64-64-4.7.2-20130224-1432-sfx.exe
ここでは、解凍先を「C:\ruby」にします。
02_extract_to

コマンドプロンプトを起動し、DevKitを解凍したフォルダへ移動して、次のコマンドを実行します。

C:\Users\Administrator>cd C:\ruby
C:\ruby> ruby dk.rb init

Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.

 

「C:\ruby\config.yml」を開き、「- C:/Ruby22-x64」を追記します。
03_ruby_configyml

仕上げに次のコマンドを実行します。

C:\ruby>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Ruby22-x64'
[INFO] Installing 'C:/Ruby22-x64/lib/ruby/site_ruby/devkit.rb'

これで、Rubyのインストールができました。 コマンドプロンプトは一旦閉じておきましょう。

2. Gitのインストール

Windows版のGitをダウンロードしてインストールします。
http://www.git-scm.com/downloads
ここから「Git-2.7.0-64-bit.exe」をダウンロードしてインストールします。 途中、「Use Git from the Windows Command Prompt」を選択します。それ以外はデフォルトのままでOKです。
04_git_install

Gitのインストールはこれだけです。

3. fluentdのインストール

次はfluentdのgemを作成して、インストールしていきます。コマンドプロンプトを立ち上げ直して、以下の通り作業していきます。

C:\Users\Administrator>cd C:\

C:\>git clone https://github.com/fluent/fluentd.git
Cloning into 'fluentd'...
remote: Counting objects: 14533, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 14533 (delta 6), reused 0 (delta 0), pack-reused 14515
Receiving objects: 100% (14533/14533), 13.22 MiB | 5.53 MiB/s, done.
Resolving deltas: 100% (8409/8409), done.
Checking connectivity... done.

fluentdをWindowsのサービスとして登録するためには、windowsブランチの内容が必要なので、ブランチを変えます。

C:\>cd fluentd

C:\fluentd>git checkout windows
Branch windows set up to track remote branch windows from origin.
Switched to a new branch 'windows'

続いて、fluentdのgemを作っていきます。まずbundlerをgemでインストールします。

C:\fluentd>gem install bundler
Fetching: bundler-1.11.2.gem (100%)
Successfully installed bundler-1.11.2
Parsing documentation for bundler-1.11.2
Installing ri documentation for bundler-1.11.2
Done installing documentation for bundler after 7 seconds
1 gem installed

fluentdのbundle作業。

C:\fluentd>bundle
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/..
Resolving dependencies...
Installing rake 10.5.0
Installing cool.io 1.4.3 with native extensions
Installing ffi 1.9.10
Installing flexmock 1.3.3
Installing http_parser.rb 0.6.0 with native extensions
Installing json 1.8.3 with native extensions
Installing msgpack 0.5.12 with native extensions
Installing sigdump 0.2.3
Installing string-scrub 0.0.5 with native extensions
Installing thread_safe 0.3.5
Installing win32-api 1.5.3
Installing yajl-ruby 1.2.1 with native extensions
Installing multi_json 1.11.2
Installing parallel 1.6.1
Installing power_assert 0.2.7
Installing rr 1.1.2
Installing simplecov-html 0.5.3
Installing timecop 0.8.0
Using bundler 1.11.2
Installing win32-ipc 0.6.6
Installing win32-service 0.8.7
Installing tzinfo 1.2.2
Installing windows-api 0.4.4
Installing parallel_tests 2.2.2
Installing test-unit 3.1.7
Installing simplecov 0.6.4
Installing win32-event 0.6.3
Installing tzinfo-data 1.2015.7
Installing windows-pr 1.2.4
Installing test-unit-rr 1.0.5
Using fluentd 0.12.15 from source at `.`
Bundle complete! 9 Gemfile dependencies, 31 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

fluentd 0.12.15のgemを作成します。

C:\fluentd>bundle exec rake build
fluentd 0.12.15 built to pkg/fluentd-0.12.15.gem.

そしてfluentdのgemをインストール!

C:\fluentd>gem install pkg/fluentd-0.12.15.gem -no-ri -no-rdoc
Successfully installed fluentd-0.12.15
Parsing documentation for fluentd-0.12.15
Installing ri documentation for fluentd-0.12.15
Done installing documentation for fluentd after 4 seconds
1 gem installed

fluentdのgemがインストールできたら、パスの通っているフォルダ(ここではC:\Ruby22-x64\bin)へ必要なファイルをコピーしておきます。

C:\fluentd>copy C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluent* C:\Ruby22-x64\bin
C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluent-cat
C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluent-cat.bat
C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluent-debug
C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluent-debug.bat
C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluent-gem
C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluent-gem.bat
C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluentd
C:\Ruby22-x64\lib\ruby\gems\2.2.0\bin\fluentd.bat
        8 個のファイルをコピーしました。

インストール関連はここまでで終了、続いて動作テストをしていきましょう。

4. fluentdの起動テスト

まずは、インストールしたfluentdが動作するかどうか、サンプルのコンフィグを使って確認します。

C:\>fluentd -c C:\/fluentd/example/in_forward.conf
2016-01-21 09:48:36 +0900 [info]: reading config file path="C:\/fluentd/example/in_forward.conf"
2016-01-21 09:48:36 +0900 [info]: starting fluentd-0.12.15
2016-01-21 09:48:36 +0900 [info]: spawn command to main (windows) : C:/Ruby22-x64/bin/ruby.exe 'C:/Ruby22-x64/bin/fluentd' -c C:\/fluentd/example/in_forward.conf --no-supervisor
2016-01-21 09:48:37 +0900 [info]: reading config file path="C:\/fluentd/example/in_forward.conf"
2016-01-21 09:48:37 +0900 [info]: starting fluentd-0.12.15 without supervision
2016-01-21 09:48:37 +0900 [info]: gem 'fluentd' version '0.12.15'
2016-01-21 09:48:37 +0900 [info]: adding match pattern="test" type="stdout&quot;
2016-01-21 09:48:37 +0900 [info]: adding source type="forward"
2016-01-21 09:48:37 +0900 [info]: using configuration file: 
<ROOT><source> type forward</source><match test> type stdout</match></ROOT> 2016-01-21 09:48:37 +0900 [info]: listening fluent socket on 0.0.0.0:24224

動作しましたね。Ctrl-cで終了しましょう。

5. fluentdのサービス登録

Windowsサービスとして登録します。 管理者権限で立ち上げたコマンドプロンプトから次のコマンドを実行します。

C:\>fluentd --reg-winsvc i

成功しても何も表示されません。 管理ツールのサービスで確認してみましょう。「Fluentd Windows Service」として登録されています。
05_windows_service

06_windows_service2

ちなみに、サービス登録を削除したい場合は、管理者権限で立ち上げたコマンドプロンプトから

C:\>fluentd --reg-winsvc u

です。やはり成功しても何も表示されません。

続いて、fluentdのオプションを登録していきます。 fluentdはC:\fluentd配下にインストールされています。ここから先の設定ファイルやログファイルは、C:\fluent配下に必要なフォルダを作成して行っていきます。

C:\>mkdir fluent
C:\>cd fluent
C:\fluent>mkdir conf log test

今回オプションで指定する内容は下記のとおりです。 ここから先、コンフィグファイルとログファイルは下記のものを使います。

  • コンフィグファイル: C:/fluent/conf/fluent.conf
  • ログファイル: C:/fluent/log/fluent.log

オプション設定は次のコマンドで実行します。

C:>fluentd --reg-winsvc-fluentdopt '-c C:/fluent/conf/fluent.conf -o C:/fluent/log/fluent.log'

やっぱり成功しても何も表示されません。

6. サービスとして起動テスト

さて、Windowsサービスとしてfluentdが起動できるかどうか、テストしていきましょう。

まず、コンフィグファイル(fluent.conf)を下記のように設定します。in_forwardで受け付けてファイルに書き出すだけの設定です。

<source>
  type forward</source><match **>
  type file
  path C:/fluent/test/output
  time_slice_format %Y%m%d_%H%M%S
  time_slice_wait 5s</match>

管理ツールのサービスから「Fluentd Windows Service」を開始してみましょう。
成功するとこうなります。
07_windows_service3

ログファイルにはこんなログが書き出されているはずです。

2016-01-21 09:58:23 +0900 [info]: reading config file path="C:/fluent/conf/fluent.conf"
2016-01-21 09:58:23 +0900 [info]: starting fluentd-0.12.15
2016-01-21 09:58:23 +0900 [info]: spawn command to main (windows) : C:/Ruby22-x64/bin/ruby.exe 'C:/Ruby22-x64/bin/fluentd' -c C:/fluent/conf/fluent.conf -o C:/fluent/log/fluent.log -x fluentdwinsvc --no-supervisor
2016-01-21 09:58:24 +0900 [info]: reading config file path=&quot;C:/fluent/conf/fluent.conf&quot;
2016-01-21 09:58:24 +0900 [info]: starting fluentd-0.12.15 without supervision
2016-01-21 09:58:24 +0900 [info]: gem 'fluentd' version '0.12.15'
2016-01-21 09:58:24 +0900 [info]: adding match pattern=&quot;**&quot; type=&quot;file&quot;
2016-01-21 09:58:24 +0900 [info]: adding source type=&quot;forward&quot;
2016-01-21 09:58:24 +0900 [info]: using configuration file: 
<ROOT><source> type forward</source><match **> type file path C:/fluent/test/output time_slice_format %Y%m%d_%H%M%S time_slice_wait 5s buffer_path C:/fluent/test/output.*</match></ROOT> 2016-01-21 09:58:24 +0900 [info]: listening fluent socket on 0.0.0.0:24224

設定に沿ってログが書き出されるかどうか、テストしてみましょう。コマンドプロンプトで次のコマンドを実行してみます。

C:\>echo {"string":"Hello Fluentd Windows Service"} | fluent-cat test

C:/fluent/testフォルダに、output.yyyyMMdd_HHmmss_0.logというファイルが作成され、次のようなログが書き出されているはずです。
08_testlog
OKならFluentd Windows Serviceを一旦停止しておきます。

さあ、ここまででWindowsサーバーからfluentdでログ転送する準備が整いました。
続いて、Windowsイベントログの収集に進みます..が記事が長~くなってきましたね。 今日の記事はここで終了し、次回に続きたいと思います。

参考記事

今回の投稿作成にあたり、次の記事を参考にさせていただきました。感謝申し上げます。m( )m

coming soon!

  • 7. Windowsイベントログを集める
  • 8. YBIへログ転送

それでは、ごきげんよう!

WindowsのイベントログをfluentdでYBIへインポートする (後編)

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

ビッグデータ・ソリューションアーキテクトの高階(takashina)です。 大寒波、やっと北の方へ帰ってくれましたね。冬の初めに暖冬予想が出ていたのは何だったんだ..と思ってしまいます。都内の陽当たりの悪い路地では雪が凍ったまま残っています。なんでも沖縄や奄美でも雪が降ったとか、びっくりです。(◎_◎;) 最近の寒暖差で体調を崩してしまった方、ご自愛ください。

さて、前回の記事に続いて、WindowsのイベントログをfluentdでYahoo!ビッグデータインサイト(以下「YBI」)へインポートする手順のご紹介 後編です。
winevt_to_YBI

前回の記事で、fluentdがWindowsサービスとして起動できるところまでを確認しました。 後編では下の図のように、集めたWindowsイベントログをYBIへインポートする手順を紹介します。
winevttoYBI2

前回のおさらい

  1. Rubyのインストール
  2. Gitのインストール
  3. fluentdのインストール
  4. fluentdの起動テスト
  5. fluentdのサービス登録
  6. サービスとして起動テスト

fluentdで使うコンフィグファイルとログファイルは次のものを使っています。

  • コンフィグファイル: C:/fluent/conf/fluent.conf
  • ログファイル: C:/fluent/log/fluent.log

7. Windowsイベントログを集める

Windowsイベントログをfluentdで収集するための設定と試験を行います。 まずは必要になるfluentdのプラグインを2つインストールします。

7-1. fluent-plugin-winevtlogのインストール

fluentdは、様々なデータソースからプラグイン経由でデータをinputして、様々な宛先にプラグイン経由でデータをoutputするツールです。 今回は、Windowsイベントログをinputするのに使うfluentdのプラグインをインストールします。

C:\>gem install fluent-plugin-winevtlog
Fetching: win32-eventlog-0.6.5.gem (100%)
Successfully installed win32-eventlog-0.6.5
Fetching: fluent-plugin-winevtlog-0.0.3.gem (100%)
Successfully installed fluent-plugin-winevtlog-0.0.3
Parsing documentation for win32-eventlog-0.6.5
unable to convert "\xE3" from ASCII-8BIT to UTF-8 for CHANGES, skipping
Installing ri documentation for win32-eventlog-0.6.5
Parsing documentation for fluent-plugin-winevtlog-0.0.3
Installing ri documentation for fluent-plugin-winevtlog-0.0.3
Done installing documentation for win32-eventlog, fluent-plugin-winevtlog after 0 seconds
2 gems installed

7-2. fluent-plugin-record-modifierのインストール

これは、fluentdのフィルタプラグインの1つで、レコードの内容を修正することができるプラグインです。 日本語環境のWindowsであれば、イベントログはWindows-31Jの文字コードになりますが、YBIへインポートする際にUTF-8にしておくために、今回はこのプラグインを使用します。

C:>gem install fluent-plugin-record-modifier
Fetching: uuidtools-2.1.5.gem (100%)
Successfully installed uuidtools-2.1.5
Fetching: fluent-mixin-config-placeholders-0.3.1.gem (100%)
Successfully installed fluent-mixin-config-placeholders-0.3.1
Fetching: fluent-plugin-record-modifier-0.4.0.gem (100%)
Successfully installed fluent-plugin-record-modifier-0.4.0
Parsing documentation for uuidtools-2.1.5
Installing ri documentation for uuidtools-2.1.5
Parsing documentation for fluent-mixin-config-placeholders-0.3.1
Installing ri documentation for fluent-mixin-config-placeholders-0.3.1
Parsing documentation for fluent-plugin-record-modifier-0.4.0
Installing ri documentation for fluent-plugin-record-modifier-0.4.0
Done installing documentation for uuidtools, fluent-mixin-config-placeholders, fluent-plugin-record-modifier after 0 seconds
3 gems installed

なお今回は使いませんが、このプラグインでは、元々のレコードにはない項目をfluentdで追加したり、不要な項目を削除したりもできるようです。

7-3. fluent.confの設定

Windowsイベントログをfluentdで捕捉してoutputファイルに書き出せるかどうか、確認してみましょう。 fluent.confを下記のように設定します。

<source>
  type winevtlog
  channel application,security
  pos_file C:/fluent/log/eventlog.pos
  read_interval 5
  tag winevt.raw</source><match winevt.raw>
  type record_modifier
  char_encoding Windows-31J:utf-8
  tag winevt.filtered</match><match winevt.filtered>
  type file
  path C:/fluent/test/output
  time_slice_format %Y%m%d_%H%M%S
  time_slice_wait 5s</match>

上記設定内容を説明すると、sourceでinputをWindowsイベントログに指定し、ApplicationログとSecurityログを取得するようにしています。 次にmatch winevt.rawで、文字コードをWindows-31JからUTF-8へ変換しています。 最後にmatch winevt.filteredで、outputファイルへ書き出す指定をしています。

設定が終わったら、管理ツールのサービスから「Fluentd Windows Service」を開始し、fluent.logのログファイルを確認しておきましょう。設定に問題がなければ以下のように表示されるはずです。

2016-01-21 10:42:31 +0900 [info]: reading config file path="C:/fluent/conf/fluent.conf"
2016-01-21 10:42:31 +0900 [info]: starting fluentd-0.12.15
2016-01-21 10:42:31 +0900 [info]: spawn command to main (windows) : C:/Ruby22-x64/bin/ruby.exe 'C:/Ruby22-x64/bin/fluentd' -c C:/fluent/conf/fluent.conf -o C:/fluent/log/fluent.log -x fluentdwinsvc --no-supervisor
2016-01-21 10:42:31 +0900 [info]: reading config file path="C:/fluent/conf/fluent.conf"
2016-01-21 10:42:31 +0900 [info]: starting fluentd-0.12.15 without supervision
2016-01-21 10:42:31 +0900 [info]: gem 'fluent-mixin-config-placeholders' version '0.3.1'
2016-01-21 10:42:31 +0900 [info]: gem 'fluent-plugin-record-modifier' version '0.4.0'
2016-01-21 10:42:31 +0900 [info]: gem 'fluent-plugin-winevtlog' version '0.0.3'
2016-01-21 10:42:31 +0900 [info]: gem 'fluentd' version '0.12.15'
2016-01-21 10:42:31 +0900 [info]: adding match pattern="winevt.raw" type="record_modifier"
2016-01-21 10:42:35 +0900 [info]: adding match pattern="winevt.filtered" type="file"
2016-01-21 10:42:35 +0900 [info]: adding source type="winevtlog"
2016-01-21 10:42:35 +0900 [info]: using configuration file: 
<ROOT><source> type winevtlog channel application,security pos_file C:/fluent/log/eventlog.pos read_interval 5 tag winevt.raw</source><match winevt.raw> type record_modifier char_encoding Windows-31J:utf-8 tag winevt.filtered</match><match winevt.filtered> type file path C:/fluent/test/output time_slice_format %Y%m%d_%H%M%S time_slice_wait 5s buffer_path C:/fluent/test/output.*</match></ROOT>

7-4. イベントログテスト

管理者権限でコマンドプロンプトを立ち上げて、Windowsのeventcreateコマンドでログを書き込んでみます。

C:\>eventcreate /ID 999 /L Application /SO EvtTest /T Information /D "テストメッセージ"

成功: 種類が 'Information'のイベントが、'Application'ログ内に、'EvtTest'をソースとして作成されました。

C:\>

上手く行くと、C:/fluent/test/配下のoutputファイルに下記のようなログが書き込まれます。
09_eventlog_test
確認できたらFluentd Windows Serviceを一旦停止しておきましょう。

8. YBIへログ転送

前後編に分かれた手順もあともう少し。YBIへWindowsイベントログを転送します。

8-1. fluent-plugin-tdのインストール

まずは、YBIへログ転送できるようにするために、Treasure Dataアウトプットプラグイン(fluent-plugin-td)をインストールします。

C:>gem install fluent-plugin-td
Fetching: httpclient-2.5.3.3.gem (100%)
Successfully installed httpclient-2.5.3.3
Fetching: td-client-0.8.77.gem (100%)
Successfully installed td-client-0.8.77
Fetching: fluent-plugin-td-0.10.28.gem (100%)
Successfully installed fluent-plugin-td-0.10.28
Parsing documentation for httpclient-2.5.3.3
Installing ri documentation for httpclient-2.5.3.3
Parsing documentation for td-client-0.8.77
Installing ri documentation for td-client-0.8.77
Parsing documentation for fluent-plugin-td-0.10.28
Installing ri documentation for fluent-plugin-td-0.10.28
Done installing documentation for httpclient, td-client, fluent-plugin-td after 6 seconds
3 gems installed

8-2. fluent.confの設定

YBIへログ転送できるよう7-3で変更した設定をさらに変更します。 fluent.confを下記のように設定します。

<source>
  type winevtlog
  channel application,security
  pos_file C:/fluent/log/eventlog.pos
  read_interval 5
  tag winevt.raw</source><match winevt.raw>
  type record_modifier
  char_encoding Windows-31J:utf-8
  tag td.testdb.windows_eventlog</match><match td.*.*>
  type copy<store>
    type file
    path C:/fluent/test/output
    time_slice_format %Y%m%d_%H%M
    time_slice_wait 5s</store><store>
    type tdlog
    apikey xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    endpoint ybi.jp-east.idcfcloud.com
    auto_create_table
    buffer_type file
    buffer_path C:/fluent/buffer/ybi
    flush_interval 60s
    use_ssl true</store></match>

match td..が、YBIへログを転送する設定です。 今回は、YBIへログを送りつつ、ローカルのoutputファイルでもログ出力が確認できるように、type copyを使ってログを2箇所にstoreする設定をしています。 apikeyはYBIのWrite-Only API keyを使いましょう。 endpointを明記するのを忘れずに! インポート先となるYBI上のDBとテーブルは、td..で指定します。 上記例ではmatch winevt.rawの中でtag td.testdb.windows_eventlogと指定しているので、DB:testdb、テーブル:windows_eventlogがインポート先となります。

設定が終わったら、管理ツールのサービスから「Fluentd Windows Service」を開始し、fluent.logのログファイルを確認しておきましょう。

2016-01-21 12:21:50 +0900 [info]: reading config file path="C:/fluent/conf/fluent.conf"
2016-01-21 12:21:50 +0900 [info]: starting fluentd-0.12.15
2016-01-21 12:21:50 +0900 [info]: spawn command to main (windows) : C:/Ruby22-x64/bin/ruby.exe 'C:/Ruby22-x64/bin/fluentd' -c C:/fluent/conf/fluent.conf -o C:/fluent/log/fluent.log -x fluentdwinsvc --no-supervisor
2016-01-21 12:21:51 +0900 [info]: reading config file path="C:/fluent/conf/fluent.conf"
2016-01-21 12:21:51 +0900 [info]: starting fluentd-0.12.15 without supervision
2016-01-21 12:21:51 +0900 [info]: gem 'fluent-mixin-config-placeholders' version '0.3.1'
2016-01-21 12:21:51 +0900 [info]: gem 'fluent-plugin-record-modifier' version '0.4.0'
2016-01-21 12:21:51 +0900 [info]: gem 'fluent-plugin-td' version '0.10.28'
2016-01-21 12:21:51 +0900 [info]: gem 'fluent-plugin-winevtlog' version '0.0.3'
2016-01-21 12:21:51 +0900 [info]: gem 'fluentd' version '0.12.15'
2016-01-21 12:21:51 +0900 [info]: adding match pattern="winevt.raw" type="record_modifier"
2016-01-21 12:21:54 +0900 [info]: adding match pattern="td.*.*" type="copy"
2016-01-21 12:21:54 +0900 [info]: adding source type="winevtlog"
2016-01-21 12:21:54 +0900 [info]: using configuration file: 
<ROOT><source> type winevtlog channel application,security pos_file C:/fluent/log/eventlog.pos read_interval 5 tag winevt.raw</source><match winevt.raw> type record_modifier char_encoding Windows-31J:utf-8 tag td.testdb.windows_eventlog</match><match td.*.*> type copy<store> type file path C:/fluent/test/output time_slice_format %Y%m%d_%H%M time_slice_wait 5s buffer_path C:/fluent/test/output.*</store><store> type tdlog apikey xxxxxx endpoint ybi.jp-east.idcfcloud.com auto_create_table buffer_type file buffer_path C:/fluent/buffer/ybi flush_interval 60s use_ssl true</store></match></ROOT>

8-3. YBIへイベントログ転送テスト

さあ、いよいよ、YBIへログが転送できるかどうか、最後のテストをやっていきます。

7-4と同様、Windowsのeventcreateコマンドでログを書き込んでみます。

c:\>eventcreate /ID 999 /L Application /SO EvtTest /T Information /D "テストメッセージ"

成功: 種類が 'Information'のイベントが、'Application'ログ内に、'EvtTest'をソースとして作成されました。

c:\>

outputファイルにログ出力を確認できたら、YBIでも確認してみましょう。
10_ybiwebui
出力できましたね!

動作確認した環境まとめ

今回、動作確認した環境をまとめて記載しておきます。

  • Windows Server 2012 R2 Std (64-bit)
  • Ruby 2.2.3 (x64)
  • Git 2.6.3 (64-bit)
  • Ruby gem
    • fluent-plugin-record-modifier (0.4.0)
    • fluent-plugin-td (0.10.28)
    • fluent-plugin-winevtlog (0.0.3)
    • fluentd (0.12.15)
    • msgpack (0.5.12)
    • td-client (0.8.77)

終わりに

2回に渡って、WindowsイベントログをYBIへインポートする手順を紹介しました。いかがでしたか?

Windowsのイベントログをインポートできるようになると、例えばWindowsサーバのセキュリティログやアプリケーションログをYBIにためて分析に使ったり、warningのログを拾って対処をすぐにできるようにしたり、いろいろなログの活用方法が考えられそうです。 みなさんも、YBIによるログの収集と分析を試してみてください。

Yahoo!ビッグデータインサイトが気になる方はこちらから!
YBI

それでは、ごきげんよう!

参考記事

今回の投稿作成にあたり、次の記事を参考にさせていただきました。感謝申し上げます。m( )m

<関連記事>

Yahoo!ビッグデータインサイト + オープンソースre:dashで、 アクセスログ可視化ダッシュボードを作ってみた!

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

こんにちは!ビッグデータ戦略グループの朴です。以前、Yahoo!ビッグデータインサイト(以降、YBI)の基本的な使い方を解説した 「Yahoo!ビッグデータインサイトめちゃ楽ガイド」を紹介しました。
めちゃ楽ガイドでは、データのインポート・分析・出力について解説しましたが、今回はその次のステップとして 「分析結果を可視化する」方法として、YBIとオープンソースBIツールre:dashを組み合わせてWebサイトのアクセスログを可視化するダッシュボードの作成方法を紹介します!

f:id:jpark:20160224161620p:plain

              re:dashのダッシュボード

YBIは、大量のデータを収集・保存・分析できるプラットフォームサービスで、様々なツールとの連携性に優れています。 今回は、データの可視化に焦点を置いてre:dashと連携する方法を紹介します。

re:dashはオープンソースのBIツールとして、様々なデータソースに対応しています。 クエリを設定しておき、その結果をデータリスト化やグラフ化してくれます。 YBIユーザーにとって、YBI専用のプラグインが用意されているのでYBIと連携しやすいことが大きなメリットです。

(re:dashの公式サイトはこちら)
re:dashについて詳しく知りたい方は上記の公式サイトをご参考ください。

(追記:2016/08/05)
IDCFクラウドのコミュニティテンプレートにも最近re:dashが追加されました。
数クリックでre:dashインストール済みの仮想マシンが立ち上がり、すぐにre:dashを試すことができます。
(/追記ここまで)

前置きが長くなりましたが、さっそくWebサイトのアクセスログ可視化ダッシュボードを作ってみましょう!

■前提条件

  • YBIのアカウントを持っている。
  • YBIの基本的なWeb UIを操作できる。
  • re:dash環境が構築されている。
  • 基本的なSQL文を書ける。

re:dash環境の構築に時間がかかるかもしれません。このブログでは、re:dashのインストールに関する説明は省略しますが、詳しくは下記URLをご参照ください。m(__)m

re:dashのインストール関してはこちら

■流れ

Step 1. re:dashとYBIを繋ぐ
Step 2. re:dashからYBIへクエリを発行する
Step 3.クエリ結果をチャート化する
Step 4.チャートをダッシュボードにアップロードする

これから、手順の説明が長くなりますが、最後までやってみましょう!

■Step1. re:dashとYBIを繋ぐ

Step1では、re:dashからYBIに繋げるための設定情報を記入して、YBIと繋ぎます。

まず、re:dashにアクセスして、ログインしてください。

f:id:jpark:20160224163839p:plain

赤い枠の「Data Sources」をクリックします。

f:id:jpark:20160224164731p:plain

「Add Data Source」をクリックします。

f:id:jpark:20160224164945p:plain

下図のような入力画面が表示されます。
YBIではTreasure Data社が提供するプラグインをそのまま使えるので、「Type」で「TreasureData」を選択します。

f:id:jpark:20160224165012p:plain

● 入力項目

  • Name:自分がわかりやすいデータソース名を入力します。
  • Apikey:YBIのAPI Keyを入力します。
  • Database Name:「sample_datasets」を入力します。今回は、YBIに既に入っている
    アクセスログのサンプルデータを使います。
  • Endpoint:YBIのエンドポイントである「https://ybi.jp-east.idcfcloud.com/」を入力します。
  • Type:「presto」で入力します。デフォルトはhiveですが、今回はprestoを使います。
     (YBIでPrestoが利用できない場合には、hiveを入力します)

これで、re:dashとYBIを繋ぐ設定が完了しました!すごく簡単ですよね?笑

■ Step 2. re:dashからYBIへクエリを発行する

Step2では、re:dashでクエリを作成して、YBIのデータベース上にあるアクセスログの サンプルデータに対してクエリを発行します。 (YBIにある「sample_datasets」というデータベース内の「www_access」というテーブルのデータを使います)


「New Query」をクリックします。

f:id:jpark:20160224165640p:plain

クエリ作成画面が表示されます。

f:id:jpark:20160224165707p:plain

早速クエリを書いてみましょう。
時間毎のPage View数を集計する基本的なクエリを書いたら、「Execute」をクリックして
クエリを実行します。

下記のように、実行結果が表示されます。

  • 画面の上のクエリの名前を「Page View」で入力します。
  • スケジュール機能を追加します。今回は、毎日00:00時にクエリが実行されるように
    設定します。
  • 問題なければ、「Save」をクリックして保存します。

f:id:jpark:20160224170656p:plain

Step 3. クエリ結果をチャート化する。

Step3では、実行したクエリの結果をチャート化して、ダッシュボードにアップロードします。

「New Visualization」をクリックします。

f:id:jpark:20160224171049p:plain

チャートの種類は棒型、円型、折れ線型などいろいろ選べます。今回は、時間別のアクセス数推移をみるために、折れ線チャートを選びます。X軸に「hour」をY軸に「pv」を選択すると、下記のようなグラフが表示されます。問題なければ、「Save」をクリックします。

f:id:jpark:20160224171137p:plain

■Step 4 チャートをダッシュボードにアップロードする

Step4ではStep3で作成したチャートをダッシュボードにアップロードします。

「New Dashboard」をクリックします。

f:id:jpark:20160224171501p:plain

ダッシュボードには、様々なチャートを一つの画面でまとめて表示することができます。今回は、Webサイトのアクセスに関するチャートをダッシュボードにまとめて表示するため、ダッシュボードの名前に「Website Analysis」と入力し、「Save」をクリックして保存します。

f:id:jpark:20160224171550p:plain

下図のような画面が表示されます。チャートをアップロードするために、「Add Widget」を
クリックします。

f:id:jpark:20160224171621p:plain

チャートは作成したクエリに紐付いているので、Step2で作成したクエリである「Page View」を入力し、「Add to Dashboard」をクリックします。

f:id:jpark:20160224171703p:plain

ダッシュボードにチャートが追加されました。

f:id:jpark:20160224171726p:plain

「Page View」だけでは、寂しいので、時間毎のUU数、PVトップ10のページなどを 表示する
チャートも追加してみました。

f:id:jpark:20160224171744p:plain

Webサイトのアクセス状況を把握するために、PV、UU、各PathのPV数という三つの チャートをダッシュボードにまとめて表示することができました。

最後に、YBIにログインしてみます。 re:dashから発行したクエリが実行されたことが、YBI
ダッシュボードからも確認することができます!

f:id:jpark:20160224171813p:plain

■おわりに

YBIとre:dashを使ってダッシュボードを構築する方法を紹介いたしました。 分析結果を可視化するための、初めのステップとして、YBIとの連携が簡単なオープンソースのre:dashを使ってみるのはいかがでしょうか。 データ分析結果の可視化について参考になれば幸いです。

関連記事

YBIのクエリ結果をSlackへ通知する

$
0
0

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

ビッグデータ・ソリューションアーキテクトの高階(takashina)です。

みなさんの社内や組織内のコミュニケーションには、どんなツールを使ってますか? 電話、メール、ケータイメッセージはもちろんのこと、LINE、FacebookのMessenger、Skype、Facetime、Slack、chatwork、HipChatなどといった様々なジャンルのツールを使っているかと思います。プッシュ通知されるツールだと、タイムラインを追っていくだけで必要な情報や通知内容が読めるので、手間が少なくて便利ですよね。

ログのバッチ処理をしている場合、自動的にその集計結果を送ってきてもらえたら、それも手間が少なくて便利そう。 そこで今日は、Yahoo!ビッグデータインサイト(以下「YBI」)で実行したクエリの結果をSlackへ通知する手順についてご紹介します。
f:id:maktakas:20160530124256p:plain

前提条件

ここから先、次の前提で綴っていきます。

  • CentOSサーバーの基本的な操作ができる
  • 外部のBotから投稿してもOKなSlackのアカウントを持っている
  • YBIのアカウントを持ち、YBIの基本機能を理解している

用意するモノ

手順

1. IDCFクラウドで仮想サーバー作成、ネットワークの設定

まずはIDCFクラウドでSlackへの投稿を操作するサーバーを作ります。 他のサーバーを使う方は、適宜同様の設定をしてください。

IDCFクラウドで仮想サーバーを作成する手順についてはIDCFクラウド ヘルプサイトをご覧ください。 なお、今回はおすすめTemplateのCentOS 7.1 64-bitで作成しました。
ネットワークの設定は下記のように行います。 SSH(22/TCP)とSinatra(4567/TCP)でアクセス可能としてください。
※Sinatraが何者か、は後述します。

まずIPアドレスの取得
f:id:maktakas:20160523204354p:plain

ファイアウォールの設定
f:id:maktakas:20160523204433p:plain

ポートフォワードの設定
f:id:maktakas:20160523204503p:plain

2. Slackでの準備

続いてSlack側で準備をしていきます。通知を送りたいSlackのteamにアクセスしておきましょう。

外部のツール等からSlackへ投稿できる機能としてIncoming Webhooksがあります。今回はこの機能を使ってYBIからSlackへのクエリ結果通知を実現していきます。
なお、既にIncoming Webhooksの設定がされているSlackのChannelであれば、ここの手順は不要です。

2-1. Slack設定ページ

歯車マークのChannel Settingsから「Add an app or integration」を選択します。
f:id:maktakas:20160520143305p:plain

すると、Slackの細かな設定ができるページへ飛びます。 ここの検索窓で「incoming webhooks」を入力すると候補に「Incoming Webhooks」が現れるのでクリックします。

2-2. Incoming Webhooks設定ページ

f:id:maktakas:20160520143621p:plain

team名の右側にある「configure」、「Add Configuration」とクリックします。
f:id:maktakas:20160520144728p:plainf:id:maktakas:20160520144733p:plain

Post to Channelで、Incoming Webhooksで投稿する先のchannelを選択して、 「Add Incoming WebHookss integration」ボタンをクリックします。
f:id:maktakas:20160520145011p:plain

2-3. 投稿用URLの発行

https://hooks.slack.comで始まるWebhook URLが発行されます。 外部ツールからこのURLにデータを投げるとSlackのChannel投稿されるわけです。
f:id:maktakas:20160520145956p:plain

このページでは、Webhookを使った投稿者名、アイコン等を変更することができますが、とりあえず今はそのまま次に進みます。 「Save Settings」をクリックして、Slack側での準備は完了です。

※注意!
このWebhook URLは関係者以外に知られないようにしてください。バレてしまうと誰でもChannelへ投稿できるようになってしまいます!

2-4. Webhook URLのテスト

Webhook URLを使った投稿ができるかどうか、CentOSサーバーにログインして、試してみましょう。

$ curl -X POST --data-urlencode 'payload={"text": "Test Message"}' https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx

うまく行けば、SlackのChannelにこんな投稿がされているはずです。
f:id:maktakas:20160523155616p:plain

3. td2slackの準備

続いて、CentOSサーバーにてtd2slackをインストールします。 YBIはTreasure Dataのサービスをベースにしています。YBIからSlackへ通知する仕組みについては、Treasure Dataのクエリ結果をSlackに流せる「td2slack」があるので、これを使います。

td2slackは、RubyによるWebアプリケーションを簡単に実現するためのソフトウェアであるSinatraで作られています。 今回ご紹介しているtd2slackは、YBIから送られてきたHTTP PUTをSinatraでフッキングしてSlackへ送る、という動きをしています。
Sinatraについて詳しく知りたい方はこちらをどうぞ

3-1. yumインストール

td2slackをインストールするのにbundlerを使っていきます。
その前に、インストールに使うruby-devel、gcc、rubygem-bundlerをyumでインストールします。RubyGemsもアップデートしておきましょう。

$ sudo yum install ruby-devel gcc rubygem-bundler
(中略)
New leaves:
  gcc.x86_64
  ruby-devel.x86_64
  rubygem-bundler.noarch

$ sudo gem update --system
Updating rubygems-update
Fetching: rubygems-update-2.6.4.gem (100%)
Successfully installed rubygems-update-2.6.4
Installing RubyGems 2.6.4
RubyGems 2.6.4 installed
(中略)
RubyGems system software updated

3-2. git clone

適当なディレクトリ配下にgit cloneします。

$ git clone https://github.com/treasure-data/td2slack.git
Cloning into 'td2slack'...
remote: Counting objects: 49, done.
remote: Total 49 (delta 0), reused 0 (delta 0), pack-reused 49
Unpacking objects: 100% (49/49), done.

3-3. 環境変数設定

下記の環境変数を設定します。

$ export SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx
$ export RACK_ENV=production
  • Sinatraアプリケーション(app.rb)からSLACKへ投稿する際に、SLACK_WEBHOOK_URLの環境変数で指定したURLへ送っています。
  • RACK_ENVは、Sinatraアプリケーションを外部のサーバーから利用できるようにするために設定しています。

3-4. td2slackインストール

td2slackで使われるjsonのgemがGemfileに含まれていなかったため、追記したうえでbundlerでインストールします。

$ cd td2slack
$ vi Gemfile
source 'https://rubygems.org'
gem 'sinatra'
gem 'slack-notifier'
gem 'json'     (← 一行追加)

$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/.............
Resolving dependencies...
Installing json 1.8.3
Installing rack 1.6.0
Installing rack-protection 1.5.3
Installing tilt 2.0.1
Installing sinatra 1.4.6
Installing slack-notifier 1.1.0
Using bundler 1.7.8
Your bundle is complete!
It was installed into ./vendor/bundle

これで実行環境が整いました。

4. 実行テスト

とりあえず実行してみましょう。

$ bundle exec ruby app.rb
[2016-05-23 20:21:05] INFO  WEBrick 1.3.1
[2016-05-23 20:21:05] INFO  ruby 2.0.0 (2014-11-13) [x86_64-linux]
== Sinatra (v1.4.7) has taken the stage on 4567 for production with backup from WEBrick
[2016-05-23 20:21:05] INFO  WEBrick::HTTPServer#start: pid=11116 port=4567

この状態でYBIのWeb UIからクエリを実行してみます。 適当なDatabaseを選んで、テスト用に「SELECT 'aaa' AS foo」などという単純なクエリを書きます。 このクエリの結果は「foo」カラムに「aaa」という文字列が1行だけ現れます。
f:id:maktakas:20160523211531p:plain

これをResult Exportの機能で「HTTP PUT」へエクスポートします。記入個所はHost、Port、Pathの3箇所です。
f:id:maktakas:20160523211541p:plain

ここまで設定したら、Web UI右上にある「Run」!

すると..Slackにこんな投稿がされるはずです。
f:id:maktakas:20160523212329p:plain

CentOSサーバーにはこんなログが出てます。

WARN: tilt autoloading 'tilt/erb' in a non thread-safe way; explicit require 'tilt/erb' suggested.
xxx.xxx.xx.xx - - [23/May/2016:20:23:54 +0900] "PUT /example HTTP/1.1" 200 - 0.4638
xxx-xxx-xx-xx.jp-east.compute.idcfcloud.com - - [23/May/2016:20:23:54 JST] "PUT /example HTTP/1.1" 200 164
- -> /example
[2016-05-23 20:23:54] ERROR Errno::ECONNRESET: Connection reset by peer
        /usr/share/ruby/webrick/httpserver.rb:80:in `eof?'
        /usr/share/ruby/webrick/httpserver.rb:80:in `run'
        /usr/share/ruby/webrick/server.rb:295:in `block in start_thread'

確認できたらSinatraは止めておきましょう。Ctrl-Cです。

5. td2slackをデーモンで動かす

Sinatraアプリであるtd2slackは、rackupコマンドでデーモン起動可能です。下記では4567/TCPポートで起動しています。netstatで起動状況を確認してみましょう。

$ bundle exec rackup -D config.ru -p 4567

$ netstat -tnap
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:4567            0.0.0.0:*               LISTEN      18591/ruby      

止める時はkillしてください。

$ kill -9 ${pid}

6. 出力結果のフォーマット作成

Result Exportを設定する際に、 Path: /exampleと設定しました。 これは、CentOSサーバーのtd2slack/viewsディレクトリ配下にあるerbファイルに沿って出力されています。 example.erbファイルを見てみると..

$ more views/example.erb
This is <%=@td['foo'][0]%>

クエリの結果は「foo」カラムに「aaa」という文字列が1行だけ現れるもので、Slackへの投稿された内容は以下の通りでした。
f:id:maktakas:20160523212329p:plain

<%=@td['foo'][0]%>の部分にクエリ結果の「aaa」が代入されていたのですね。 このようにviewsディレクトリ配下のerbファイルを設定すると、いろいろと出力結果をカスタマイズできます。

ところで、YBIにはsample_datasetsというデータベース内に、過去のNasdaq株価データが入ったテーブルがサンプルデータとして格納されています。このデータセットに対して、次のようなクエリを実行して、結果をSlackへ流してみましょう。Sinatraアプリを起動しておくのをお忘れなく。

$ bundle exec rackup -D config.ru -p 4567

設定ファイル:トップ5をフォーマットして表示しています。

$ vi views/rate_of_increase.erb
Nasdaq株価上昇率トップ5
日付 | 銘柄 | 上昇率
<% 5.times do |i| %>
  <%= i + 1 %>位 <%= @td['date'][i] %> | <%= @td['symbol'][i] %> | <%= @td['rate_of_increase'][i] %>
<% end %>

クエリ:日毎・銘柄毎の株価上昇率を計算して、上昇率トップ5を取得しています。

SELECT TD_TIME_FORMAT(time, 'yyyy-MM-dd') AS date, symbol, (close - open) / open AS rate_of_increase
FROM nasdaq
WHERE TD_TIME_RANGE(time, '2012-01-01', '2013-01-01')
  AND (close - open) > 0
  AND open > 0
ORDER BY rate_of_increase DESC
LIMIT 5

Result Exportの設定は次のようにします。

Export to: HTTP PUT
Host: td2slackが動くホスト名かIPアドレス
Port: 4567
Username: 空白
Passowrd: 空白
Path: /rate_of_increase

クエリをRunしてみましょう。Slackへ出力される結果は次のようになるはずです。
f:id:maktakas:20160524212506p:plain

今回の環境

$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
$ /usr/bin/ruby -v
ruby 2.0.0p598 (2014-11-13) [x86_64-linux]
$ /usr/bin/gem -v
2.6.4
$ /usr/bin/bundler -v
Bundler version 1.7.8

おわりに

いかがでしたか。
クエリ結果を定期的にSlackへ出力してもらえると、監視アラートの代わりに使うこともできますね。

それでは、ごきげんよう!

介護現場における IoT x 機械学習の実証実験レポート

$
0
0

はじめまして。データビジネス本部の木村です。普段は福岡オフィスで Python の機械学習系のライブラリを使ったデータ分析・予測モデルの構築を行っています。

IDCF は今年、高齢者介護施設においてIoTセンサーとデータ分析技術を活用し、機械学習による介護/看護職員の行動認識・業務分析を実証実験として実施しました。今回はその実証実験について、技術視点でお伝えしたいと思います。

Contents:

実験フィールドは「介護現場」

このプロジェクトは、福岡県を中心に全国で84施設の介護施設を運営する株式会社さわやか倶楽部さん、九州工業大学、 IDCF の合同で行われた実証実験です。 IoT デバイスを使ったセンシングと機械学習により、施設の職員の方々の行動認識を行いました。

実験フィールドは、福岡県北九州市にある定員65名の介護付き有料老人ホームです。それなりに大きな介護施設で、利用者の方々も職員の方々もたくさんいらっしゃいます。実験時は介護士の方が22名、看護師の方が5名でした。

実験の目的は「職員の業務効率化」

職員の方々は、日々の業務を手書きで記録しています。記録業務は、業務時間全体で大きなウェイトを占めています。そこで、実験ではセンシングと機械学習により行動認識を行い、業務を推定することで記録業務を自動化したいというねらいがありました。また、行動認識により「いつ」「どこで」「誰が」「何を」していたかを蓄積することで、職員の業務負担を可視化して忙しい時間と場所にリソースを分配するなど、介護業務の効率化・品質向上を図るねらいもありました。今回は実証実験として、各手法が「本当に業務効率化の役に立つか?」にフォーカスしています。 IDCF としては、センシング技術や機械学習技術の習得をしたい、というねらいもあります。

行動認識をする上で業務をカテゴリ化する必要がありました。実験では介護・看護という職種で分割し、「食事介助」「服薬介助」「トイレ介助」など、それぞれ25種類程度の業務に分割しました。介護・看護の業務は重複があるので、全体で31種類の業務が定義されました。行動認識では、その業務のうちどれを実施してたかを機械学習で予測します。

要素技術

全体構成

全体の構成は次のようになりました。

f:id:mmurakami75:20171020151647p:plain
構成とデータフロー。センサータグとスマートフォンでデータを集め、クラウド側で処理します。

施設の壁などに設置される「環境センサー」と、職員のあたりに装着される「スタッフセンサー」により温度、湿度、加速度などのデータを取得します。取得データは BLE (Bluetooth Low Energy)通信により職員が携帯しているスマートフォンに送られます。センサーデバイスだけでなく、スマートフォンに搭載されているセンサーのデータも付加されます。データは Wi-Fi ルーター経由でサーバーにアップロードされます。サーバーサイドのアプリケーションは、 IDCFクラウド上の OpenShift という PaaS 基盤の上で動作します。そこで認証、データクレンジングが行われ、センサーデータは トレジャーデータサービス by IDCFに格納されます。バッチ処理により機械学習アプリケーションが実行され、その日の職員の行動が予測として出てきます。また、センサーデータとは別に、職員の手入力による行動ログも記録されます。このデータは機械学習の教師データとして利用します。

IoT デバイス

「環境センサー」と「スタッフセンサー」は同じデバイスを使っています。Texas Instruments 社の SimpleLink SensorTag というデバイスです。

CC2650STK SimpleLink SensorTag | TIJ.co.jp

「温湿度センサー」「周辺光センサー」「赤外線温度センサー」「加速度、ジャイロセンサー」「気圧センサー」が搭載されており、 BLE 通信によりスマートフォンなどのデバイスとの連携が可能です。

f:id:mmurakami75:20171020151817p:plain
スタッフセンサー。職員の方が着ているエプロンにつけていただきます。

f:id:mmurakami75:20171020151857p:plain
環境センサー。利用者さまのご協力・同意のもと、施設の通路や居住スペースなどに設置します。

スマートフォン

デバイスは FREETEL の Priori3 という端末を使いました。この実験ではスマートフォンの役割は2つあります。ひとつはセンサーデータの集計とアップロードで、もうひとつは業務記録の集積です。

センサーデータの取り扱いは、九州工業大学の井上研究室の方々が開発した InuLog というアプリケーションを使います。このアプリケーションは主に以下の5つの機能を持っています。

  1. スマホ搭載センサーのデータ取得
    • 加速度、地磁気、方位、角速度、照度
  2. センサーデバイス(SensorTag)のID取得
    • 設置場所情報として利用
  3. マルチスレッドによるセンサーデータ取得
    • 同時並行で複数のデバイスの複数のセンサー種に接続・データ取得
  4. 自動ログイン
    • 定期的にログイン実行、セッション切れに対応
  5. バッファ関連機能
    • バックグラウンド実行を継続
    • 端末再起動後もアプリが起動
    • ネットワークが中断しても確実に1回アップロード

業務記録の入力には、サードパーティの aTimeLogger というアプリケーションを利用しました。あらかじめ登録しておいた行動を手動で登録することができます。開始時と終了時に画面をタップすることで、いつ何をしていたかを記録します。入力した行動データはあとから修正可能になっています。クラウド機能もあり、 app.atimelogger.com と自動で同期するようになっています。同期された行動履歴情報はAPIで取得することができます。

f:id:mmurakami75:20171020151939p:plain
スマートフォンは Wi-Fi ルーター経由でインターネットに接続します。手作り感!

サーバーサイド

サーバーサイドアプリケーションの役割は認証、データの加工、機械学習による行動認識です。

まず Ruby on Rails アプリでデータを受け、クライアントの認証を行い、それを次の Node.js アプリに投げます。そこでは簡単なデータの加工やクレンジングを行います。空データをはじいたり、タイムスタンプのフォーマットの表記ゆれを修正したりします。クレンジングされたデータは トレジャーデータサービス by IDCFに保存されます。

aTimeLogger に保存されたデータは、バッチ処理により定期的に PostgreSQL にコピーされます。このデータと トレジャーデータサービス by IDCFに保存されたセンサーデータをもとに機械学習を行います。機械学習のロジックは R で書かれており、 k-最近傍法という手法をコアに実装され、行動のクラスタリングを行います。

IDCF の役割

開発フェーズではサーバーサイドの技術選定と実装、運用・実験フェーズではデータの可視化、分析レポートの作成などを行いました。

  1. データフローの設計、構築
    • 要件・実験フェーズにあわせた技術選定
  2. コンテナベースのアプリ群を OpenShift 上にデプロイ
    • 試行錯誤・探索型の開発プロセスに対応
  3. BIツールによる 行動データ・センサーデータの可視化
    • Re:dash による可視化環境の構築・運用
  4. 分析レポート作成
    • 行動ラベルデータと職員属性を比較した分析レポートの作成

行動ラベル分析

実証実験の主なねらいは行動認識による自動予測です。しかし、せっかく手入力の業務記録を集積したのに、機械学習に使うだけではもったいないですよね。このデータを使って業務分析をやってみました。

作業時間の分布

f:id:mmurakami75:20171020152027p:plain
1回あたりの作業時間ごとの実施回数

まずは各作業の完了時間でヒストグラム化してみました。10分以内で終わる作業が一番多いことがわかりますね。これだけでも、介護業務が細切れのタスクがたくさんある、ということがわかります。

作業項目ごとの平均作業時間とトータルの実施回数

f:id:mmurakami75:20171020152112p:plain
作業項目ごとの平均作業時間と実施回数

縦軸を平均作業時間、横軸を総実施回数としてマッピングしてみました。「トイレ介助」は1回あたりの作業時間は長くないが頻度は最も高い、など各作業の特性がわかりますね。

1回あたりの作業時間と職員属性の関係

f:id:mmurakami75:20171020152157p:plain
職員ごとの作業時間(中央値)と経験(年)

経験の長さと作業時間にはなにか関係があるのでは?と思い、縦軸を1回あたりの作業時間(中央値)、横軸を経験(年)として各職員をプロットしました。また、職員の持っている資格によってグループ分けしてあります。プロットされた各点の数字はデータ上の識別番号で、意味はありません。

これを見る限りでは、経験年数や資格で1回あたりの作業時間に差がある、ということはなさそうです。これは、各業務が標準化されて職員の経験によって差がでにくいようになっていると言えるのかもしれません。

中央値や平均値では差はありませんでしたが、もっとよく調べてみると作業時間の「ばらつき」には資格の有無で差がありそう、ということがわかってきました。より高度な資格を持っている職員ほどばらつきが多いようです。つまり、短時間で終わる作業は全職員が行うが、高度な資格を持っている職員は比較的長時間の作業をする必要がある、ということでしょう。このあたりは、さらに踏み込んだ調査が必要になりそうです。

機械学習による行動認識

さて、機械学習による行動認識の精度はいかほどだったでしょうか。

通常、行動認識を行う場合は「その瞬間何をしていたか」あるいは時間を一定のセグメントに区切って「各セグメントで何をしていたか」を認識するシンプルなクラスタリングを行います。しかし、今回は「開始・終了時刻の予測」と「その期間何をしていたか」を同時に予測します。また、介護業務では並行作業もあるため、さらに複雑になります。

精度評価は、「開始時刻の予測精度」と「継続時間の予測精度」別々で行います。時刻や時間の精度を秒単位で行うのは大変むずかしいので、ある程度マージンを持たせて、精度評価を行っています。また、さらに作業項目ごとにわけて評価を行っています。

まずは「開始時刻の予測精度」です。

f:id:mmurakami75:20171020152318p:plain
作業項目ごとの開始時刻予測精度

マージンは3時間としています。つまり、誤差が3時間以内なら認識成功としています。「朝礼」や「休憩」などの精度の高い項目を除き、あまり高い精度で予測できていないことがわかります。

次に「継続時間の予測精度」です。

f:id:mmurakami75:20171020152250p:plain
作業項目ごとの継続時間予測精度

継続時間予測では、10分の誤差を認識成功として評価しています。開始時刻予測に比べれば高い精度が出ていることがわかります。

まとめと課題

介護現場での IoT と機械学習による行動認識実証実験についてお伝えしました。センサータグとスマートフォンによりデータを収集し、機械学習による行動認識を試みました。一方でラベルデータとして収集した行動ログを分析し、職員の方々の作業傾向の可視化を行いました。

センサータグについては、故障や電池切れによる現地作業が頻繁に発生し、データの安定収集に課題があることがわかりました。スマートフォンでの作業実績の記録については、職員の方々のリテラシーに課題が見られました。普段スマートフォンを使っていない方が多くいらっしゃったようで、入力に苦戦していたようでした。

行動ログの分析については、誰がどんな作業をしているか、感覚に頼って予測していたものを定量的に可視化することができました。それにより、作業負荷が高いフロアや時間帯にパート職員の方を配置する、定時作業を比較的作業の少ない時間帯にずらす、などの対応策が可能となりました。職員のみなさんの業務を定量的に見える化することで、介護業務の効率化と品質向上に貢献することが原理的には可能であることを示すことができたと思っています。

一方で、機械学習による行動認識の精度には課題があります。継続時間予測はそれなりの精度が出ていますが、開始時刻の予測に難があります。この精度では予測結果をそのまま業務記録として使うことは難しいでしょう。精度向上のためには、アルゴリズムの見直しだけでなく、センサーデバイス側の改善も必要です。例えば、今回は職員の位置情報の予測には環境センサーのデバイスIDを使っていましたが、ビーコンを使ってより正確な位置の把握をすべきでしょう。また、センサーデバイスを増やすことで精度向上につながると考えられます。高い精度の行動認識システムを構築できれば、職員のみなさんが手入力することなく行動ログの集積と分析を行うことができます。きっと業務の効率化と品質向上につながることでしょう。

今回の実証実験の内容は、プレスリリースでも公開しており、日経新聞さんにも取り上げていただいています。また、「介護施設における介護スタッフの行動センシング実験」というタイトルで研究会発表、論文執筆も行っています。詳細が気になる方は、ぜひそちらもご確認ください。

普段は IDCF クラウド関連の記事が多いこのテックブログですが、今回は一味違った内容をお届けできたと思っています。 IDCF といえばクラウドやデータセンターなど、 IT インフラのイメージが強い方もいらっしゃるかもしれませんが、 IoT やビッグデータ、機械学習などのキーワードを中心に新規ビジネスの開拓も常に行っています。もし、この分野で活躍したいエンジニアがいらっしゃいましたら、ぜひ採用ページからご応募ください! OSS を中心とした最新技術の調査・検証を行いながら、新たなビジネスを創るチャレンジングな職場です。インフラ、ミドルウェア、サーバーサイドアプリケーション、 Web フロントエンド、機械学習・分析、どのレイヤーのエンジニアでも強みを活かして貢献することができます!

データ分析系サービス開発エンジニア・プログラマ募集要項 IDCフロンティア中途採用


Viewing all 15 articles
Browse latest View live