カテゴリー別アーカイブ: 未分類

AWS ストレージサービス「S3」

Pocket

今週もまた台風が近づいておりますね。 初めまして、今年新卒で入社した技術開発部の程です。 週末は同僚と登山に行く予定なのに台風直撃の知らせを聞いて下がり気分です。 自然ばかりはITの技術だけではどうにもならないので仕方ないですね。

さて、私、現在は自社DSP、Bypassの開発に携わっているのですが 弊社広告配信システムはAWSを利用して構築されております。 今回は、AWSの中でも特に 弊社広告配信システムにおいても実際に活用している S3というストレージサービスについて 簡単に概要や特徴などについてまとめたいと思います。

S3

S3では、バケットと呼ばれる仮想的なオブジェクト置き場に 様々なファイルやメディアコンテンツ(=オブジェクト)を格納し AWSクラウドサーバ上に保存することができます。 保存したオブジェクトはいつでもどこからでも参照したり 新規オブジェクトを追加することができます。

S3の特徴

  • 容量無制限
  • スケーラブル
    容量は無制限となっており、大量のデータを扱う場合にも、上限を心配することなく使用できます。
  • 冗長化されている
    保存したオブジェクトは異なるアベイラビリティゾーン(AWSによる場所の区分け) にある複数のサーバーに複製保存されるので 障害発生時にデータロストの危険性が低く安心です。 また、自前で冗長化する手間が省けるという利点もあります。
  • 高い堅牢性
    99.999999999%(イレブンナイン)の堅牢性(aws公式サイトより)

S3の操作

S3上でオブジェクトは次のような形式で表現され、管理されます。

調べたところ、S3内部ではフォルダという概念はなく、S3上では単純にKey-Value方式でオブジェクトが格納されているのだそうです。 とはいえ、実際に使ってる時はあんまり意識する必要はなく、通常のファイルと同じような感覚で操作できるのがいいですね。

AWSではS3を操作するための方法をいくつか用意しており、目的に応じて使い分けも可能です。 具体的には以下のようなものが挙げられます。

  • ブラウザ上のコンソールから操作
  • コマンドラインから操作
  • AWS提供のSDKより各種アプリケーションから操作
  • 3rd party製のツールで操作

コマンドラインから操作できるのは便利ですね。 以下のように、基本的なバケットやファイルの作成、削除、コピーなどの操作は一通りCLIで実行可能です。

S3操作用のコマンドとしては上記のものの他に、aws s3apiというものがあり、前者はAPIとコマンドが1:1で対応する形の低レベルなコマンド群であるのに対し、後者は複数のリクエストにまたがる様な処理などが実装された高レベルなコマンド群である、という違いがあります。

もちろん、ローカル->S3だけではなく, S3->ローカルやS3->S3間のファイル移動を行うこともできます。

コンソールから操作する場合は以下のような画面上で、バケット作成やファイルのアップロードを行います。

ログインしたら最初に表示されるバケット管理画面のイメージです。

バケット新規作成の後は、そのバケット内に格納されるファイルを管理する画面に遷移します。 この画面上では、バケットへのファイルのアップロードや、フォルダの作成などができます。

適当に1個ファイルをアップロードしてみるとこのようにファイルが追加されます。

コンソール上で操作する場合は、クリック操作だけで非常に簡単に、バケットの作成からファイルのアップロードまで実行することができました。

S3のユースケース

AWS公式サイトやWebサイト上の記事を調べると、次の3つが主なユースケースとしてよく取り上げられています。

  • データのバックアップ
    前述の通り、高い堅牢性を備えていることから、消失すると困る様々なデータを保管する。
  • コンテンツ配信
    S3上に保存したコンテンツを配信する。
  • ログデータなどの保存先
    EC2で収集されたログの退避先、ビッグデータ分析で使用する生データの保存先として利用する。

弊社広告配信システムにおいては特に動画広告の場合に、S3上に動画素材をアップロードした上で AWS CloudFrontとS3を連携させることで、容量の大きい動画系広告でも高速かつ安定した広告配信を実現しています。

バージョン管理

