Bigtable change streams to BigQuery ํ…œํ”Œ๋ฆฟ

Bigtable change streams to BigQuery ํ…œํ”Œ๋ฆฟ์€ Bigtable ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ณ  Dataflow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ BigQuery ํ…Œ์ด๋ธ”์— ์“ฐ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค.

Bigtable ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ด๋ธ”๋ณ„๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ˜•์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ๊ตฌ๋…ํ•˜๋ฉด ๋‹ค์Œ ์ œ์•ฝ์กฐ๊ฑด์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ˆ˜์ •๋œ ์…€ ๋ฐ ์‚ญ์ œ ์ž‘์—…์˜ ์„ค๋ช…์–ด๋งŒ ๋ฐ˜ํ™˜๋จ
  • ์ˆ˜์ •๋œ ์…€์˜ ์ƒˆ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜๋จ

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ ˆ์ฝ”๋“œ๊ฐ€ BigQuery์— ์ž‘์„ฑ๋˜๋ฉด ํ–‰์ด ์›๋ณธ Bigtable ์ปค๋ฐ‹ ํƒ€์ž„์Šคํƒฌํ”„ ์ˆœ์„œ ์ง€์ •๊ณผ ๋‹ฌ๋ฆฌ ๋น„์ˆœ์ฐจ์ ์œผ๋กœ ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜๊ตฌ ์˜ค๋ฅ˜๋กœ ์ธํ•ด BigQuery์— ๊ธฐ๋กํ•  ์ˆ˜ ์—†๋Š” ๋ณ€๊ฒฝ ๋กœ๊ทธ ํ…Œ์ด๋ธ” ํ–‰์€ ์‚ฌ๋žŒ์ด ์ง์ ‘ ๊ฒ€ํ† ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก Cloud Storage์˜ ๋ฐ๋“œ ๋ ˆํ„ฐ ํ(์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€ ํ) ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์˜๊ตฌ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ BigQuery ํ…Œ์ด๋ธ”์ด ์—†์œผ๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด BigQuery ํ…Œ์ด๋ธ”์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด BigQuery ํ…Œ์ด๋ธ”์˜ ์Šคํ‚ค๋งˆ์—๋Š” ๋‹ค์Œ ํ‘œ์˜ ์—ด์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ์ƒˆ BigQuery ํ–‰์—๋Š” Bigtable ํ…Œ์ด๋ธ”์˜ ํ•ด๋‹น ํ–‰์—์„œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ๋ฐ˜ํ™˜ํ•œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ ˆ์ฝ”๋“œ 1๊ฐœ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

BigQuery ์ถœ๋ ฅ ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ

์—ด ์ด๋ฆ„ ์œ ํ˜• Null ํ—ˆ์šฉ ์„ค๋ช…
row_key STRING ๋˜๋Š” BYTES ์•„๋‹ˆ์š” ๋ณ€๊ฒฝ๋œ ํ–‰์˜ row key์ž…๋‹ˆ๋‹ค. writeRowkeyAsBytes ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜์ด true๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์—ด ์œ ํ˜•์€ BYTES์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ STRING ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
mod_type STRING ์•„๋‹ˆ์š” ํ–‰ ๋ณ€ํ˜•์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. SET_CELL, DELETE_CELLS, DELETE_FAMILY ์ค‘ ํ•œ ๊ฐ€์ง€ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
column_family STRING ์•„๋‹ˆ์š” ํ–‰ ๋ณ€ํ˜•์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” column family์ž…๋‹ˆ๋‹ค.
column STRING ์˜ˆ ํ–‰ ๋ณ€ํ˜•์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” column qualifier์ž…๋‹ˆ๋‹ค. DELETE_FAMILY ๋ณ€ํ˜• ์œ ํ˜•์˜ ๊ฒฝ์šฐ NULL๋กœ ์„ค์ •ํ•˜์„ธ์š”.
commit_timestamp TIMESTAMP ์•„๋‹ˆ์š” Bigtable์—์„œ ๋ณ€ํ˜•์„ ์ ์šฉํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
big_query_commit_timestamp TIMESTAMP ์˜ˆ (์„ ํƒ์‚ฌํ•ญ) BigQuery๊ฐ€ ์ถœ๋ ฅ ํ…Œ์ด๋ธ”์— ํ–‰์„ ์“ฐ๋Š” ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ด ์ด๋ฆ„์ด bigQueryChangelogTableFieldsToIgnore ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜ ๊ฐ’์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
timestamp TIMESTAMP ๋˜๋Š” INT64 ์˜ˆ ๋ณ€ํ˜•์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์…€์˜ ํƒ€์ž„์Šคํƒฌํ”„ ๊ฐ’์ž…๋‹ˆ๋‹ค. writeNumericTimestamps ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜์ด true๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์—ด ์œ ํ˜•์€ INT64์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ TIMESTAMP ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์„ธ์š”. DELETE_CELLS ๋ฐ DELETE_FAMILY ๋ณ€ํ˜• ์œ ํ˜•์˜ ๊ฒฝ์šฐ NULL๋กœ ์„ค์ •ํ•˜์„ธ์š”.
timestamp_from TIMESTAMP ๋˜๋Š” INT64 ์˜ˆ DELETE_CELLS ๋ณ€ํ˜•์œผ๋กœ ์‚ญ์ œ๋œ ๋ชจ๋“  ์…€์˜ ํƒ€์ž„์Šคํƒฌํ”„ ๊ฐ„๊ฒฉ์˜ ์‹œ์ž‘(๊ฒฝ๊ณ„ ํฌํ•จ)์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ณ€ํ˜• ์œ ํ˜•์˜ ๊ฒฝ์šฐ NULL๋กœ ์„ค์ •ํ•˜์„ธ์š”.
timestamp_to TIMESTAMP ๋˜๋Š” INT64 ์˜ˆ DELETE_CELLS ๋ณ€ํ˜•์œผ๋กœ ์‚ญ์ œ๋œ ๋ชจ๋“  ์…€์˜ ํƒ€์ž„์Šคํƒฌํ”„ ๊ฐ„๊ฒฉ์˜ ์ข…๋ฃŒ(๊ฒฝ๊ณ„ ์ œ์™ธ)๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ณ€ํ˜• ์œ ํ˜•์˜ ๊ฒฝ์šฐ NULL๋กœ ์„ค์ •ํ•˜์„ธ์š”.
is_gc BOOL ์•„๋‹ˆ์š” (์„ ํƒ์‚ฌํ•ญ) ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ •์ฑ…์— ์˜ํ•ด ๋ณ€ํ˜•์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฒฝ์šฐ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ด ์ด๋ฆ„์ด bigQueryChangelogTableFieldsToIgnore ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜ ๊ฐ’์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
source_instance STRING ์•„๋‹ˆ์š” (์„ ํƒ์‚ฌํ•ญ) ๋ณ€ํ˜•์ด ๋ฐœ์ƒํ•œ Bigtable ์ธ์Šคํ„ด์Šค์˜ ์ด๋ฆ„์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์—ด ์ด๋ฆ„์ด bigQueryChangelogTableFieldsToIgnore ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜ ๊ฐ’์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
source_cluster STRING ์•„๋‹ˆ์š” (์„ ํƒ์‚ฌํ•ญ) ๋ณ€ํ˜•์ด ๋ฐœ์ƒํ•œ Bigtable ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์—ด ์ด๋ฆ„์ด bigQueryChangelogTableFieldsToIgnore ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜ ๊ฐ’์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
source_table STRING ์•„๋‹ˆ์š” (์„ ํƒ์‚ฌํ•ญ) ๋ณ€ํ˜•์ด ์ ์šฉ๋˜๋Š” Bigtable ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ด์˜ ๊ฐ’์€ ์—ฌ๋Ÿฌ Bigtable ํ…Œ์ด๋ธ”์ด ๋™์ผํ•œ BigQuery ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด ์ด๋ฆ„์ด bigQueryChangelogTableFieldsToIgnore ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜ ๊ฐ’์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
tiebreaker INT64 ์•„๋‹ˆ์š” (์„ ํƒ์‚ฌํ•ญ) ๋‘ ๊ฐœ์˜ ๋ณ€ํ˜•์ด ๋‹ค๋ฅธ Bigtable ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋™์‹œ์— ๋“ฑ๋ก๋˜๋ฉด tiebreaker ๊ฐ’์ด ๊ฐ€์žฅ ๋†’์€ ๋ณ€ํ˜•์ด ์†Œ์Šค ํ…Œ์ด๋ธ”์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. tiebreaker ๊ฐ’์ด ๋‚ฎ์€ ๋ณ€ํ˜•์€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์—ด ์ด๋ฆ„์ด bigQueryChangelogTableFieldsToIgnore ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜ ๊ฐ’์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
value STRING ๋˜๋Š” BYTES ์˜ˆ ๋ณ€ํ˜•์œผ๋กœ ์ธํ•ด ์„ค์ •๋œ ์ƒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. writeValuesAsBytes ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜์ด true๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์—ด ์œ ํ˜•์€ BYTES์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ STRING ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ๊ฐ’์€ SET_CELL ๋ณ€ํ˜•์— ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ณ€ํ˜• ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๊ฐ’์ด NULL๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ ์š”๊ตฌ์‚ฌํ•ญ

  • ์ง€์ •๋œ Bigtable ์†Œ์Šค ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ Bigtable ์†Œ์Šค ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ Bigtable ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ•„์ž…๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ BigQuery ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ์ž…๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜

ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜

  • bigQueryDataset : ๋ชฉ์ ์ง€ BigQuery ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • bigtableChangeStreamAppProfile: Bigtable ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ•„ ID์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ•„์—์„œ ๋‹จ์ผ ํด๋Ÿฌ์Šคํ„ฐ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‹จ์ผ ํ–‰ ํŠธ๋žœ์žญ์…˜์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • bigtableReadInstanceId: ์†Œ์Šค Bigtable ์ธ์Šคํ„ด์Šค ID์ž…๋‹ˆ๋‹ค.
  • bigtableReadTableId: ์†Œ์Šค Bigtable ํ…Œ์ด๋ธ” ID์ž…๋‹ˆ๋‹ค.

