クリスマスも終わり年も開けようとしていますが、まだまだMapRエンジニア陣が忙しいようですので、ノロノロ更新が続きます。
ホント、来年中に終わるといいな、、、^^;
ということで、アドベントは冬休みの宿題に突入しましたが5日目のエントリで、maprcliを使ったMapR-DB操作についてです。
MapRではMapR-DBを利用するための様々なツールが用意されています。
MapR-DB Binary(Binaryテーブル)ではHBaseとの互換性を維持するために、hbaseコマンドと同様の内容でテーブルの操作が可能です。
MapR-DB JSON(JSONテーブル)ではMapR-DB Shellや関連するユーティリティツールを利用することも出来ます。
一方でmaprcli table
コマンドでもMapR-DB操作用のコマンドを提供しており、そのオプションの多くがJSON、Binaryどちらのテーブルにも適用可能となります。
本エントリではmaprcli table
コマンドのオプションの概要を紹介し、後半では実際に遊んでみたいと思います。
maprcli tableコマンド
maprcli table
コマンドはJSON/Binaryテーブルの作成/削除/設定, replicationの設定などに利用します。
maprcli table
コマンドで利用可能なコマンドは以下の通りとなり、コマンドの中にはさらにサブコマンドを持つものもあります。
- create
- edit
- delete
- info
- region
- cf
- replica
- upstream
- index
- elasticsearch
- 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各テーブルの作成と設定まで行いました。
具体的なデータの挿入などは今後のエントリにて紹介していこうと思います。