S3で保存されるオブジェクトは、バージョンで管理することも可能です。例えば、誤削除などのミス発生時などにこの機能が適用されていれば、すぐに以前のバージョンに復旧することができます。 この機能を有効化すると、オブジェクトを更新した時などに 前の世代のオブジェクトが自動的に保管される様になります。 何世代分保存するかを指定することもできます。

Notification(通知)機能

バケットにファイルが追加されたことをイベントとして検知したい時はこの機能が有用です。 この機能ではバケット単位で、以下のイベントが発生した際に Amazon SNS, SQS, LambdaといったAWSサービスに通知を飛ばすことができます。

  • 新しいオブジェクトの作成イベント(Put, Post, Copy, CompleteMultiPartUpload)
  • オブジェクト削除イベント(Delete, DeleteMarkerCreated)
  • 低冗長化ストレージのオブジェクト消失イベント(RRSObjectLost)

その他の機能

  • クロスリージョンレプリケーション
    別リージョンへの複製保存を行う。
  • S3へのアクセスログ
    S3上でバケットに対してどんな操作を行ったかの記録ログを出力させる。
  • Tag管理
    バケットに対してタグを指定する。
  • メタデータ
    オブジェクトに対してメタデータを設定する。

私自身、入社して初めてクラウドサービスを触ったのですが 実際に使ってみるとその操作の簡単さと便利さに驚きました。 個人利用も可能なので、個人の自主アプリ制作などにも活用できそうですね。

それでは以上となります。

AWS Glue + Athena構成を試す

Pocket

こんにちは。技術開発部の赤井橋です。

弊社では現在adstirログ基盤のリプレイスを計画しており、その一貫としてAWS Glueでのデータ変換(json → parquet)、及び変換データのAthenaでの検索を試しました。

Glueとは

https://aws.amazon.com/jp/glue/

2017-08-15から利用出来るようになった抽出、変換、ロード (ETL) を行う完全マネージド型のAWSサービスです。 使い所としてはファイルのカラムナフォーマットへの変換、及びパーティションが有効なディレクトリへの配置、データカタログ(テーブル定義のメタデータ)の更新・・など、 ビッグデータを使いやすく成型する場面が多いかと思います。

Glueが提供する機能

大きく分けて2つ存在します。(2018-07-31時点)

1. データカタログの更新

クローラという機能を用いてデータカタログの自動更新を行うことが出来ます。 クローラは指定されたデータソース(特定のS3ディレクトリなど)内をスキャンし、該当ディレクトリにあるファイルフォーマットに合わせたテーブル定義(パーティショニング含む)を自動で行ってくれます。 定義されたデータカタログはAthena、EMR、Redshift Spectrumでも使用(2018-07-31時点)でき、実行スケジュールの登録も可能です。

2. ETL

ジョブという機能を用いてデータ抽出、変換を行うことが出来ます。 ジョブ追加時のセットアップガイダンスに従って進めていくと最終的にPythonのスクリプトが自動生成されます。シンプルな処理であればスクリプトの修正は不要ですが、手の込んだ処理の場合修正する必要があります。 ジョブを定期実行するトリガーという機能もあります。

使用にあたり

上記2つの機能はどちらかだけ使用してもよく、どちらとも使用したい場合も使用順序に制約はありません。 そのため、クローラでテーブル定義を更新し、更新されたテーブル定義を元にジョブでのデータ変換を行う、という流れ以外にもジョブで変換されたファイルに対してクローラでテーブル定義を更新する、という用途でも使用出来ます。

ジョブのスクリプト

セットアップガイダンスを終えるとPythonスクリプトが生成されますが、例えば特定の引数を受け取って処理を行いたい場合は別途実装が必要です。 スクリプトではGlueで独自定義されたDynamicFrameというデータ構造を操作することで独自の変換処理を行えます。

例)AWS CLIからyear引数を指定してGlueを実行し、受け取ったyear引数をS3のデータソースのパスとして設定したい場合

AWS CLI

スクリプト

変換対象のフォーマットが複雑な場合も別途実装が必要です。