์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜

  • writeRowkeyAsBytes: ํ–‰ ํ‚ค๋ฅผ BigQuery BYTES๋กœ ์“ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. true๋กœ ์„ค์ •ํ•˜๋ฉด BYTES ์—ด์— row key๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด rowkey๊ฐ€ STRING ์—ด์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.
  • writeValuesAsBytes: true๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฐ’์ด BYTES ์œ ํ˜•์˜ ์—ด์— ์“ฐ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด STRING ์œ ํ˜•์˜ ์—ด์— ์”๋‹ˆ๋‹ค . ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.
  • writeNumericTimestamps: Bigtable ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ BigQuery INT64๋กœ ์ž‘์„ฑํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. true๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฐ’์ด INT64 ์—ด์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฐ’์ด TIMESTAMP ์—ด์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์—ด์€ timestamp, timestamp_from, timestamp_to์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. true๋กœ ์„ค์ •ํ•˜๋ฉด ์œ ๋‹‰์Šค ์‹œ๊ฐ„(1970๋…„ 1์›” 1์ผ UTC ๊ธฐ์ค€) ์ดํ›„์˜ ์‹œ๊ฐ„์ด ๋งˆ์ดํฌ๋กœ์ดˆ ๋‹จ์œ„๋กœ ์ธก์ •๋ฉ๋‹ˆ๋‹ค.
  • bigQueryProjectId: BigQuery ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Dataflow ์ž‘์—…์˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.
  • bigQueryChangelogTableName: ๋Œ€์ƒ BigQuery ํ…Œ์ด๋ธ” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ’ bigtableReadTableId + "_changelog"์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • bigQueryChangelogTablePartitionGranularity: ๋ณ€๊ฒฝ ๋กœ๊ทธ ํ…Œ์ด๋ธ” ํŒŒํ‹ฐ์…˜์˜ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด ํ…Œ์ด๋ธ”์ด ํŒŒํ‹ฐ์…˜๋ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ฐ’ HOUR, DAY, MONTH, YEAR ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ด๋ธ”์€ ํŒŒํ‹ฐ์…˜์„ ๋‚˜๋ˆ„์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • bigQueryChangelogTablePartitionExpirationMs: ๋ณ€๊ฒฝ ๋กœ๊ทธ ํ…Œ์ด๋ธ” ํŒŒํ‹ฐ์…˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. true๋กœ ์„ค์ •ํ•˜๋ฉด ์ง€์ •๋œ ๋ฐ€๋ฆฌ์ดˆ๋ณด๋‹ค ์˜ค๋ž˜๋œ ํŒŒํ‹ฐ์…˜์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŒ๋ฃŒ์ผ์ด ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • bigQueryChangelogTableFieldsToIgnore: ์ง€์ •๋œ ๊ฒฝ์šฐ ์ƒ์„ฑ ๋ฐ ์ฑ„์›Œ์ง€์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ ๋กœ๊ทธ ์—ด์˜ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ฐ’ is_gc, source_instance, source_cluster, source_table, tiebreaker, big_query_commit_timestamp ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์—ด์ด ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.
  • dlqDirectory: ๋ฐ๋“œ ๋ ˆํ„ฐ ํ์— ์‚ฌ์šฉํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Dataflow ์ž‘์—…์˜ ์ž„์‹œ ์œ„์น˜ ์•„๋ž˜์— ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • bigtableChangeStreamMetadataInstanceId: Bigtable ๋ณ€๊ฒฝ ๋‚ด์—ญ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ธ์Šคํ„ด์Šค ID์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • bigtableChangeStreamMetadataTableTableId : Bigtable ๋ณ€๊ฒฝ ๋‚ด์—ญ ์ปค๋„ฅํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์˜ ID์ž…๋‹ˆ๋‹ค. ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ์ค‘์— Bigtable ๋ณ€๊ฒฝ ๋‚ด์—ญ ์ปค๋„ฅํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • bigtableChangeStreamCharset: Bigtable ๋ณ€๊ฒฝ ๋‚ด์—ญ ๋ฌธ์ž ์ง‘ํ•ฉ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ UTF-8์ž…๋‹ˆ๋‹ค.
  • bigtableChangeStreamStartTimestamp: ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์‹œ์ž‘ ํƒ€์ž„์Šคํƒฌํ”„(https://tools.ietf.org/html/rfc3339)์ž…๋‹ˆ๋‹ค(๊ฒฝ๊ณ„ ํฌํ•จ). ์˜ˆ๋ฅผ ๋“ค๋ฉด 2022-05-05T07:59:59Z์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ํŒŒ์ดํ”„๋ผ์ธ ์‹œ์ž‘ ์‹œ๊ฐ„์˜ ํƒ€์ž„์Šคํƒฌํ”„์ž…๋‹ˆ๋‹ค.
  • bigtableChangeStreamIgnoreColumnFamilies: ๋ฌด์‹œํ•  column family ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • bigtableChangeStreamIgnoreColumns: ๋ฌด์‹œํ•  ์—ด ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด 'cf1:col1,cf2:col2'์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • bigtableChangeStreamName: ํด๋ผ์ด์–ธํŠธ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด์ „์— ์‹คํ–‰ ์ค‘์ด๋˜ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ค‘์ง€๋œ ์ง€์ ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋œ ๊ฐ’์€ Dataflow ์ž‘์—… ๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • bigtableChangeStreamResume: true๋กœ ์„ค์ •ํ•˜๋ฉด bigtableChangeStreamName ๊ฐ’์ด ๋™์ผํ•˜๊ณ , ์ด์ „์— ์‹คํ–‰ ์ค‘์ด๋˜ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ค‘์ง€๋œ ์ง€์ ๋ถ€ํ„ฐ ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ bigtableChangeStreamName ๊ฐ’์˜ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋œ ์ ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. false๋กœ ์„ค์ •ํ•˜๋ฉด ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. bigtableChangeStreamName ๊ฐ’์ด ๋™์ผํ•œ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ง€์ •๋œ ์†Œ์Šค์— ๋Œ€ํ•ด ์ด๋ฏธ ์‹คํ–‰๋œ ๊ฒฝ์šฐ ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.
  • bigtableReadChangeStreamTimeoutMs: Bigtable ReadChangeStream ์š”์ฒญ ์ œํ•œ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค.
  • bigtableReadProjectId: Bigtable ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Dataflow ์ž‘์—…์˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ์‹คํ–‰

์ฝ˜์†”

  1. Dataflow ํ…œํ”Œ๋ฆฟ์—์„œ ์ž‘์—… ๋งŒ๋“ค๊ธฐ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ…œํ”Œ๋ฆฟ์—์„œ ์ž‘์—… ๋งŒ๋“ค๊ธฐ๋กœ ์ด๋™
  3. ์ž‘์—… ์ด๋ฆ„ ํ•„๋“œ์— ๊ณ ์œ ํ•œ ์ž‘์—… ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  4. (์„ ํƒ์‚ฌํ•ญ) ๋ฆฌ์ „ ์—”๋“œํฌ์ธํŠธ์˜ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ ๊ฐ’์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฆฌ์ „์€ us-central1์ž…๋‹ˆ๋‹ค.

    Dataflow ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์ „ ๋ชฉ๋ก์€ Dataflow ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  5. Dataflow ํ…œํ”Œ๋ฆฟ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ the Bigtable change streams to BigQuery template์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  6. ์ œ๊ณต๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•„๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  7. ์ž‘์—… ์‹คํ–‰์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

์…ธ ๋˜๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud dataflow flex-template run JOB_NAME \
    --region=REGION_NAME \
    --template-file-gcs-location=gs://dataflow-templates-REGION_NAME/VERSION/flex/Bigtable_Change_Streams_to_BigQuery \
    --parameters \
bigtableReadInstanceId=BIGTABLE_INSTANCE_ID,\
bigtableReadTableId=BIGTABLE_TABLE_ID,\
bigtableChangeStreamAppProfile=BIGTABLE_APPLICATION_PROFILE_ID,\
bigQueryDataset=BIGQUERY_DESTINATION_DATASET

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PROJECT_ID: Dataflow ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ ค๋Š” Google Cloud ํ”„๋กœ์ ํŠธ ID
  • JOB_NAME: ์„ ํƒํ•œ ๊ณ ์œ ํ•œ ์ž‘์—… ์ด๋ฆ„
  • VERSION: ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ ๋ฒ„์ „

    ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • latest: ๋ฒ„ํ‚ท์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์œ„ ํด๋”(gs://dataflow-templates-REGION_NAME/latest/)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„์ „ ์ด๋ฆ„(์˜ˆ: 2023-09-12-00_RC00): ๋ฒ„ํ‚ท์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋œ ํ•ด๋‹น ์ƒ์œ„ ํด๋”(gs://dataflow-templates-REGION_NAME/)์— ์ค‘์ฒฉ๋˜์–ด ์žˆ๋Š” ํŠน์ • ๋ฒ„์ „์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • REGION_NAME: Dataflow ์ž‘์—…์„ ๋ฐฐํฌํ•  ๋ฆฌ์ „(์˜ˆ: us-central1)
  • BIGTABLE_INSTANCE_ID: Bigtable ์ธ์Šคํ„ด์Šค ID
  • BIGTABLE_TABLE_ID: Bigtable ํ…Œ์ด๋ธ” ID
  • BIGTABLE_APPLICATION_PROFILE_ID: Bigtable ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ•„ ID
  • BIGQUERY_DESTINATION_DATASET: BigQuery ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ด๋ฆ„

API

REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…œํ”Œ๋ฆฟ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด HTTP POST ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. API ๋ฐ ์Šน์ธ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ projects.templates.launch๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

POST https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/LOCATION/flexTemplates:launch
{
  "launch_parameter": {
    "jobName": "JOB_NAME",
    "containerSpecGcsPath": "gs://dataflow-templates-REGION_NAME/VERSION/flex/Bigtable_Change_Streams_to_BigQuery",
    "parameters": {
        "bigtableReadInstanceId": "BIGTABLE_INSTANCE_ID",
        "bigtableReadTableId": "BIGTABLE_TABLE_ID",
        "bigtableChangeStreamAppProfile": "BIGTABLE_APPLICATION_PROFILE_ID",
        "bigQueryDataset": "BIGQUERY_DESTINATION_DATASET"
    }
  }
}

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PROJECT_ID: Dataflow ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ ค๋Š” Google Cloud ํ”„๋กœ์ ํŠธ ID
  • JOB_NAME: ์„ ํƒํ•œ ๊ณ ์œ ํ•œ ์ž‘์—… ์ด๋ฆ„
  • VERSION: ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ ๋ฒ„์ „

    ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • latest: ๋ฒ„ํ‚ท์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์œ„ ํด๋”(gs://dataflow-templates-REGION_NAME/latest/)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„์ „ ์ด๋ฆ„(์˜ˆ: 2023-09-12-00_RC00): ๋ฒ„ํ‚ท์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋œ ํ•ด๋‹น ์ƒ์œ„ ํด๋”(gs://dataflow-templates-REGION_NAME/)์— ์ค‘์ฒฉ๋˜์–ด ์žˆ๋Š” ํŠน์ • ๋ฒ„์ „์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • LOCATION: Dataflow ์ž‘์—…์„ ๋ฐฐํฌํ•  ๋ฆฌ์ „(์˜ˆ: us-central1)
  • BIGTABLE_INSTANCE_ID: Bigtable ์ธ์Šคํ„ด์Šค ID
  • BIGTABLE_TABLE_ID: Bigtable ํ…Œ์ด๋ธ” ID
  • BIGTABLE_APPLICATION_PROFILE_ID: Bigtable ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ•„ ID
  • BIGQUERY_DESTINATION_DATASET: BigQuery ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ด๋ฆ„

๋‹ค์Œ ๋‹จ๊ณ„