SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【デブサミ2013】セッションレポート(AD)

【デブサミ2013】14-A-2 レポート
AmebaのスマートフォンプラットフォームにHBaseを採用した理由、そして得た知見

  • X ポスト
  • このエントリーをはてなブックマークに追加

Amebaのスマートフォン向けプラットフォームをHBaseで構築

事例1:『Hornet』

 サイバーエージェントではどんなところにHBaseを導入し、活用しているのか。まず鈴木氏が紹介したのが、グラフDB『Hornet』の事例である。

 昨年、サイバーエージェントではデカグラフ構想を基に、Amebaのスマートフォン向けプラットフォームをリリースした。デカグラフ構想とは「各サービスのユーザー層をミニグラフと位置づけ、1つの巨大なスマートフォン向けサービス(デカグラフ)を構築するというものだ」と鈴木氏は説明する。このような構想を実現するには、ユーザーのグラフ構造を保持するデータベースが必要となる。しかもそのデータは大量になるので、スケールするデータベースが必須。しかもオンライン処理をするため、低レスポンスタイム、高スループットという条件を満たさねばならない。

 Ameba PiggやAmebaなう、Amebaぐるっぽでは『MySQLとSharding』を採用してきたという。しかし「書き込みがスケールしにくく、管理が大変というShardを分割してしまうと、手動でやらないといけないという問題があり、HBaseを検討した」と鈴木氏は言う。

 HBaseを採用した理由は複数ある。スケールする、書き込みが早い、Range Scanができる、CASやIncrement、Auto Shardingが使えることだ。「ログ解析基盤にHadoopを用いていたため、ノウハウもあった。これは大きな理由となった」と鈴木氏は振り返る。

 さらに鈴木氏はHornetのデータモデルやアーキテクチャ、スキーマ設計についても詳しく解説。データモデルについてはプロパティグラフを紹介し、各ノードのプロパティセットやリレーションの作成、隣接ノードを取得するためのJava APIなども披露。さらにはリレーションシップの追加や取得については、具体的な例を挙げてスキーマ設計を具体的に解説。前者では1が2をフォローするという例を挙げ、RowKey、ColumnKey、valueがどのようになるかを具体的に示した。また後者では『1がフォローしている人を取得』するという例を提示し、hash(1)+follow+OUTGOINGでプレフィックススキャンするというコード例を紹介した。

 「今後はオープンソースで公開したい」と鈴木氏。

事例2:『Json Persister』

 続いてもう1つの導入事例を紹介。それは社内ライブラリ『Json Persister』への導入事例である。

 サイバーエージェントではサービスを複数ラインで同時に開発している。サービス開発においてスピードは命。サイバーエージェントでも、いかにそのスピードを上げられるかが重要な課題となっていたという。

 「スピードを上げるためのアプローチはいろいろあるが、私たちが注目したのはデータベース。一部基盤化はされてはいたものの、サービスごとにデータベースを立てている状況だったからだ。そこでHBaseを採用し、すべてのサービスのデータを入れ、運用を一元化できたら良さそうだと考えた」と鈴木氏は振り返る。

 とはいえ、先も説明したとおり、HBaseを扱うのは容易なことではない。そこでRDBに慣れているエンジニアにとって、いかに使いやすくするかを検討したという。

 そこで着目したのが社内ライブラリ『Json Persister』だ。これはJavaオブジェクトをJsonデータとして永続化するフレームワーク。Javaオブジェクトを直接保存、ロードするシンプルなAPIとなっている。またデータストア層は切り替えられるようになっていた。もともとあったのはMySQL版。「このインターフェースに乗せれば簡単にHBaseを扱えるのではないかと考え、HBaseで実装することにした」という。

 具体的にどのように実装したのか。鈴木氏はスキーマ設計の詳細を披露した。RowKeyはインデックス名+インデックス値+主キーとし、カラムファミリーは"h"、カラムは使わないので空のバイト配列、そしてvalueはJson。

 例えば『yusaku』という32歳の新規ユーザーを追加する際のコードは、次のようになる。

UserData userData=new UserData();

userData.setUserName(”yusaku");
userData.setAge(32);
userData.setDate(new Date());

jsonPersister.save(userData);

 このほかにも主キーで取得(load)、RowKeyがAge+32でプレフィックススキャンするというリストを取得するコード例なども紹介した。これについても「今後はオープンソースで公開したい」と鈴木氏は言う。

 「今日の講演を聴いて関心をもたれた方は、ぜひ一度HBaseに触れてもらいたい。そしてHBase仲間になってほしい」

 最後に鈴木氏は参加者にこう呼びかけ、セッションを締めくくった。

リレーションシップの取得例(1がフォローしている人の取得する場合)
リレーションシップの取得例(1がフォローしている人の取得する場合)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
【デブサミ2013】セッションレポート連載記事一覧

もっと読む

この記事の著者

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7037 2013/03/22 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング