MapR-DB操作コマンド maprcli 編

クリスマスも終わり年も開けようとしていますが、まだまだMapRエンジニア陣が忙しいようですので、ノロノロ更新が続きます。
ホント、来年中に終わるといいな、、、^^;
ということで、アドベントは冬休みの宿題に突入しましたが5日目のエントリで、maprcliを使ったMapR-DB操作についてです。


MapRではMapR-DBを利用するための様々なツールが用意されています。
MapR-DB Binary(Binaryテーブル)ではHBaseとの互換性を維持するために、hbaseコマンドと同様の内容でテーブルの操作が可能です。
MapR-DB JSON(JSONテーブル)では[MapR-DB Shell](https://maprdocs.mapr.com/home/ReferenceGuide/mapr_dbshell.html)や関連する[ユーティリティツール](https://maprdocs.mapr.com/home/MapR-DB/JSON_DB/loading_documents_into_json_tables.html)を利用することも出来ます。

一方で```maprcli table```コマンドでもMapR-DB操作用のコマンドを提供しており、そのオプションの多くがJSON、Binaryどちらのテーブルにも適用可能となります。
本エントリでは```maprcli table```コマンドのオプションの概要を紹介し、後半では実際に遊んでみたいと思います。

# maprcli tableコマンド

```maprcli table```コマンドはJSON/Binaryテーブルの作成/削除/設定, replicationの設定などに利用します。
```maprcli table```コマンドで利用可能なコマンドは以下の通りとなり、コマンドの中にはさらにサブコマンドを持つものもあります。

1. create
2. edit
3. delete
4. info
5. region
6. cf
7. replica
8. upstream
9. index
10. elasticsearch
11. changelog

上記のコマンドのうち、それぞれ1.から4.についてはテーブル全般について、5.はリージョン、6.はカラムファミリー(CF)、7., 8.はレプリケーション、9., 10.はSecondary Index、11.はChangeData Captureについてのコマンドとなります。
7.より後の項目については別エントリにて説明される予定なので、今回は1.から6.までの内容について、概要を紹介しようと思います。

## (1. - 4.) テーブル全般について

MapR-DBテーブルの全般についてのコマンドとなります。
create, editで利用する(そして、infoで表示される)オプションは以下の通りとなります。


|  パラメタ  |  説明  |
| ---- | ---- |
| copymetafrom | createのみ。既存テーブルのmetaデータのコピーしつつテーブル作成 |
| copymetatype | createのみ。copymetafromで指定したテーブルのmetaデータの指定。all (すべて。デフォルト)、cfs(CF)、aces(ACE)、splits(split key)、attrs(テーブルの属性) |
| tabletype | createのみ。binaryかjson。デフォルトはbinary |
|  audit  |  audit機能のon/off。デフォルトはfalse  |
|  autosplit  | regionの自動スプリットのon/off。デフォルトはtrue  |
| regionsizemb  | regionの自動スプリットを行う上でのしきい値。ただし、実際にregionのスプリットを行うのはregionがこの値で設定した値の1.5倍のサイズを超えたときとなる。4096MBに設定した場合は6144MB。regionsizembを4GB -> 2GBにした際にはこれに合わせて既存のregionのスプリットが発生するが、2GB -> 4GBにしても既存のregionのマージが発生するわけではないことに注意。デフォルトは4096MB   |
| bulkload | full bulk loadを許可するかどうか。full bulk load実行中は他のオペレーションは実行できない。デフォルトはfalse   |
| deletettl | editのみ。delete実行を行った後に実際にデータをパージするまでのTTL。テーブルのレプリケーションを設定している場合のデフォルトは24時間、していない場合は0時間   |
| packperm   | regionのpackを実行できるユーザの設定を行うAccess Control Expression(ACE)。デフォルトではテーブルを作成したユーザにに与えられる  |
| bulkloadperm   | full bulk loadを実行できるユーザの設定を行うACE。full bulk loadを実行すると、その他の操作が行えなくなる。デフォルトではテーブルを作成したユーザに与えられる   |
| splitmergeperm   |  テーブルのsplit, merge操作、及びregion sizeの変更を行うACE。デフォルトではテーブル作成ユーザに与えられる  |
| createnamefamilyperm   |  CFの作成、及び、名前変更を行うACE。デフォルトではテーブル作成ユーザに与えられる。  |
| deletefamilyperm   |  CFを削除するACE。以下同文  |
| adminaccessperm   |  指定したテーブルに対するパーミッションの参照と編集を管理するACE。以下同文  |
| replperm   |  指定したテーブルへのレプリケーション、もしくは指定したテーブルからのレプリケーションを管理するACE。以下同文  |
| indexperm   |   指定したテーブルに紐づくセカンダリインデックスの作成を管理するACE。セカンダリインデックスは2017年12月現在、JSON テーブルにのみ適用可能。以下同文 |
| defaultversionperm   |  指定したテーブルに作られた新しいCFに関するバージョンに関するパーミッションのためのACE。バージョンはBinaryテーブルにのみ存在する概念で、JSONテーブルには適用不可  |
| defaultcompressionperm   |  指定したテーブルに作られた新しいCFへの圧縮に関するパーミッションのためのACE。こちらのBinaryテーブルにのみ適用可能  |
| defaultmemoryperm   |    |
| defaultreadperm   |  指定したテーブルに作られた新しいCFに関するReadに関するパーミッションのためのACE。  |
| defaultwriteperm   | 指定したテーブルに作られた新しいCFに関するWriteに関するパーミッションのためのACE。   |
| defaulttraverseperm   |   新しいCFをtraverseするパーミッションのためのACE。こちらはJSONテーブルにのみ適用可能 |
| defaultappendperm   |   指定したテーブルに作られて新しいCFへのappendパーミッションのためのACE。こちらはBinaryテーブルにのみ適用可能 |


たくさん表示されているので目がチカチカしますが、その多くはXXXpermという感じで、"XXX操作を行うことが出来るユーザの制御用のパラメータ"となります。
ACEという言葉がありますが、要は権限の設定ですね。
下の具体例で出てきますが、ユーザやグループを使って指定することが出来ます。
XXXperm以外はcopymetafrom, copymetatype, tabletypeがcreateのみ、deletettlがeditのみのサブコマンドとなります。
infoはpathで指定した既存テーブルに関して、上記のパラメタが出てくるだけです。
deleteはそのまんまテーブルの削除なので、これもpathだけ指定して終了です。


## (5.) maprcli table region

table regionコマンドはregion操作用のコマンド群になります。
regionの概念についてはhbaseと同様となります。
table regionコマンドはさらに以下のようなコマンドを利用可能です。

* table region list
* table region merge
* table region pack
* table region split

いずれも名前の通りの操作となります。
mergeはregionの統合、packは論理削除データの物理削除を行います。

## (6.) maprcli table cf

カラムファミリー(CF)操作用のコマンド群になります。
table cfコマンドはさらに以下のようなコマンドを利用可能です

* table cf create
* table cf delete
* table cf edit
* table cf list
* table cf colperm get
* table cf colperm set
* table cf colperm delete

最初の4つはコマンドの名前の通りとなります。
“colperm”コマンドはカラムのAccess Control Expression(ACEs)操作のためのコマンド群になります。
それぞれの内容を見ていきましょう。

### table cf create, edit, delete, list

CFのcreate, editではCFの属性を指定することが出来ます。
以下が各パラメタの説明となります。

|  パラメタ  |  説明  |
| ---- | ---- |
| path | tableへのパス |
| cfname | CFの名前 |
|  min/maxversions  |  保持するバージョンの最小(大)値。Binaryテーブルのみに適用される |
|  ttl  | TTL値の秒数指定。0に設定(デフォルト)した場合は永久にデータがパージされない。ただし、JSONテーブルの場合、既存のCFのTTLが0でない場合、別のCFを追加することは出来ない。また、Secondary Index を持つJSONテーブルに対しては、TTLを設定できない |
| inmemory  | valueを優先的にキャッシュするかどうかの設定。inmemoryがfalseの場合も、テーブル全体で200バイト、CFごとに32バイトまではキャッシュされる。それ以上のデータを1行が持つ場合、inmemoryがtrueのCFに優先権が与えられる。デフォルトはfalse。 |
| compression | CFごとの圧縮形式の設定。off, lzf, lz4, zlibを選択できる。デフォルトの設定はテーブルが存在するディレクトリと同じ  |
| versionperm | max/minversionを設定できるACEの設定。Binaryテーブルにのみ適用可能。デフォルトではテーブルのdefaultversionpermと同じ値。 |
| compressionperm  | 圧縮パラメタを設定できるACEの設定。Binaryテーブルにのみ適用可能。デフォルトはテーブルのdefaultcompressionpermと同じ値。 |
| memoryperm   | inmemoryパラメタを設定できるACEの設定。デフォルトはテーブルのdefaultmemorypermと同じ値。 |
| readperm  |  カラムのread用のACEの設定。CFレベル、カラムレベル(Binaryテーブル), フィールドレベル(JSONテーブル)で設定できる。JSONテーブルの場合、設定値はCF内のフィールドから継承される。デフォルト値はテーブルのdefaultreadperm。 |
| writeperm   |  カラムのwrite用のACEの設定。デフォルト値はテーブルのdefaultwritepermと同じ。その他はreadpermと同じ |
| appendperm   |  append用のACE。Binaryテーブルにのみ適用可能。デフォルト値はテーブルのdefaultappendpermと同じ。その他はreadpermと同じ。 |
| jsonpath   |  CFへのパスをドット形式で設定。 |
| force   | JSONテーブルにデフォルトでないCFを作成しようとする場合、デフォルトでこのコマンドは失敗しワーニングが出る、という挙動を変更し、失敗せずにワーニングも出ないようにする。JSONテーブルにのみ適用可能 |
| traverseperm   | JSONドキュメントにおいて、誰がフィールドをまたいでパーミッションの設定を横切ることが出来るか設定するACE。JSONテーブルにのみ適用可能 |

### table cf colperm get set delete

テーブルの指定されたカラムに対しての権限の設定を行います。
これらのコマンドを使う上では、実行するユーザがテーブルが存在するパスへのlookupdir権限を持ち、テーブルに対してはadminaccesspermを持つ必要があります。
さらにgetに対してはreadAce, set, deleteに対してはreadAceとwriteAceを、テーブルが存在するVolumeに対してもつ必要があります。

getとdeleteはテーブル、CF、カラムを指定するだけです。
setに関してはread, write, append, traverse に対してpermissionの設定が出来ます。
これはtable全般の設定で指定する内容と同じです。

# コマンドで遊んで見る

さて、説明だけでかなり長くなってしまいましたが、ここでは実際に利用例も紹介します。

```
# 新規のJSONテーブルをREAD パーミッションの設定付きで設定する
maprcli table create -tabletype json -defaultreadperm 'g:dev | u:mapr' -path /user/mark/json_table

# 編集してWRITEパーミッションとリージョンサイズの設定も追加する
maprcli table edit -path /user/mark/json_table -defaultwriteperm 'g:dev | u:mapr' -regionsizemb 2048

# 内容確認
maprcli table info -path /user/mark/json_table -json
{
        "timestamp":1514125850854,
        "timeofday":"2017-12-24 11:30:50.854 GMT+0900",
        "status":"OK",
        "total":1,
        "data":[
                {
                        "path":"/user/mark/json_table",
                        "numregions":1,
                        "totallogicalsize":0,
                        "totalphysicalsize":0,
                        "totalcopypendingsize":0,
                        "totalrows":0,
                        "totalnumberofspills":0,
                        "totalnumberofsegments":0,
                        "autosplit":true,
                        "bulkload":false,
                        "insertionorder":true,
                        "tabletype":"json",
                        "regionsizemb":2048,
                        "audit":false,
                        "maxvalueszinmemindex":100,
                        "adminaccessperm":"u:mark",
                        "createrenamefamilyperm":"u:mark",
                        "bulkloadperm":"u:mark",
                        "packperm":"u:mark",
                        "deletefamilyperm":"u:mark",
                        "replperm":"u:mark",
                        "splitmergeperm":"u:mark",
                        "defaultcompressionperm":"u:mark",
                        "defaultmemoryperm":"u:mark",
                        "defaultreadperm":"g:dev | u:mapr",
                        "defaulttraverseperm":"u:mark",
                        "defaultwriteperm":"g:dev | u:mapr",
                        "uuid":"447fe781-4104-d7b2-935c-0c6cb93f5a00"
                }
        ]
}

# CFを追加。この際パス(root.cf1)と-forceの設定が必要。追加してinmemory設定を行う。
maprcli table cf create  -path /user/mark/json_table -cfname cf1 -jsonpath root.cf1 -inmemory true  -force true

# CFの設定を編集
maprcli table cf edit  -path /user/mark/json_table -cfname cf1 -writeperm 'u:mark | u:mapr' -readperm 'u:mark | u:mapr’

# CFの確認
 maprcli table cf list -path /user/mark/json_table -json
{
        "timestamp":1514213090279,
        "timeofday":"2017-12-25 11:44:50.279 GMT+0900",
        "status":"OK",
        "total":2,
        "data":[
                {
                        "cfname":"default",
                        "maxversions":1,
                        "minversions":0,
                        "ttl":2147483647,
                        "inmemory":false,
                        "compression":"lz4",
                        "compressionperm":"u:mark",
                        "memoryperm":"u:mark",
                        "readperm":"g:dev | u:mapr",
                        "traverseperm":"u:mark",
                        "writeperm":"u:mark"
                },
                {
                        "cfname":"cf1",
                        "maxversions":1,
                        "minversions":0,
                        "ttl":2147483647,
                        "inmemory":true,
                        "compression":"lz4",
                        "jsonfamilypath":"root.cf1",
                        "compressionperm":"u:mark",
                        "memoryperm":"u:mark",
                        "readperm":"u:mark | u:mapr",
                        "traverseperm":"u:mark",
                        "writeperm":"u:mark | u:mapr"
                }
        ]
}

# columnのパーミッションを設定
maprcli table cf colperm set -path /user/mark/json_table -cfname cf1 -name col1 -readperm 'g:dev' -writeperm 'u:mapr’

# columnのパーミッション確認
maprcli table cf colperm get -path /user/mark/json_table -cfname cf1 -json
{
        "timestamp":1514213067410,
        "timeofday":"2017-12-25 11:44:27.410 GMT+0900",
        "status":"OK",
        "total":1,
        "data":[
                {
                        "name":"col1",
                        "readperm":"g:dev",
                        "writeperm":"u:mapr"
                }
        ]
}


# binaryテーブルを既存テーブルのメタデータをコピーする形で作成
maprcli table create -path /user/mapr/db/binary_table -copymetafrom /user/mapr/db/old_table

# テーブルの情報を参照
maprcli table info -path /user/mapr/db/binary_table
{
        "timestamp":1514447087047,
        "timeofday":"2017-12-28 04:44:47.047 GMT+0900",
        "status":"OK",
        "total":1,
        "data":[
                {
                        "path":"/user/mapr/db/binary_table",
                        "numregions":1,
                        "totallogicalsize":0,
                        "totalphysicalsize":0,
                        "totalcopypendingsize":0,
                        "totalrows":0,
                        "totalnumberofspills":0,
                        "totalnumberofsegments":0,
                        "autosplit":true,
                        "bulkload":false,
                        "insertionorder":false,
                        "tabletype":"binary",
                        "regionsizemb":4096,
                        "audit":false,
                        "maxvalueszinmemindex":100,
                        "deletettl":86400,
                        "adminaccessperm":"u:mapr",
                        "createrenamefamilyperm":"u:mapr",
                        "bulkloadperm":"u:mapr",
                        "packperm":"u:mapr",
                        "deletefamilyperm":"u:mapr",
                        "replperm":"u:mapr",
                        "splitmergeperm":"u:mapr",
                        "defaultappendperm":"u:mapr",
                        "defaultcompressionperm":"u:mapr",
                        "defaultmemoryperm":"u:mapr",
                        "defaultreadperm":"u:mapr",
                        "defaultversionperm":"u:mapr",
                        "defaultwriteperm":"u:mapr",
                        "uuid":"6d355591-0435-3654-bc40-0fdea0445a00"
                }
        ]
}

# CFの情報も参照。既にCF addrとorderが入っている
maprcli table cf list -path /user/mapr/db/binary_table
{
        "timestamp":1514447219564,
        "timeofday":"2017-12-28 04:46:59.564 GMT+0900",
        "status":"OK",
        "total":2,
        "data":[
                {
                        "cfname":"addr",
                        "maxversions":1,
                        "minversions":0,
                        "ttl":2147483647,
                        "inmemory":false,
                        "compression":"off",
                        "appendperm":"u:mapr",
                        "compressionperm":"u:mapr",
                        "memoryperm":"u:mapr",
                        "readperm":"u:mapr",
                        "versionperm":"u:mapr",
                        "writeperm":"u:mapr"
                },
                {
                        "cfname":"order",
                        "maxversions":1,
                        "minversions":0,
                        "ttl":2147483647,
                        "inmemory":false,
                        "compression":"off",
                        "appendperm":"u:mapr",
                        "compressionperm":"u:mapr",
                        "memoryperm":"u:mapr",
                        "readperm":"u:mapr",
                        "versionperm":"u:mapr",
                        "writeperm":"u:mapr"
                }
        ]
}

# orderのmaxversionを変更してみる
maprcli table cf edit -maxversions 5 -path /user/mapr/db/binary_table -cfname order

# 変更を確認
maprcli table cf list -path /user/mapr/db/binary_table -json
{
        "timestamp":1514447573860,
        "timeofday":"2017-12-28 04:52:53.860 GMT+0900",
        "status":"OK",
        "total":2,
        "data":[
                {
                        "cfname":"addr",
                        "maxversions":1,
                        "minversions":0,
                        "ttl":2147483647,
                        "inmemory":false,
                        "compression":"off",
                        "appendperm":"u:mapr",
                        "compressionperm":"u:mapr",
                        "memoryperm":"u:mapr",
                        "readperm":"u:mapr",
                        "versionperm":"u:mapr",
                        "writeperm":"u:mapr"
                },
                {
                        "cfname":"order",
                        "maxversions":5,
                        "minversions":0,
                        "ttl":2147483647,
                        "inmemory":false,
                        "compression":"off",
                        "appendperm":"u:mapr",
                        "compressionperm":"u:mapr",
                        "memoryperm":"u:mapr",
                        "readperm":"u:mapr",
                        "versionperm":"u:mapr",
                        "writeperm":"u:mapr"
                }
        ]
}
```

# まとめ

本エントリではmaprcliコマンドを使って、Binary/JSON各テーブルの作成と設定まで行いました。
具体的なデータの挿入などは今後のエントリにて紹介していこうと思います。