K2HASHのインストール〜コマンドラインツールの利用


#[K2HASH](https://github.com/yahoojapan/k2hash)とは？
Yahoo! JAPAN製のKVS。
詳しくは[githubのwiki](https://github.com/yahoojapan/k2hash/wiki/Home_jpn)に書いてある。
k2hashそのものよりも[こちらの記事](https://techblog.yahoo.co.jp/architecture/k2hftfuse_intro/)で紹介されている[K2HFTFUSE](https://github.com/yahoojapan/k2hftfuse)に興味を持った、というのが調査の動機。

# 環境
さくらVPS x CentOS6を利用。

# 導入
## gitから必要リポジトリをclone

```bash
$ git clone git@github.com:yahoojapan/k2hash.git
$ cd k2hash
$ git clone --recursive git://github.com/yahoojapan/fullock
$ git submodule update --init --recursive
```

このように、k2hashリポジトリのサブモジュールにfullockを登録できていればOK

```bash
$ tree k2hash -L 1 -d
k2hash
├── autom4te.cache
├── docs
├── fullock # <- これ
├── lib
├── m4
└── tests

6 directories

$ git config --list | grep submodule
submodule.fullock.url=https://github.com/yahoojapan/fullock.git
```

## インストール(ミスったところ)

環境のせいか、32bit用のディレクトリにインストールされてしまった、という作業履歴。
「インストール(解決)」の章で解決した。

### fullockをビルド
```bash
$ cd fullock
$ ./autogen.sh
** SUCCEED: autogen

$ ./configure --prefix=/usr
$ make
$ sudo make install
```


### k2hashをビルド
```bash
$ cd ..
$ ./autogen.sh
** SUCCEED: autogen

$ ./configure --prefix=/usr
```

### ここでエラーが
```bash
configure: error: not found libfullock-dev package.
```

64bitの環境なのに、32bitのディレクトリにインストールされてしまっていた。

```
$ ls /usr/lib/*fullock*
/usr/lib/libfullock.a   /usr/lib/libfullock.so    /usr/lib/libfullock.so.1.0.21
/usr/lib/libfullock.la  /usr/lib/libfullock.so.1
```

## インストール(解決)

こちらの方法で解決。

### fullockを再度ビルド & インストール

```bash
$ cd fullock
$ ./autogen.sh

# configureのオプション確認
$ ./configure --help
・・・
  --libdir=DIR            object code libraries [EPREFIX/lib]
・・・

# libのインストール先ディレクトリを指定して実行
$ ./configure --prefix=/usr --libdir=/usr/lib64
$ make
$ sudo make install

# 確認
$ ls /usr/lib64/*fullock*
/usr/lib64/libfullock.a   /usr/lib64/libfullock.so    /usr/lib64/libfullock.so.1.0.21
/usr/lib64/libfullock.la  /usr/lib64/libfullock.so.1
```

これで、64bit用のディレクトリにインストールされた。

### k2hashを再度ビルド

こちらも64bitのディレクトリを指定してビルド。

```bash
$ cd ..
$ ./autogen.sh
$ ./configure --prefix=/usr --libdir=/usr/lib64
$ make
$ sudo make install

$ ls /usr/lib64/*k2hash*
/usr/lib64/libk2hash.a   /usr/lib64/libk2hash.so    /usr/lib64/libk2hash.so.1.0.52
/usr/lib64/libk2hash.la  /usr/lib64/libk2hash.so.1
```

# 使ってみた
## 対話式ツールを起動

```bash
$ cd k2hash/tests
$ ./k2hlinetool -m
-------------------------------------------------------
 K2HASH TOOL
-------------------------------------------------------
On memory mode
Attached paraemters:
    Full are mapping:                   true
    Key Index mask count:               8
    Collision Key Index mask count:     4
    Max element count:                  32
-------------------------------------------------------

```

## key/valueの登録、更新

```bash
# キーに値を設定
K2HTOOL> set foo var
K2HTOOL> print foo
  +"foo" => "var"

# 設定した値を更新
K2HTOOL> set foo bar
K2HTOOL> print foo
  +"foo" => "bar"
```

## リスト表示

```bash
K2HTOOL> list
+"foo" => "bar"
```

## キーのリネーム

```
K2HTOOL> rename foo hoge
K2HTOOL> list
+"hoge" => "bar"
```

## キーの削除

```
# テスト用のkey/valを設定
K2HTOOL> set foo bar
K2HTOOL> set hoge fuga
K2HTOOL> list
+"hoge" => "fuga"
+"foo" => "bar"

# 削除
K2HTOOL> rm hoge
K2HTOOL> list
+"foo" => "bar"
```

## k2htouchを使ってみた

ツールは[開発者向け](https://github.com/yahoojapan/k2hash/wiki/Developer_jpn)ドキュメントに色々書いてある。
ファイルにkey/valを書き込める簡易ツール「k2htouch」を使ってみた。

```bash
$ cd k2hash/tests

# ファイル作成
$ ./k2htouch ~/k2file create

# 確認
$ ls ~/k2file
/home/me/k2file

# key/value書き込み
$ ./k2htouch ~/k2file set foo bar

# key読み込み
$ ./k2htouch ~/k2file get foo
bar

# サブkey追加
$ ./k2htouch ~/k2file addsubkey foo hoge fuga

# key読み込み
$ ./k2htouch ~/k2file get foo
bar

# keyのサブkey読み込み
$ ./k2htouch ~/k2file getsubkey foo
hoge

# リスト表示
$ ./k2htouch ~/k2file list
foo	bar
hoge	fuga

# キー削除
$ ./k2htouch ~/k2file delete foo
$ ./k2htouch ~/k2file list
```