例)tsvフォーマットの1列にjson文字列があり、json文字列の部分をstructの配列として変換したい場合

元データ(tsv)

スクリプト

GlueとAthena、使ってみて不自由だった点

Glueでデータソースとして読み込めるのは文字コードがUTF-8のみ

UTF-8以外の文字列が変換対象のデータソースに含まれているとGlueでの変換処理が失敗します。

[AWS Black Belt Onine Seminar] AWS Glue

根本的な解決ではないですが、AWS Lambdaを用い対象となるログファイルをUTF-8に変換する、という前処理を行うことで対処しました。

DPUを上げても劇的な処理速度向上は見込めない

GlueではDPU(データ処理ユニット)の数を指定出来るのですが、2倍にすれば2倍処理が早くなる、という挙動ではありませんでした。 7.7G分のファイルでそれぞれ検証したところ、

という結果でした。

Athenaでのstruct型の使い勝手が悪い

struct型のスキーマ定義に値を追加すると、スキーマと同様の構造で格納されているパーティションでは問題なく検索出来ますが、 値が存在しない(スキーマ変更前の構造の)ファイルが格納されているパーティションでは「HIVE_CANNOT_OPEN_SPLIT」エラーが発生し検索できませんでした。

こちら根本的な解決法はないようで、暫定対応としてstruct型をstring型に変更し検索の際にstring文字列をjsonと扱うように対処しました。

まとめ

検証の結果、コストや処理時間なども考慮するとまだGlue + Athenaを導入する判断に至っていません。ただ、比較的新しく提供されたサービスのため今後も機能が追加され使い勝手も改善されていくはずです。 ビッグデータがますます全盛となる時代、このようなサービスの重要性は増していくのではないでしょうか。

今回は以上です。

監視ツールの比較

Pocket

こんにちは。配信/インフラチームの佐々木です。

今回は監視用ミドルウェアについて比較(と個人的な所感)について記載したいと思います。 私自身が実際に利用したことのあるツールが殆どなので、使用感なども踏まえてお話できればと思います。

Zabbix

ZabbixはラトビアのZabbix社で開発されているツールで、OSSの監視ツールではNagiosと並んでシェアが高い製品になります。Zabbixの特徴としては非常に多機能で、監視については大抵の事がZabbixで出来ますので、監視を一元管理したい場合には非常に有効なツールになります。その一方設定が複雑で、動作も他のツールと比較すると重いです。C言語/PHPで書かれており、設定ファイルがXML(GUIで設定することの方が多いと思いますが)、データストアにMysql/PostgreSQLが利用されていますが、大規模なインフラの監視の場合はRDBの知識が必要になってきます。

Nagios

NagiosはZabbixとよく比較されるツールですが、この二つは意外と差異が多い印象です。Nagiosはアラート機能に特化しているツールで、メトリクス可視化用のツール(munin等)と使い分けて利用する事が多いです。その分軽量かつ設定もシンプルで、バックエンドにデータストアの利用もありません。設定はテキストファイルに記述し、この点もGUIで管理するZabbixとは大きな違いがあります。

Munin

前述の通りNagios等と組み合わせて使われる事が多いツールですが、可視化用のツールなもののアラート通知の機能もちゃんと搭載されています。

Monit

Monitはアラート機能に特化しているツールで、導入と設定が簡単なため、カジュアルに最低限の監視だけしたい!という場合にお勧めできるツールです。一応WEBインターフェースも用意されているのですが、メトリクスを見るのにはあまり適していません。

Sensu

SensuはNagiosの問題点を解決する用途で開発されたツールで、クラウド環境に適した作りになっているのが大きな特徴です。Chef/Puppetを利用することで、エージェントをインストールするだけで監視を開始でき、オートスケール等に対応しやすいのが売りです。SensuはRubyで書かれていますが、データストアにRedis、エージェントとの通信部分にRabbitMQ、WEBインターフェースにGraphite等が使われていて、様々なミドルウェアを必要としますがそれをChef/Puppetで簡単にインストールする、というコンセプトの製品です。設定は全てJsonで行うので、この点もコードとして扱いやすいというメリットがあります。

