SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

初めてのHBase

HBaseを使ってグラフDBを作ってみよう(後編)

初めてのHBase 第7回

リレーションシップのプロパティに対するCAS操作

 次にリレーションシップのプロパティに対するCAS操作をするコードです。GitHub上では以下のURLになります。

  1. 指定のリレーションシップの現在の更新時間、プロパティを取り出す(133~151行目)
  2. expectedPropertiesと現在のプロパティを比較する。もし、値が違っていたらCAS操作が失敗となりfalseを返す(154~158行目)
  3. 新しい更新時間、新しいプロパティを生成(161~179行目)(新しい更新時間は必ず、現在の更新時間より後になるようにする)
  4. 更新時間に対するcheckAndPutを行う(187行目)。falseが返ってきたら、(1)に戻る(PutのTimestampには新しい更新時間を指定する)
  5. 最新順インデックスやセカンダリインデックスを作成する

 こちらも基本的には、リレーションのプロパティの追加・更新・削除の処理と同じですが、CAS操作のためのプロパティ比較する2の処理が追加されています。

 リレーションシップのプロパティに対するCAS操作が成功したら、最後に最新順インデックスやセカンダリインデックスを作成しています。

隣接リレーションシップ取得のカーソル機能

 最後に隣接リレーションシップ取得のカーソル機能です。GitHub上では以下のURLになります。

 getCorsorによってカーソルオブジェクトを取得できますが、それを表したものが以下のCursorクラスになります。

public class Cursor implements Serializable {

  // カーソルのタイプ
  public enum CursorType {
    NEW_ORDER_INDEX, // 最新順
    SECONDARY_INDEX // セカンダリインデックスを使用
  }

  // カーソルのタイプ
  private CursorType cursorType;

  // 方向
  private Direction direction;

  // ノードID
  private String nodeId;

  // ScanのstartRow
  private byte[] startRow;

  // ScanのstopRow
  private byte[] stopRow;

  // リレーションシップのタイプ
  private String type;
  
  // ... setterやgetterは省略
}

 方向やノードID、リレーションシップのタイプはクエリの情報になります。

 カーソルのタイプは最新順で取得するのか、セカンダリインデックスを使って取得するのかでロジックが異なるのでその切り分けをするために使います。

 ScanのstartRowとstopRowがカーソル機能のポイントとなる部分です。

 カーソルをfetchした際に、startRowに最後に取得できたRowをインクリメントしたバイト配列をセットします。

 このようにすることで、次にScanする際にセットしたstartRowを使って、前のfetchした結果の次からScanすることができます。

 CursorをSerializableにしているのは、例えばカーソルオブジェクトをシリアライズしてセッションDBなどに保存しておくことで、ページングなどの機能を実現できるからです。

まとめ

 今回は、プロパティに対するCAS操作と隣接リレーションシップ取得のカーソル機能を追加しました。これらの機能を追加することにより、グラフDBの使い勝手を良くすることができました。

 今回はスキーマを変更してはいませんが、HBaseのCAS操作などの機能を駆使することで実現できる機能の一例を紹介できたと思います。

 次回は、HBaseでSQLが扱えるPhoenixというライブラリを紹介しようと思います。

 また、株式会社サイバーエージェントでは、Hadoop/HBaseエンジニアを募集しています。ご興味のある方はこちらからエントリーしていただければと思います。エンジニア>R&Dエンジニア>R&Dエンジニアを選択しエントリーしていただければ幸いです。

参考資料

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
初めてのHBase連載記事一覧

もっと読む

この記事の著者

鈴木 俊裕(スズキ トシヒロ)

株式会社サイバーエージェント アメーバ事業本部 Ameba Technology Laboratory 2008年4月に株式会社サイバーエージェントに新卒で入社。基盤システムの開発・運用に従事する。 2010年4月にHadoop/Hiveを用いたログ解析基盤の開発・運用を担当する。 2011年4月に、ログ解析、レコメンド、検索エンジンなどを開発するAmeba Technology Laboratoryの立ち上げメンバーとなる。 2011年10月からHBaseを用...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7555 2013/12/27 14:00

イベント

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

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

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

メールバックナンバー