cbt CLI์˜ ์ถœ๋ ฅ ํ˜•์‹ ์ง€์ •

์ด ๋ฌธ์„œ์—์„œ๋Š” cbt CLI๋กœ ํ‘œ์‹œ๋  ๋•Œ Bigtable ํ–‰์— ์ €์žฅ๋œ ํŠน์ • ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ˜•์‹ ์ง€์ • ์˜ˆ์‹œ

๋ฒ„์ „ 0.12.0๋ถ€ํ„ฐ cbt CLI๋Š” ํ…Œ์ด๋ธ” ํ–‰์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ํŠน์ • ๋ณตํ•ฉ ์œ ํ˜•์˜ ํ˜•์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. cbt read ๋˜๋Š” cbt lookup ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด cbt CLI์—์„œ ํ–‰์— ์ €์žฅ๋œ ๊ฐ’์„ 'pretty print ์ ์šฉ'ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ˜•์‹ ์ง€์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” cbt CLI์˜ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

----------------------------------------
r1
  fam1:col1                                 @ 2022/03/09-11:19:45.966000
    "\n\x05Brave\x10\x02"
  fam1:col2                                 @ 2022/03/14-11:17:20.014000
    "{\"name\": \"Brave\", \"age\": 2}"

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ˜•์‹ ์ง€์ •์„ ์‚ฌ์šฉํ•˜๋Š” cbt CLI์˜ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

r1
  fam1:col1                                 @ 2022/03/09-11:19:45.966000
    name: "Brave"
    age: 2
  fam1:col2                                 @ 2022/03/14-11:17:20.014000
    age:     2.00
    name:   "Brave"

์—ด ๋˜๋Š” column family ํ˜•์‹์„ ์ง€์ •ํ•˜๋ ค๋ฉด ํ•ด๋‹น ์—ด์˜ ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” YAML ํŒŒ์ผ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. cbt lookup ๋˜๋Š” cbt read๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด format-file ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์Šค๋‹ˆํŽซ์€ ์ œ๊ณต๋œ format-file ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cbt lookup์„ ํ˜ธ์ถœํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

cbt lookup my-table r1 format-file=/path/to/formatting.yml

YAML์—์„œ ์—ด ๋ฐ์ดํ„ฐ ํ˜•์‹ ์ •์˜

ํ˜•์‹ ์ง€์ • YAML ํŒŒ์ผ์€ ์—ด ์ด๋ฆ„์ด๋‚˜ column family ์ด๋ฆ„์„ ์ด๋ฆ„์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์œ ํ˜•๊ณผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์Šค๋‹ˆํŽซ์—์„œ๋Š” YAML ํ˜•์‹ ์ง€์ • ํŒŒ์ผ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

protocol_buffer_definitions:
  - cat.proto
protocol_buffer_paths:
  - testdata/


columns:
  col1:
    encoding: ProtocolBuffer
    type: Cat

  col2:
    encoding: json

๋‹ค์Œ ์Šค๋‹ˆํŽซ์—์„œ๋Š” 'cat.proto' ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

syntax = "proto3";
package cats;

option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb";

message Cat {
  string name = 1;
  int32 age = 2;
}