PandraFMS

PandraFMSはスペインのArtica社で開発されているツールで、AWS等のクラウド/仮想環境への対応やスマートフォンでのWEBインターフェースを備えており、最近の環境に適した製品になっています。無償版と有償版の他にSaasがあるのが特徴で、こういった料金体系の製品はかなり珍しいかと思います。有償版があるだけに使いやすいUIを備え、設定もGUIで行います。開発言語はPerlなようです。

私は今回紹介する中でSensuとPandraFMSだけは利用経験が無いのですが、双方とも機会があれば使ってみたいと思う製品です。

Amazon CloudWatch

監視ツールというよりAWSの機能の一つなのですが、APIを利用することによりAWS以外のリソースも監視可能です。昔は使いにくかったのですが最近かなり改善されており、実際弊社でもアラート通知・メトリクス可視化でCloudWatchを利用するケースが増えています。料金がかかってしまうのが難点ではありますが、監視サーバ用にインスタンスを立てるよりも安く済むケースもありそうですし、AWSを利用している場合はぜひお勧めしたい機能です。

Makerel

はてな社で開発されているSaas型の監視ツールで、日本国内で開発されているだけに日本人向けのUIになっているのが特徴です。面白いのはサーバサイドがScala、エージェントがGo言語で書かれているのですが、エージェント部分はソースが公開されているという点です。Pluginのプルリクエストも受け付けているようで、開発に参加してみるのも面白いかもしれません。

今回は以上となります。

Windows Mixed RealityのadstirSDK研究開発について

Pocket

MRサービス研究開発室の佐々木(竜)と申します。 MRサービス研究開発の一環としてHoloLensのアプリにおいて広告表示を行うSDKを開発しましたのでその紹介をさせていただきます。

前提知識

Windows Mixed Realityとは?

Untitled Diagram
MRは、現在一般的な仮想現実技術のAR、VRを含んだ技術です。 現実空間に仮想的なものを表示する部分から、周りのもの全てを仮想的に表示するところまでを技術範囲としています。

HoloLensとは?

Windows Mixed Realityに準じたAR端末で、端末内にPCが内蔵されており単体で動作します。 視線方向の環境データを認識して現実物体に対してオクルージョンなどの処理をしながら表示することができます。

MixedRealityToolKit-Unityとは?

HoloLensのアプリケーションを作成するときに必要となる、HoloLensデバイスの入力などを容易に制御できるようにするスクリプト群です。 これを用いることにより、Unity上で空間認識などを扱うアプリケーションを容易に開発することができます。

実際の動作動画

SDK設計

動作環境設定

開発環境 Unity 5.6.2f1
Visual Studio 2015

device
HoloLens Developer Edition
Windows10 Microsoft

Plugin
MixedRealityToolKit#Unity 5.6.2f1

Scene Hierarchy 今回はテストのため、広告を表示するのに最低限のオブジェクトのみを配置しています

機能要件

  • UnityのScene内に広告を表示します。
  • 広告は実際にadstir経由で入札を行い、案件をとってきます。
  • HoloLens側の空間認識を利用し、実際に壁にポスターのように表示します。
  • 人のタップしたジェスチャーを認識して、Edgeを起動LPを表示します。

動作フロー

広告表示フロー (2)

①空間を認識する

MixedRealityToolKit内のSpatialMapping.prefabをScene内に配置することで、HoloLensで認識した空間データをもとに、空間をメッシュ化して空間に沿ったメッシュとメッシュコライダーを配置します。作成した空間が、アプリケーションの動作上十分な数に達したとき空間のメッシュへの変換を停止します。

上記のようにコルーチンのStart処理で、マッピングの終了をハンドリングします。 そして、あらかじめ設定した空間認識の時間を過ぎたときMapping処理を止めて、空間メッシュを作成します。 空間認識の処理は重い処理となっているので、アプリケーションの要件に合わせて、空間スキャンの時間を設定します。

参照 : HoloToolkitのSpatialMappingを理解する

②広告データを取得する

①の動作と同時に広告リクエストを非同期で飛ばします。

広告をリクエストする前に、処理が終わったイベントを登録します。OnSetAdImage内では広告が読み込まれたフラグを立てる処理と、タップされたときのイベントをセットします。Unityの他のGameObjectから広告の読み込み終了を参照しやするするために、フラグとしてイベントの終了をUnity側で持っておきます。

Managed Pluginを作成するとき

UnityEditor側からDebugで動作させるときと、実際にHoloLensに配置して動作させるときでアプリケーションのrun timeが変わり、参照できるライブラリが変わってきます。 今回のSDKでは、実際にUnityのSceneに配置する前提でした。なので、UnityEditor側からある程度動作を再現したかったので下記のようなプロジェクト構成をしました。

Pluginディレクトリ構成

Pluginの実態はSharedの中に持っていて、UWP、UnityのフォルダはSharedファイルからのシンボリックリンクを張っています。また、コード内ではコンパイルを切り替えるマクロを使って、動作環境ごとのコードを書いています。

上記のように、NETFX_CORE条件内でUWP側のアプリケーションの挙動、もう一方でUnity側の挙動を記述します。 参照 : HoloLens用 Managed Pluginの作り方

③ 広告を配置する

広告のオブジェクトの読み込みが終わり、空間のデータも蓄積されたとき、広告を壁に埋め込みます。

ここでは、広告オブジェクトを配置する壁オブジェクトを決定します。 視線方向を取得して、壁のオブジェクトと視線がぶつかる位置に広告を配置します。 壁のオブジェクトが広告を配置することができない幅の壁のオブジェクトが、選択された場合は、壁オブジェクトの再配置を行います。

④LPを表示する

広告表示フロー

Sceneに配置した。IntractionManagerにTapしたイベントを登録します。IntaractionManagerは人がGestureなどをしたときにイベントをフックしてくれていて、このコンポーネントを使うことでGestureなどの処理を容易にしてくれています。 Tapをされたオブジェクトが、実際の広告のオブジェクトだった時に、ダイアログを表示して遷移するかを問い合わせます。 遷移するが選ばれたとき、アプリケーションをサスペンド状態にして、Edgeを呼び出します。

参照 : MixedRealityToolkit-UnityのInputManagerを紐解く ~Gesture編~

以上が一通りの動作となります。

まとめ

壁の認識、ジェスチャーからのインプットなどを利用したHoloLens用adstirMRSDKを作ってきました。 現状はまだ、動作環境が制限されるなど様々な課題が多く実用的なSDKとはなっていませんが、ARKit/ARCoreなどのモバイルのARフレームワークの発展とともにコンテンツが成熟してきたとき、また、広告を利用していただける機会が生まれたとき、より良いユーザー体験ができるSDKを提供していきたいと思っています。

ユナイテッドでは、エンジニアを絶賛募集しています!このように最新技術にトライできる環境で一緒に働きませんか?

乱数の生成について

Pocket

こんにちは。データ解析部の西岡(敏)と申します。 広告配信の効果分析とアルゴリズム実装を担当しております。

今回は、システムで利用する乱数の生成について書きたいと思います。

乱数について

過去、コンピュータの無い時代には、サイコロを振ってその数字を記録したり、コインを投げてその裏表を調べたりすることで乱数を得ることができました。 ただし、こういった乱数は大量のデータを必要とする実験では不便であるため、現在はそのような実験を行う際にはコンピュータを利用して擬似的に乱数を生成しています。

こういった形でコンピュータを用いて生成する乱数のことを、前述のサイコロの乱数などとは区別し、算術乱数や擬似乱数と呼びます。

プログラムで使われる乱数

前述のように、疑似乱数はコンピュータから生成を行うため、乱数が本来持っているべき予測不可能性を持ちません。 ですが、出来る限りランダムであることが担保され、非常に長い周期を持てば、シミュレーションなどに利用するのに差し支えはないということになります。

疑似乱数は主にコンピュータ上で生成・使用され、そのために生成される乱数の質や周期の長さと同等に、コンピュータ上で生成される速度、プログラミングの簡素さ、使用する記憶領域の大きさが乱数生成器の評価のポイントとなっています。

以下では、システムで広く使われている代表的なアルゴリズムである、 線形合同法と、メルセンヌ・ツイスタの説明を行っていきます。

線形合同法

概要

1948年頃にレーマーが提案した方法で、今日でも広く使われている手法になります。 BASICやPascal, UNIXなどでこちらの方法が乱数生成に使われています。

基本的な算出方法は、 適当なX(0), 乗数a, 加数b, 法(modulus)Mを指定し、

X(n) = (a * X(n-1) + b) % M として、計算を行うものになります。

このとき、 bがMと互いに素 a-1がMを割り切るすべての素数の倍数 Mが4の倍数 であれば

a-1も4の倍数

という条件が、X(n)の周期が最大値Mとなる必要十分条件になります。

pythonによるプログラミング

実際にpythonで線形合同法を用いて乱数の生成を行ってみます。

線形合同法の問題点

上記のように、簡単に生成ができる一方で、この手法には 周期の限界が2^32にあること、下位ビットには周期的な偏りがあること(上記の例でも、下一桁が奇数→偶数の繰り返しになっている) などの問題点があります。 そのため、下位ビット部分を切り捨てて実装を行っている場合もあるそうです。

メルセンヌ・ツイスタ

概要

続いては、今日様々なシステムで利用されているメルセンヌ・ツイスタに関して説明を行います。 メルセンヌ・ツイスタはM系列を松本眞氏と西村拓士氏が発展させたものであり、疑似乱数生成器として現在最も高い評価を得ています。

メルセンヌ・ツイスタの説明

メルセンヌ・ツイスタの説明に当たって、まずM系列の説明を行います。

M系列

M系列とは、Xn = Xn-p + Xn-qで表現できる1ビットの数列になります。

例えば、 X0 = 1, X1 = 0, X2 = 0, p = 3, q = 1 としたとき、

X3 = X0 + X2 = 1 + 0 = 1
X4 = X1 + X3 = 0 + 1 = 1
X5 = X2 + X4 = 0 + 1 = 1
X6 = X3 + X5 = 1 + 1 = 0

という計算によって算出できます。

TGFSR

M系列を発展させたものに、 Twisted General Feedback Shift Register(TGFSR)があり、こちらは

Xn+p = Xn+q + Xn *A (p>q>0)

を用いて表現することができます。 ここで、Aはω✕ωの行列、Xはω次元の行ベクトルになります。 また、このときωは32, 64など、生成する乱数のビット数となります。

メルセンヌ・ツイスタ

さらにTGFSRを

Xn+p = Xn+q + Xn+1 *B + Xn *C (p>q>0)

として改良したものがメルセンヌ・ツイスタになります。

特に、こちらのこちらの最大周期が2^19937 – 1のときにMT19937と呼ばれ、 通常のメルセンヌ・ツイスタはこのMT19937を指します。

具体的な計算方法としては、 init_genrand関数とgenrand_int関数を準備し、 init_genrand関数を実行した後に、生成する乱数分genrand_int関数を実行するという流れになります。 それぞれの関数は以下の形式となります。

  • init_genrand 関数
    • 0 番地に種を代入する。
    • i 番地の値を得るために、i-1 番地の値を使用する。シフト、EXOR、乗算、加算の順に演算を行う。
    • 623 番地まで計算を繰り返し、値を代入する。
  • genrand_int 関数 a. (624n+1)回目の場合(n=0,1,2,…)
    • 0 番地から 227 番地まで AND、OR、EXOR 演算を行う。
    • 228 番地から 623 番地まで、別の数値を使って AND、OR、EXOR 演算を行う。
    • 再び別の数値を使って、AND、OR、EXOR 演算を行い、y に代入する。 b. 毎回共通の部分
    • y にシフト、AND、EXOR 演算を行い、生成された乱数を返す。

pythonによるプログラミング

実際にpythonで線形合同法を用いて乱数の生成を行ってみます。