์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • protocol_buffer_definitions ํ•„๋“œ๋Š” protobuf ๋ฐ์ดํ„ฐ ๋””์ฝ”๋”ฉ์— ์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๋ฉ”์‹œ์ง€ ์œ ํ˜•์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” .proto ํŒŒ์ผ์˜ ๋ชฉ๋ก์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • protocol_buffer_paths ํ•„๋“œ๋Š” ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ์œ ํ˜•์„ ๋””์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” .proto ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ์ปฌ ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. google/protobuf ํŒจํ‚ค์ง€์˜ ๋ฉ”์‹œ์ง€์™€ ๊ฐ™์ด ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • columns ํ•„๋“œ์—๋Š” ๊ฐ ์—ด์˜ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์—ด ์ด๋ฆ„ ๋ชฉ๋ก์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    • protobuf ์—ด์˜ encoding์€ 'ProtocolBuffer'๋กœ ์„ค์ •๋˜๊ณ  type์€ 'Cat'์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. cbt CLI๋Š” ์ด ์—ด์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’์„ Cat proto ๋ฉ”์‹œ์ง€ ์œ ํ˜•์œผ๋กœ ํ•ด์„ํ•˜๊ณ  ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์€ protocol_buffer_definition ํ•„๋“œ์— ์ œ๊ณต๋œ .proto ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜์— ์ •์˜๋œ ๋ฉ”์‹œ์ง€ ์œ ํ˜•๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • json ์—ด์˜ encoding ํ•„๋“œ๊ฐ€ 'JSON'์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. cbt๋Š” ์ด ์—ด์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’์„ JSON ๊ตฌ์กฐ๋กœ ํ•ด์„ํ•˜๊ณ  ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ํ•„๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • default_encoding: ์ด ํ•„๋“œ๋Š” ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์—ด์ด๋‚˜ column family์˜ ๋ชจ๋“  ์—ด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํ˜•์‹ ์ง€์ •์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • default_type: ์ด ํ•„๋“œ๋Š” ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ, big-endian, little-endian ์ธ์ฝ”๋”ฉ ์—ด์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • families: ์ด ํ•„๋“œ๋Š” column family ๋‚ด ๋ชจ๋“  ์—ด์˜ ์ธ์ฝ”๋”ฉ๊ณผ ์œ ํ˜•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. column family์— default_encoding ๋ฐ default_type์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์Šค๋‹ˆํŽซ๊ณผ ๊ฐ™์ด ์ ์ ˆํ•œ ์ธ์ฝ”๋”ฉ ๋ฐ ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ์—ด์„ ์ด๋ฆ„๋ณ„๋กœ ๋‚˜์—ดํ•˜๋Š” columns ํ•„๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์—ด ์ˆ˜์ค€์—์„œ ์ด๋Ÿฌํ•œ ์ธ์ฝ”๋”ฉ์„ ์žฌ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    families:
      family1:
        default_encoding: BigEndian
        default_type: INT64
        columns:
          address:
            encoding: PROTO
            type: tutorial.Person
    

์ง€์›๋˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•

cbt CLI๋Š” ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ํ˜•์‹ ์ง€์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ‘œ๋Š” ๊ฐ ๋ชฉ๋ก ์œ ํ˜•์— ๋Œ€ํ•ด YAML ํŒŒ์ผ์— ์ œ๊ณตํ•  ์ง€์›๋˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ฐ ๋ฌธ์ž์—ด์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๊ฐ’์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์œ ํ˜• YAML ๊ฐ’ ํ˜•์‹ ์ง€์ •
16์ง„์ˆ˜ Hex, H
Big-endian BigEndian, B
Little-endian LittleEndian, L
ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ProtocolBuffer, P, PROTO
JSON JSON, J

ํ‘œ 1. cbt ์ถœ๋ ฅ์—์„œ ํ˜•์‹ ์ง€์ •์— ์ง€์›๋˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•.

  • 16์ง„์ˆ˜ ์ธ์ฝ”๋”ฉ์€ ์œ ํ˜•์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์›์‹œ 16์ง„์ˆ˜ ํ‘œํ˜„์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • big-endian ๋ฐ little-endian ์ธ์ฝ”๋”ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์€ int8, int16, int32, int64, uint8, uint16, uint32, uint64 ,float32, float64์ž…๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๊ธธ์ด๋Š” ํฌ๊ธฐ๊ฐ€ ์œ ํ˜• ํฌ๊ธฐ์˜ ๋ฐฐ์ˆ˜(๋ฐ”์ดํŠธ)์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๊ธธ์ด๊ฐ€ ์œ ํ˜• ํฌ๊ธฐ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋Š” ์Šค์นผ๋ผ๋กœ ํ‘œ์‹œ๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ์ธ์ฝ”๋”ฉ์— ์ง€์ •๋œ ์œ ํ˜•์€ ์ œ๊ณต๋œ ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ์ •์˜ ํŒŒ์ผ์— ์ •์˜๋œ ๋ฉ”์‹œ์ง€ ์œ ํ˜•๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ ํ‘œ์‹œ๋˜๋Š” ์—ด ๋ฐ์ดํ„ฐ์˜ ์—ด ์ด๋ฆ„์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • YAML์˜ ํ˜•์‹ ์ง€์ • ๊ฐ’์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.