以上のような形で、乱数の生成を行うことができました。 このメルセンヌ・ツイスタに関しては、線形合同法であったような、 周期が短かったり、値によっては下一桁が偶数, 奇数と交互に出現するといった問題点が発生せず、 非常に優れた擬似乱数生成器として、様々なプログラミング言語に幅広く利用されています。

まとめ

このように乱数と言っても複数の種類があり、それぞれの乱数には特徴があります。 現在は、高い精度の検証をする場合などは、線形合同法で作成されたよりもメルセンヌ・ツイスタの方が良いと言われています。 もし何かしらの実験を行っているときなどに、こういった乱数に着目すると、意外な解決策が見いだせるかもしれません。

参考

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/TEACH/ichimura-sho-koen.pdf http://www.soi.wide.ad.jp/class/20010000/slides/03/sfc2002.pdf http://random.ism.ac.jp/info01/random_number_generation/node6.html http://www.utp.or.jp/book/b300859.html http://www001.upp.so-net.ne.jp/isaku/rand.html https://narusejun.com/archives/5/

Amazon Elasticsearch ServiceでKibanaを利用する

Pocket

みなさんこんにちは。配信/インフラチームの佐々木と申します。adstirの配信サーバの開発とインフラを担当しております。

今回はAmazon Elasticsearch ServiceとKibanaを利用したデータの可視化について書きたいと思います。

ElasticsearchとKibanaについて

両方とも有名なミドルウェアなので詳細な説明は省きますが、端的に言うとElasticsearchは全文検索エンジンでKibanaがそれを可視化するためのWEB-GUI(中身はNode.js)になります。

ポイントとしてはElasticsearchもKibanaもオープンソースで公開されているのですが、両方ともAWSのマネージドサービスとしても提供されているため、構築と運用の負担が非常に軽いという点があります。(もちろんEC2を利用する事もできますし、AWS以外の環境でも利用は可能です。) 開発元が同一なため親和性が高く、今後はバージョンも統一されていくようです(現在は5.x) Kibanaは以前のバージョンではダッシュボードは黒をベースとしたUIでしたが、このバージョンは非常にカラフルなデザインになっております。

ちなみに余談ですが正しくは”ElasticSearch”ではなく”Elasticsearch”となります。ですがちょっと長いのでこのブログではESと略させていただきます。

データのフロー

ESはWEB-APIとして動作するのですが、Fluentdでプラグインが用意されているためそれを利用するケースが多いです。 直接POSTしても良いのですが、Fluentdを利用した方が簡単かつフレキシブルに使えます。流れとしては

Fluentd -> ES -> Kibana

となりますが、データをS3に保存する場合は以下のような流れが良さそうです。

Fluentd -> S3 -> Lambda -> ES -> Kibana

今回は前者の手順を記載いたします。

構築手順

1. AmazonESとKibanaのセットアップ

セットアップ自体は非常に簡単で、ものの数分で終わります。(作成の待ち時間がそれなりにありますが)AWSさまさまと言ったところです。

ESのダッシュボードでCreate a new domainをクリックします。 スクリーンショット 2017-06-15 18.36.03

Domain名とバージョンを指定しNextをクリックします。 スクリーンショット 2017-06-15 18.36.59

インスタンス数やスペックなどを指定しNextをクリックします。 スクリーンショット 2017-06-15 18.37.52

最後にアクセスポリシーを設定し、Confirm and createをクリックします。 スクリーンショット 2017-06-15 18.39.40

10分程度待てば作成が完了します。同時にKibanaも使える状態になっています。 スクリーンショット 2017-06-15 18.40.28

2. Fluentd設定

下準備としてはFluentdとfluent-plugin-aws-elasticsearch-serviceをインストールしている必要があります。送信先にESのURLを指定します。

3. ES設定

簡単な使い方をするのであれば設定は特に必要ありません。データがインサートされればそのまま使えるようになります。

4.Kibana設定

まずIndexの設定をする必要があります。ManagementでIndex Patternsをクリックします。 スクリーンショット 2017-06-20 12.40.21

Add Newをクリックします。 スクリーンショット 2017-06-20 12.41.07

作成したインデックスのパターンを入力し、Createをクリックします。 スクリーンショット 2017-06-21 11.58.45

登録したインデックスのデータは、Discoverから確認できます。この例ではscore_Xというランダム数値のデータを使用しています。 スクリーンショット 2017-06-21 11.56.59

次にインデックスからグラフを作成します。今回は折れ線グラフを作成しますので、VisualizeでLine chartを選択します。 スクリーンショット-2017-06-22-12.01.21

対象のインデックスを選択します。 スクリーンショット 2017-06-21 12.01.46

Y-Axisに対象のデータを登録し、X-AxisでDate Histogramを選択すれば時系列の折れ線グラフが出来ます。設定したらSaveをクリックします。 スクリーンショット 2017-06-21 12.23.32

あとはDashboardで作成したグラフを貼り付けます。KibanaはDashboardが自由にカスタマイズ出来、例えばWEBサーバのレイテンシを確認しながら生のログを見るといった使い方が出来ます。 スクリーンショット 2017-06-21 12.44.18

以上が構築手順になります。

最後に

弊社ではアドテクエンジニアを募集しております。広告技術に興味がある方・経験がある方のご応募をお待ちしております。また広告以外の部署やエンジニア以外の職種でも募集しておりますので、興味がある方はぜひご応募くだされば幸いです。

弊社コーポレートサイト
http://united.jp/recruit/information/

Wantedly
https://www.wantedly.com/companies/united/projects/

Redisにおけるデータの大量挿入手法

Pocket

こんにちは。Bypass開発チームの川住と申します。
今回はRedisにおけるデータの大量挿入手法について紹介します。

Redisとは?

まず、Redisについて少し紹介します。
Redisとは、メモリ上に Key-Value Store(KVS)を構築できるソフトウェアです(http://redis.io/)。
同系統のソフトウェアにはmemcached (http://memcached.org/) などがあります。
memcachedと比較すると、

  • シングルスレッドでクエリを処理する
  • データを永続化できる
  • ハッシュやリストなど、様々なデータ型を利用できる

といった特徴があります。

これらのソフトウェアを用いると、
メモリ上にデータを保持しており、かつ処理がシンプルであるため、
高速にデータの取得(格納)可能なKVSを構築できます。

データの大量挿入

本題に移ります。
Redisのデータの格納はとても高速ですが、シングルスレッドでクエリを処理するため、
データ数に比例して処理に時間がかかってしまいます。

そこで、大量のデータを挿入する時には、
「1件あたりのデータの挿入にかかる時間」をできるだけ短くする必要があります。

弊社では、Perlスクリプトでデータを加工し、Redisに大量のデータを格納しています。
この時、PerlのRedisモジュールを用いて1件ずつデータを格納してしまうと、

  • Redisとのデータの送受信で発生するRTT (Round-Trip Time)
  • Redisからのレスポンスをパースし、Perlのデータ型に加工する時間

が問題になります。そこで、

  • 複数のコマンドの一括送信
  • Redisからのレスポンスの破棄
    • socketやnc (netcat) でコマンドを送信し、レスポンスを/dev/null等に捨てる

を行い、処理時間を削減します。

処理時間の計測

下記の手法で10万件のデータの格納にかかった時間をそれぞれ計測しました。

  • PerlのRedisモジュールを使う(手法1)

  • socketを用いてデータを流し込む(手法2)

  • ncを用いてデータを流し込む(手法3)

計測結果

同端末で各手法5回ずつ試行し、その平均を処理時間としました。

手法 処理時間 (sec) ロス率
手法1 (module) 59.710145 0%
手法2 (socket) 2.978576 0%
手法3 (netcat) 2.626164 18%

複数のデータの格納コマンドを一括で送信し、
レスポンスのパースを行わないことによって処理時間を大幅に削減できます。
socketを用いる場合は送信(受信)バッファの管理を行わないと、
バッファ溢れによってデータロスが発生してしまいます。

まとめ

今回はRedisにおけるデータの大量insert手法を紹介しました。
目的に合わせて最適な手法を選択することでより効率的にデータを処理できるようになります。
(参考URL: http://redis.io/topics/mass-insert