๊ธฐ์กด ํŒŒ์ดํ”„๋ผ์ธ ์—…๋ฐ์ดํŠธ

์ด ๋ฌธ์„œ์—์„œ๋Š” ์ง„ํ–‰ ์ค‘์ธ ์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๊ธฐ์กด Dataflow ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ๋ฅผ ํ–ฅ์ƒ ๋˜๋Š” ๊ฐœ์„ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
  • ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
  • ๋ฐ์ดํ„ฐ ํ˜•์‹์˜ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ๋ฒ„์ „ ๋˜๋Š” ๊ธฐํƒ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
  • ๋ชจ๋“  Dataflow ์ž‘์—…์ž์˜ Container-Optimized OS์™€ ๊ด€๋ จ๋œ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ํŒจ์น˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
  • ๋‹ค๋ฅธ ์ž‘์—…์ž ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ŠคํŠธ๋ฆฌ๋ฐ Apache Beam ํŒŒ์ดํ”„๋ผ์ธ์„ ํ™•์žฅํ•˜๋ ค๋Š” ๊ฒฝ์šฐ.

๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… ์—…๋ฐ์ดํŠธ: Streaming Engine์„ ์‚ฌ์šฉํ•˜๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ž‘์—…์„ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ์ž‘์—… ID๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ min-num-workers ๋ฐ max-num-workers ์ž‘์—… ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ต์ฒด ์ž‘์—…: ์—…๋ฐ์ดํŠธ๋œ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… ์—…๋ฐ์ดํŠธ๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ž‘์—… ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๊ธฐ์กด ์ž‘์—…์„ ๊ต์ฒดํ•˜๋Š” ์ƒˆ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ์ž‘์—…์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์ƒˆ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ž‘์—… ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด Dataflow ์„œ๋น„์Šค๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…๊ณผ ์ž ์žฌ์ ์ธ ๊ต์ฒด ์ž‘์—… ์‚ฌ์ด์˜ ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ์ค‘๊ฐ„ ์ƒํƒœ ์ •๋ณด ๋ฐ ๋ฒ„ํผ๋ง๋œ ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์ด์ „ ์ž‘์—…์—์„œ ๊ต์ฒด ์ž‘์—…์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Apache Beam SDK์˜ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๋กœ๊น… ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋„ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŒŒ์ดํ”„๋ผ์ธ ๋กœ๊ทธ ์ž‘์—…์„ ์ฐธ์กฐํ•˜์„ธ์š”. ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๋ ค๋ฉด DEBUG ๋กœ๊น… ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… ์˜ต์…˜ ์—…๋ฐ์ดํŠธ

Streaming Engine์„ ์‚ฌ์šฉํ•˜๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ž‘์—…์„ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ์ž‘์—… ID๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๋‹ค์Œ ์ž‘์—… ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • min-num-workers: ์ตœ์†Œ Compute Engine ์ธ์Šคํ„ด์Šค ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • max-num-workers: ์ตœ๋Œ€ Compute Engine ์ธ์Šคํ„ด์Šค ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • worker-utilization-hint: [0.1, 0.9] ๋ฒ”์œ„ ์ด๋‚ด ๋Œ€์ƒ CPU ์‚ฌ์šฉ๋ฅ ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ž‘์—… ์—…๋ฐ์ดํŠธ์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ์ž‘์—…์„ ์—…๋ฐ์ดํŠธ๋œ ์ž‘์—…์œผ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ต์ฒด ์ž‘์—… ์‹คํ–‰์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ง„ํ–‰ ์ค‘์ธ ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰

์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… ์˜ต์…˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud

gcloud dataflow jobs update-options ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud dataflow jobs update-options \
  --region=REGION \
  --min-num-workers=MINIMUM_WORKERS \
  --max-num-workers=MAXIMUM_WORKERS \
  --worker-utilization-hint=TARGET_UTILIZATION \
  JOB_ID

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

  • REGION: ์ž‘์—… ๋ฆฌ์ „ ID
  • MINIMUM_WORKERS: ์ตœ์†Œ Compute Engine ์ธ์Šคํ„ด์Šค ์ˆ˜
  • MAXIMUM_WORKERS: ์ตœ๋Œ€ Compute Engine ์ธ์Šคํ„ด์Šค ์ˆ˜
  • TARGET_UTILIZATION: [0.1, 0.9] ๋ฒ”์œ„ ์ด๋‚ด ๊ฐ’
  • JOB_ID: ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…์˜ ID

--min-num-workers, --max-num-workers ๋ฐ worker-utilization-hint๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

REST

projects.locations.jobs.update ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

PUT https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs/JOB_ID?updateMask=MASK
{
  "runtime_updatable_params": {
    "min_num_workers": MINIMUM_WORKERS,
    "max_num_workers": MAXIMUM_WORKERS,
    "worker_utilization_hint": TARGET_UTILIZATION
  }
}

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

  • MASK: ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—…๋ฐ์ดํŠธํ•  ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
    • runtime_updatable_params.max_num_workers
    • runtime_updatable_params.min_num_workers
    • runtime_updatable_params.worker_utilization_hint
  • PROJECT_ID: Dataflow ์ž‘์—…์˜ Google Cloud ํ”„๋กœ์ ํŠธ ID
  • REGION: ์ž‘์—… ๋ฆฌ์ „ ID
  • JOB_ID: ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…์˜ ID
  • MINIMUM_WORKERS: ์ตœ์†Œ Compute Engine ์ธ์Šคํ„ด์Šค ์ˆ˜
  • MAXIMUM_WORKERS: ์ตœ๋Œ€ Compute Engine ์ธ์Šคํ„ด์Šค ์ˆ˜
  • TARGET_UTILIZATION: [0.1, 0.9] ๋ฒ”์œ„ ์ด๋‚ด ๊ฐ’

min_num_workers, max_num_workers ๋ฐ worker_utilization_hint๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. updateMask ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์—…๋ฐ์ดํŠธํ•  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ณ  ์š”์ฒญ ๋ณธ๋ฌธ์˜ runtimeUpdatableParams ํ•„๋“œ์— ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ๋Š” min_num_workers๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

PUT https://dataflow.googleapis.com/v1b3/projects/my_project/locations/us-central1/jobs/job1?updateMask=runtime_updatable_params.min_num_workers
{
  "runtime_updatable_params": {
    "min_num_workers": 5
  }
}

์ง„ํ–‰ ์ค‘์ธ ์—…๋ฐ์ดํŠธ์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ ค๋ฉด ์ž‘์—…์ด ์‹คํ–‰ ์ค‘ ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ด ์‹œ์ž‘๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ์ทจ์†Œ๋œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋Œ€์ฒด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒˆ ์ž‘์—…์— ์ง„ํ–‰ ์ค‘์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— ์ž‘์—… ์‹คํ–‰์ด ์‹œ์ž‘๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ์š”์ฒญ์„ ์ œ์ถœํ•œ ํ›„์—๋Š” ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ๋‹ค๋ฅธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ž‘์—… ๋กœ๊ทธ์—์„œ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ์„ ํ™•์ธํ•˜์„ธ์š”.

๊ต์ฒด ์ž‘์—… ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

๊ต์ฒด ์ž‘์—…์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์ƒˆ ์ž‘์—…์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ž‘์—… ๊ทธ๋ž˜ํ”„์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. Dataflow์—์„œ ์ž‘์—… ๊ทธ๋ž˜ํ”„๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ทธ๋ž˜ํ”ฝ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—… ๊ทธ๋ž˜ํ”„์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋ฉด ์—…๋ฐ์ดํŠธ ํ›„ ํŒŒ์ดํ”„๋ผ์ธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ํŒŒ์ดํ”„๋ผ์ธ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž‘์—…์— ๋‹ค์šดํƒ€์ž„์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์›๋ž˜ ์ž‘์—…์„ ์ค‘์ง€ํ•  ํ•„์š” ์—†์ด ์—…๋ฐ์ดํŠธ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ๊ทธ๋ž˜ํ”„์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋ ค๋ฉด ๊ต์ฒด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์—…๋ฐ์ดํŠธ ๋ช…๋ น์–ด์— graph_validate_only Dataflow ์„œ๋น„์Šค ์˜ต์…˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”

  • --update ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • PipelineOptions์˜ --jobName ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --region ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
  • --dataflowServiceOptions=graph_validate_only ์„œ๋น„์Šค ์˜ต์…˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  --transformNameMapping ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ดํ›„ ๋ฒ„์ „์˜ Apache Beam SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ฒด ์ž‘์—…์„ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ --updateCompatibilityVersion์„ ์›๋ž˜ ์ž‘์—…์—์„œ ์‚ฌ์šฉ๋œ Apache Beam SDK ๋ฒ„์ „์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Python

  • --update ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • PipelineOptions์˜ --job_name ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --region ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
  • --dataflow_service_options=graph_validate_only ์„œ๋น„์Šค ์˜ต์…˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  --transform_name_mapping ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ดํ›„ ๋ฒ„์ „์˜ Apache Beam SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ฒด ์ž‘์—…์„ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ --updateCompatibilityVersion์„ ์›๋ž˜ ์ž‘์—…์—์„œ ์‚ฌ์šฉ๋œ Apache Beam SDK ๋ฒ„์ „์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Go

  • --update ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • --job_name ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --region ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
  • --dataflow_service_options=graph_validate_only ์„œ๋น„์Šค ์˜ต์…˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  --transform_name_mapping ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud

Flex ํ…œํ”Œ๋ฆฟ ์ž‘์—…์˜ ์ž‘์—… ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฒ€์ฆํ•˜๋ ค๋ฉด additional-experiments ์˜ต์…˜๊ณผ ํ•จ๊ป˜ gcloud dataflow flex-template run ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • --update ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • JOB_NAME์„(๋ฅผ) ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --region ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
  • --additional-experiments=graph_validate_only ์˜ต์…˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  --transform-name-mappings ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

gcloud dataflow flex-template run JOB_NAME --additional-experiments=graph_validate_only

JOB_NAME์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

REST

FlexTemplateRuntimeEnvironment(Flex ํ…œํ”Œ๋ฆฟ) ๋˜๋Š” RuntimeEnvironment ๊ฐ์ฒด์—์„œ additionalExperiments ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

{
  additionalExperiments : ["graph_validate_only"]
  ...
}

graph_validate_only ์„œ๋น„์Šค ์˜ต์…˜์€ ํŒŒ์ดํ”„๋ผ์ธ ์—…๋ฐ์ดํŠธ๋งŒ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด graph_validate_only ์„œ๋น„์Šค ์˜ต์…˜ ์—†์ด ๊ต์ฒด ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ๊ทธ๋ž˜ํ”„์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ์ž‘์—… ์ƒํƒœ์™€ ์ž‘์—… ๋กœ๊ทธ์— ๋‹ค์Œ ์ƒํƒœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  • ์ž‘์—… ์ƒํƒœ๋Š” JOB_STATE_DONE์ž…๋‹ˆ๋‹ค.
  • Google Cloud ์ฝ˜์†”์—์„œ ์ž‘์—… ์ƒํƒœ๋Š” Succeeded์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ž‘์—… ๋กœ๊ทธ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    Workflow job: JOB_ID succeeded validation. Marking graph_validate_only job as Done.
    

์ž‘์—… ๊ทธ๋ž˜ํ”„์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ž‘์—… ์ƒํƒœ์™€ ์ž‘์—… ๋กœ๊ทธ์— ๋‹ค์Œ ์ƒํƒœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  • ์ž‘์—… ์ƒํƒœ๋Š” JOB_STATE_FAILED์ž…๋‹ˆ๋‹ค.
  • Google Cloud ์ฝ˜์†”์—์„œ ์ž‘์—… ์ƒํƒœ๋Š” Failed์ž…๋‹ˆ๋‹ค.
  • ์ž‘์—… ๋กœ๊ทธ์— ๋น„ํ˜ธํ™˜์„ฑ ์˜ค๋ฅ˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์€ ์˜ค๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ต์ฒด ์ž‘์—… ์‹คํ–‰

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๊ธฐ์กด ์ž‘์—…์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์—…๋ฐ์ดํŠธ๋œ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
  • ์ง„ํ–‰ ์ค‘์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ž‘์—… ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ

๊ต์ฒด ์ž‘์—…์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์ƒˆ ์ž‘์—…์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ž‘์—… ๊ทธ๋ž˜ํ”„์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ต์ฒด ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์ž‘์—…์˜ ์ผ๋ฐ˜ ์˜ต์…˜ ์™ธ์—๋„ ์—…๋ฐ์ดํŠธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋‹ค์Œ ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”

  • --update ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • PipelineOptions์˜ --jobName ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --region ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  --transformNameMapping ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ดํ›„ ๋ฒ„์ „์˜ Apache Beam SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ฒด ์ž‘์—…์„ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ --updateCompatibilityVersion์„ ์›๋ž˜ ์ž‘์—…์—์„œ ์‚ฌ์šฉ๋œ Apache Beam SDK ๋ฒ„์ „์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Python

  • --update ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • PipelineOptions์˜ --job_name ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --region ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  --transform_name_mapping ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ดํ›„ ๋ฒ„์ „์˜ Apache Beam SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ฒด ์ž‘์—…์„ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ --updateCompatibilityVersion์„ ์›๋ž˜ ์ž‘์—…์—์„œ ์‚ฌ์šฉ๋œ Apache Beam SDK ๋ฒ„์ „์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Go

  • --update ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • --job_name ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --region ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  --transform_name_mapping ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud

gcloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Flex ํ…œํ”Œ๋ฆฟ ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด gcloud dataflow flex-template run ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. gcloud CLI๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค๋ฅธ ์ž‘์—… ์—…๋ฐ์ดํŠธ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • --update ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • JOB_NAME์„(๋ฅผ) ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --region ์˜ต์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  --transform-name-mappings ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

REST

๋‹ค์Œ ์•ˆ๋‚ด์—์„œ๋Š” REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…œํ”Œ๋ฆฟ์ด ์•„๋‹Œ ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ ์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—… ์—…๋ฐ์ดํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Flex ํ…œํ”Œ๋ฆฟ ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด Flex ํ…œํ”Œ๋ฆฟ ์ž‘์—… ์—…๋ฐ์ดํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  1. projects.locations.jobs.get ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฒดํ•˜๋ ค๋Š” ์ž‘์—…์˜ job ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. view ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์— JOB_VIEW_DESCRIPTION ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. JOB_VIEW_DESCRIPTION์„ ํฌํ•จํ•˜๋ฉด ํ›„์† ์š”์ฒญ์ด ํฌ๊ธฐ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ์‘๋‹ต์— ํฌํ•จํ•  ๋ฐ์ดํ„ฐ ์–‘์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ž‘์—… ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉด JOB_VIEW_ALL ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    GET https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs/JOB_ID?view=JOB_VIEW_DESCRIPTION
    

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

    • PROJECT_ID: Dataflow ์ž‘์—…์˜ Google Cloud ํ”„๋กœ์ ํŠธ ID
    • REGION: ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…์˜ ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
    • JOB_ID: ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…์˜ ์ž‘์—… ID์ž…๋‹ˆ๋‹ค.
  2. ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด projects.locations.jobs.create ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ๋ณธ๋ฌธ์—์„œ ๊ฐ€์ ธ์˜จ job ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    POST https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs
    {
      "id": JOB_ID,
      "replaceJobId": JOB_ID,
      "name": JOB_NAME,
      "type": "JOB_TYPE_STREAMING",
      "transformNameMapping": {
        string: string,
        ...
      },
    }
    

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

    • JOB_ID: ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…์˜ ID์™€ ๋™์ผํ•œ ์ž‘์—… ID์ž…๋‹ˆ๋‹ค.
    • JOB_NAME: ์—…๋ฐ์ดํŠธํ•  ์ž‘์—… ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ์ž‘์—… ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๊ณ  transformNameMapping ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. ์„ ํƒ์‚ฌํ•ญ: curl(Linux, macOS ๋˜๋Š” Cloud Shell)์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ์š”์ฒญ์„ JSON ํŒŒ์ผ์— ์ €์žฅํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    curl -X POST -d "@FILE_PATH" -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)"  https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs
    

    FILE_PATH๋ฅผ ์š”์ฒญ ๋ณธ๋ฌธ์ด ํฌํ•จ๋œ JSON ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๊ต์ฒด ์ž‘์—… ์ด๋ฆ„ ์ง€์ •

์ž๋ฐ”

๊ต์ฒด ์ž‘์—… ์‹คํ–‰ ์‹œ --jobName ์˜ต์…˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์€ ๊ต์ฒดํ•  ์ž‘์—… ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Python

๊ต์ฒด ์ž‘์—… ์‹คํ–‰ ์‹œ --job_name ์˜ต์…˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์€ ๊ต์ฒดํ•  ์ž‘์—… ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Go

๊ต์ฒด ์ž‘์—… ์‹คํ–‰ ์‹œ --job_name ์˜ต์…˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์€ ๊ต์ฒดํ•  ์ž‘์—… ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud

๊ต์ฒด ์ž‘์—… ์‹คํ–‰ ์‹œ JOB_NAME์€ ๊ต์ฒดํ•  ์ž‘์—… ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

REST

replaceJobId ํ•„๋“œ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•  ์ž‘์—…๊ณผ ๋™์ผํ•œ ์ž‘์—… ID๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—… ์ด๋ฆ„ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Dataflow ๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ด์ „ ์ž‘์—…์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž‘์—… ์ •๋ณด ์ธก๋ฉด ํŒจ๋„์—์„œ ์ž‘์—… ID ํ•„๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์ž‘์—… ์ด๋ฆ„ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Dataflow ๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ด์ „ ์ž‘์—…์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž‘์—… ์ •๋ณด ์ธก๋ฉด ํŒจ๋„์—์„œ ์ž‘์—… ์ด๋ฆ„ ํ•„๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ์ค‘์ธ Dataflow ์ž‘์—…์˜ ์ž‘์—… ์ •๋ณด ์ธก๋ฉด ํŒจ๋„
๊ทธ๋ฆผ 1: ์ž‘์—… ์ด๋ฆ„ ํ•„๋“œ๊ฐ€ ํ‘œ์‹œ๋œ ์‹คํ–‰ ์ค‘์ธ Dataflow ์ž‘์—…์˜ ์ž‘์—… ์ •๋ณด ์ธก๋ฉด ํŒจ๋„์ž…๋‹ˆ๋‹ค.

๋˜๋Š” Dataflow ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ์ž‘์—… ๋ชฉ๋ก์„ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. gcloud dataflow jobs list ๋ช…๋ น์–ด๋ฅผ ์…ธ์ด๋‚˜ ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ์ž…๋ ฅํ•˜์—ฌ Google Cloudํ”„๋กœ์ ํŠธ์˜ Dataflow ์ž‘์—… ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๊ณ  ๊ต์ฒดํ•  ์ž‘์—…์˜ NAME ํ•„๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

JOB_ID                                    NAME                        TYPE       CREATION_TIME        STATE    REGION
2020-12-28_12_01_09-yourdataflowjobid     ps-topic                    Streaming  2020-12-28 20:01:10  Running  us-central1

๋ณ€ํ™˜ ๋งคํ•‘ ๋งŒ๋“ค๊ธฐ

๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด ์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ด๋ฆ„์—์„œ ๋ณ€ํ™˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ Dataflow ์„œ๋น„์Šค์— ๋ณ€ํ™˜ ๋งคํ•‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ๋งคํ•‘์€ ์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์˜ ์ด๋ฆ„์ด ์ง€์ •๋œ ๋ณ€ํ™˜์„ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์˜ ์ด๋ฆ„์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค

์ž๋ฐ”

--transformNameMapping ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘์„ ์ „๋‹ฌํ•  ๋•Œ ๋‹ค์Œ์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

--transformNameMapping= . 
{"oldTransform1":"newTransform1","oldTransform2":"newTransform2",...}

์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์‚ฌ์ด์— ๋ณ€๊ฒฝ๋œ ๋ณ€ํ™˜ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ๋งŒ --transformNameMapping์— ๋งคํ•‘ ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--transformNameMapping์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ๋•Œ ๋”ฐ์˜ดํ‘œ๋ฅผ ์…ธ์— ๋งž๊ฒŒ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Bash์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--transformNameMapping='{"oldTransform1":"newTransform1",...}'

Python

--transform_name_mapping ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘์„ ์ „๋‹ฌํ•  ๋•Œ ๋‹ค์Œ์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

--transform_name_mapping= .
{"oldTransform1":"newTransform1","oldTransform2":"newTransform2",...}

์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์‚ฌ์ด์— ๋ณ€๊ฒฝ๋œ ๋ณ€ํ™˜ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ๋งŒ --transform_name_mapping์— ๋งคํ•‘ ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--transform_name_mapping์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ๋•Œ ๋”ฐ์˜ดํ‘œ๋ฅผ ์…ธ์— ๋งž๊ฒŒ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Bash์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--transform_name_mapping='{"oldTransform1":"newTransform1",...}'

Go

--transform_name_mapping ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘์„ ์ „๋‹ฌํ•  ๋•Œ ๋‹ค์Œ์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

--transform_name_mapping= .
{"oldTransform1":"newTransform1","oldTransform2":"newTransform2",...}

์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์‚ฌ์ด์— ๋ณ€๊ฒฝ๋œ ๋ณ€ํ™˜ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ๋งŒ --transform_name_mapping์— ๋งคํ•‘ ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--transform_name_mapping์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ๋•Œ ๋”ฐ์˜ดํ‘œ๋ฅผ ์…ธ์— ๋งž๊ฒŒ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Bash์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--transform_name_mapping='{"oldTransform1":"newTransform1",...}'

gcloud

--transform-name-mappings ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘์„ ์ „๋‹ฌํ•  ๋•Œ ๋‹ค์Œ์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

--transform-name-mappings= .
{"oldTransform1":"newTransform1","oldTransform2":"newTransform2",...}

์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์‚ฌ์ด์— ๋ณ€๊ฒฝ๋œ ๋ณ€ํ™˜ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ๋งŒ --transform-name-mappings์— ๋งคํ•‘ ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--transform-name-mappings์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ๋•Œ ๋”ฐ์˜ดํ‘œ๋ฅผ ์…ธ์— ๋งž๊ฒŒ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Bash์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--transform-name-mappings='{"oldTransform1":"newTransform1",...}'

REST

transformNameMapping ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘์„ ์ „๋‹ฌํ•  ๋•Œ ๋‹ค์Œ์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

"transformNameMapping": {
  oldTransform1: newTransform1,
  oldTransform2: newTransform2,
  ...
}

์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์‚ฌ์ด์— ๋ณ€๊ฒฝ๋œ ๋ณ€ํ™˜ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ๋งŒ transformNameMapping์— ๋งคํ•‘ ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜ ์ด๋ฆ„ ํ™•์ธ

๋งต์˜ ๊ฐ ์ธ์Šคํ„ด์Šค์—์„œ ๋ณ€ํ™˜ ์ด๋ฆ„์€ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ณ€ํ™˜ ์ ์šฉ ์‹œ ์ œ๊ณตํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”

  .apply("FormatResults", ParDo
    .of(new DoFn<KV<String, Long>>, String>() {
      ...
     }
  }))

Python

  | 'FormatResults' >> beam.ParDo(MyDoFn())

Go

  // In Go, this is always the package-qualified name of the DoFn itself.
  // For example, if the FormatResults DoFn is in the main package, its name
  // is "main.FormatResults".
  beam.ParDo(s, FormatResults, results)

Dataflow ๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ž‘์—…์˜ ์‹คํ–‰ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ์ด์ „ ์ž‘์—…์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

WordCount ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹คํ–‰ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆผ 2: Dataflow ๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค์— ํ‘œ์‹œ๋˜๋Š” WordCount ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹คํ–‰ ๊ทธ๋ž˜ํ”„

๋ณตํ•ฉ ๋ณ€ํ™˜ ์ด๋ฆ„ ์ง€์ •

๋ณ€ํ™˜ ์ด๋ฆ„์€ ๊ณ„์ธต์ ์ด๋ฉฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์— ๋ณตํ•ฉ ๋ณ€ํ™˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ค‘์ฒฉ๋œ ๋ณ€ํ™˜์€ ํฌ๊ด„ํ•˜๋Š” ๋ณ€ํ™˜์˜ ๊ด€์ ์—์„œ ์ด๋ฆ„์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ดํ”„๋ผ์ธ์— CountWidgets๋ผ๋Š” ๋ณตํ•ฉ ๋ณ€ํ™˜์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์—ฌ๊ธฐ์— Parse๋ผ๋Š” ๋‚ด๋ถ€ ๋ณ€ํ™˜์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜์˜ ์ „์ฒด ์ด๋ฆ„์€ CountWidgets/Parse๊ฐ€ ๋˜๊ณ  ๋ณ€ํ™˜ ๋งคํ•‘์— ์ด ์ „์ฒด ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ณตํ•ฉ ๋ณ€ํ™˜์„ ๋‹ค๋ฅธ ์ด๋ฆ„์— ๋งคํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ, ์ค‘์ฒฉ๋œ ๋ชจ๋“  ๋ณ€ํ™˜์˜ ์ด๋ฆ„๋„ ์ž๋™์œผ๋กœ ๋ฐ”๋€Œ๋ฏ€๋กœ, ๋ณ€ํ™˜ ๋งคํ•‘์˜ ๋‚ด๋ถ€ ๋ณ€ํ™˜์— ๋ณ€๊ฒฝ๋œ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜ ๊ณ„์ธต ๊ตฌ์กฐ ๋ฆฌํŒฉํ„ฐ๋ง

๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์— ์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๋‹ค๋ฅธ ๋ณ€ํ™˜ ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๋งคํ•‘์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณตํ•ฉ ๋ณ€ํ™˜์„ ๋ฆฌํŒฉํ„ฐ๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ณ€ํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ์•„๋‹ˆ๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ณ€๊ฒฝ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ณตํ•ฉ ๋ณ€ํ™˜์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ์— Parse๋ผ๋Š” ๋‚ด๋ถ€ ๋ณ€ํ™˜์ด ํฌํ•จ๋œ ๋ณตํ•ฉ ๋ณ€ํ™˜ CountWidgets๊ฐ€ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์€ CountWidgets๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  Scan์ด๋ผ๋Š” ๋‹ค๋ฅธ ๋ณ€ํ™˜ ์•ˆ์— Parse๋ฅผ ์ค‘์ฒฉํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ์— ์„ฑ๊ณตํ•˜๋ ค๋ฉด ์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ(CountWidgets/Parse)์˜ ์ „์ฒด ๋ณ€ํ™˜ ์ด๋ฆ„์„ ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ(CountWidgets/Scan/Parse)์˜ ๋ณ€ํ™˜ ์ด๋ฆ„์— ๋ช…์‹œ์ ์œผ๋กœ ๋งคํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ž๋ฐ”

--transformNameMapping={"CountWidgets/Parse":"CountWidgets/Scan/Parse"}

๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, null ๋งคํ•‘์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด CountWidgets/Parse ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

--transformNameMapping={"CountWidgets/Parse":""}

Python

--transform_name_mapping={"CountWidgets/Parse":"CountWidgets/Scan/Parse"}

๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, null ๋งคํ•‘์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด CountWidgets/Parse ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

--transform_name_mapping={"CountWidgets/Parse":""}

Go

--transform_name_mapping={"CountWidgets/main.Parse":"CountWidgets/Scan/main.Parse"}

๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, null ๋งคํ•‘์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด CountWidgets/Parse ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

--transform_name_mapping={"CountWidgets/main.Parse":""}

gcloud

--transform-name-mappings={"CountWidgets/Parse":"CountWidgets/Scan/Parse"}

๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, null ๋งคํ•‘์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด CountWidgets/Parse ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

--transform-name-mappings={"CountWidgets/main.Parse":""}

REST

"transformNameMapping": {
  CountWidgets/Parse: CountWidgets/Scan/Parse
}

๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, null ๋งคํ•‘์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด CountWidgets/Parse ๋ณ€ํ™˜์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

"transformNameMapping": {
  CountWidgets/main.Parse: null
}

์ž‘์—… ๊ต์ฒด์˜ ํšจ๊ณผ

๊ธฐ์กด ์ž‘์—…์„ ๊ต์ฒดํ•˜๋ฉด ์ƒˆ ์ž‘์—…์ด ์—…๋ฐ์ดํŠธ๋œ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Dataflow ์„œ๋น„์Šค๋Š” ์ž‘์—… ์ด๋ฆ„์„ ์œ ์ง€ํ•˜์ง€๋งŒ ์—…๋ฐ์ดํŠธ๋œ ์ž‘์—… ID๋กœ ๊ต์ฒด ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋กœ ์ธํ•ด ๊ธฐ์กด ์ž‘์—…์ด ์ค‘์ง€๋˜๊ณ  ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํ–‰๋˜์–ด ์ƒˆ ์ž‘์—…์ด ์‹œ์ž‘๋  ๋•Œ ๋‹ค์šดํƒ€์ž„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ต์ฒด ์ž‘์—… ์‹œ ๋‹ค์Œ ํ•ญ๋ชฉ์€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.

์ค‘๊ฐ„ ์ƒํƒœ ๋ฐ์ดํ„ฐ

์ด์ „ ์ž‘์—…์˜ ์ค‘๊ฐ„ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋ฐ์ดํ„ฐ์—๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•˜๋ ค๋ฉด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ฆฌํŒฉํ„ฐ๋งํ•˜์—ฌ ์บ์‹œ๋ฅผ ์ƒํƒœ ๋ฐ์ดํ„ฐ ๋˜๋Š”๋ถ€์ฐจ ์ž…๋ ฅ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€์ฐจ ์ž…๋ ฅ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Apache Beam ๋ฌธ์„œ์˜ ๋ถ€์ฐจ ์ž…๋ ฅ ํŒจํ„ด์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ŠคํŠธ๋ฆฌ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ์—๋Š” ValueState ๋ฐ ๋ถ€์ฐจ ์ž…๋ ฅ์— ๋Œ€ํ•œ ํฌ๊ธฐ ํ•œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด์กดํ•˜๋ ค๋Š” ๋Œ€์šฉ๋Ÿ‰ ์บ์‹œ๊ฐ€ ์žˆ์œผ๋ฉด Memorystore ๋˜๋Š” Bigtable๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง„ํ–‰ ์ค‘์ธ ๋ฐ์ดํ„ฐ

'์ง„ํ–‰ ์ค‘์ธ' ๋ฐ์ดํ„ฐ๋Š” ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜์— ์˜ํ•ด ๊ณ„์† ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์— ์ถ”๊ฐ€๋˜๋Š” ์ถ”๊ฐ€ ๋ณ€ํ™˜์€ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฒ„ํผ๋ง๋˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ์ ์šฉ๋˜๊ฑฐ๋‚˜ ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ ๊ธฐ์กด ํŒŒ์ดํ”„๋ผ์ธ์—๋Š” ๋‹ค์Œ ๋ณ€ํ™˜์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Java

  p.apply("Read", ReadStrings())
   .apply("Format", FormatStrings());

Python

  p | 'Read' >> beam.io.ReadFromPubSub(subscription=known_args.input_subscription)
    | 'Format' >> FormatStrings()

Go

   beam.ParDo(s, ReadStrings)
   beam.ParDo(s, FormatStrings)

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์—…์„ ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Java

  p.apply("Read", ReadStrings())
   .apply("Remove", RemoveStringsStartingWithA())
   .apply("Format", FormatStrings());

Python

  p | 'Read' >> beam.io.ReadFromPubSub(subscription=known_args.input_subscription)
    | 'Remove' >> RemoveStringsStartingWithA()
    | 'Format' >> FormatStrings()

Go

  beam.ParDo(s, ReadStrings)
  beam.ParDo(s, RemoveStringsStartingWithA)
  beam.ParDo(s, FormatStrings)

๋ฌธ์ž 'A'๋กœ ์‹œ์ž‘๋˜๋Š” ๋ฌธ์ž์—ด์„ ํ•„ํ„ฐ๋งํ•˜๋„๋ก ๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ์—๋„ ๋‹ค์Œ ๋ณ€ํ™˜(FormatStrings) ์‹œ ์ด์ „ ์ž‘์—…์—์„œ ์ „์†ก๋˜๊ณ  'A'๋กœ ์‹œ์ž‘๋˜๋Š” ๋ฒ„ํผ๋ง๋œ ๋ฌธ์ž์—ด ๋˜๋Š” ์ง„ํ–‰ ์ค‘์ธ ๋ฌธ์ž์—ด์ด ๊ณ„์† ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๊ฐ„ ์„ค์ • ๋ณ€๊ฒฝ

๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ PCollection ์š”์†Œ์˜ ๊ธฐ๊ฐ„ ์„ค์ • ๋ฐ ํŠธ๋ฆฌ๊ฑฐ ์ „๋žต์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œˆ๋„์šฐ ๋˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ์ „๋žต์„ ๋ณ€๊ฒฝํ•ด๋„ ์ด๋ฏธ ๋ฒ„ํผ๋ง๋˜์—ˆ๊ฑฐ๋‚˜ ์ง„ํ–‰ ์ค‘์ธ ๋ฐ์ดํ„ฐ๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณ ์ • ๊ธฐ๊ฐ„ ๋˜๋Š” ์Šฌ๋ผ์ด๋”ฉ ๊ธฐ๊ฐ„ ์ฐฝ๊ณผ ๊ฐ™์ด ํŒŒ์ดํ”„๋ผ์ธ์˜ ์œˆ๋„์šฐ์— ๋” ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ๋งŒ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์œˆ๋„์šฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์ด ์œˆ๋„์šฐ๋‚˜ ํŠธ๋ฆฌ๊ฑฐ์— ๋Œ€๋Œ€์ ์ธ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ์ถœ๋ ฅ์— ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ

๊ต์ฒด ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ฉด Dataflow ์„œ๋น„์Šค๋Š” ๊ต์ฒด ์ž‘์—…๊ณผ ์ด์ „ ์ž‘์—… ์‚ฌ์ด์˜ ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ์— ํ†ต๊ณผํ•˜๋ฉด ์ด์ „ ์ž‘์—…์ด ์ค‘์ง€๋˜๊ณ , ๊ทธ๋Ÿฌ๋ฉด ๋™์ผํ•œ ์ž‘์—… ์ด๋ฆ„์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋Œ€์ฒด ์ž‘์—…์ด Dataflow ์„œ๋น„์Šค์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•˜๋ฉด ์ด์ „ ์ž‘์—…์ด Dataflow ์„œ๋น„์Šค์—์„œ ๊ณ„์† ์‹คํ–‰๋˜๋ฉฐ ๊ต์ฒด ์ž‘์—…์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”

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

  1. ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์— pipeline.run().waitUntilFinish()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. --update ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ต์ฒด ์ž‘์—…์ด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  4. Ctrl+C๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ฐจ๋‹จ ์‹คํ–‰์ž ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” Dataflow ๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ต์ฒด ์ž‘์—… ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Python

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

  1. ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์— pipeline.run().wait_until_finish()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. --update ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ต์ฒด ์ž‘์—…์ด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  4. Ctrl+C๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ฐจ๋‹จ ์‹คํ–‰์ž ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” Dataflow ๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ต์ฒด ์ž‘์—… ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Go

์ œํ•œ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์ฝ˜์†” ๋˜๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํŒจํ•œ ์—…๋ฐ์ดํŠธ ์‹œ๋„ ์˜ค๋ฅ˜๋ฅผ ๋ณด๋ ค๋ฉด ์‹คํ–‰ ์ฐจ๋‹จ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ --execute_async ๋˜๋Š” --async ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ฐจ๋‹จ ์‹คํ–‰์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  1. --update ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  --execute_async ๋˜๋Š” --async ํ”Œ๋ž˜๊ทธ ์—†์ด ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ต์ฒด ์ž‘์—…์ด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  3. Ctrl+C๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ฐจ๋‹จ ์‹คํ–‰์ž ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

gcloud

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

  1. Java ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์— pipeline.run().waitUntilFinish()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Python ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์— pipeline.run().wait_until_finish()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Go ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ Go ํƒญ์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.
  2. --update ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ต์ฒด ์ž‘์—…์ด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  4. Ctrl+C๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ฐจ๋‹จ ์‹คํ–‰์ž ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

REST

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

  • Java ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์— pipeline.run().waitUntilFinish()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Python ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ์— pipeline.run().wait_until_finish()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Go ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ Go ํƒญ์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.
  • replaceJobId ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ต์ฒด ์ž‘์—…์ด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • Ctrl+C๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ฐจ๋‹จ ์‹คํ–‰์ž ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋Š” ์ œ๊ณต๋œ ๋ณ€ํ™˜ ๋งคํ•‘์„ ์‚ฌ์šฉํ•ด์„œ Dataflow๊ฐ€ ์ด์ „ ๋‹จ๊ณ„์—์„œ ๊ต์ฒด ์ž‘์—…์œผ๋กœ ์ค‘๊ฐ„ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ํŒŒ์ดํ”„๋ผ์ธ์˜ PCollection์— ๋™์ผํ•œ Coder๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Coder๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ง„ํ–‰ ์ค‘์ธ ๋ฐ์ดํ„ฐ ๋˜๋Š” ๋ฒ„ํผ๋ง๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ œ๋Œ€๋กœ ์ง๋ ฌํ™”๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธํ™˜์„ฑ ์†์ƒ ๋ฐฉ์ง€

์ด์ „ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ ๊ฐ„์˜ ํŠน์ • ์ฐจ์ด๋กœ ์ธํ•ด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋งคํ•‘์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ํŒŒ์ดํ”„๋ผ์ธ ๊ทธ๋ž˜ํ”„ ๋ณ€๊ฒฝ. ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด Dataflow๊ฐ€ ์ด์ „ ์ž‘์—…์˜ ๋ณ€ํ™˜์„ ๊ต์ฒด ์ž‘์—…์˜ ๋ณ€ํ™˜์— ๋งค์นญํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋งค์นญ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ ๋‹จ๊ณ„์— ๋Œ€ํ•ด Dataflow๊ฐ€ ์ค‘๊ฐ„ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. ๋‹จ๊ณ„ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋‹จ๊ณ„๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ Dataflow๊ฐ€ ์ด์— ๋งž๊ฒŒ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™˜ ๋งคํ•‘์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ๊ณ„์˜ ๋ถ€์ฐจ ์ž…๋ ฅ ๋ณ€๊ฒฝ. ๊ต์ฒด ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ€ํ™˜์— ๋ถ€์ฐจ ์ž…๋ ฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ด ๋ณ€ํ™˜์—์„œ ๋ถ€์ฐจ ์ž…๋ ฅ์„ ์ œ๊ฑฐํ•˜๋ฉด ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ๊ณ„์˜ Coder ๋ณ€๊ฒฝ. ์ž‘์—…์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด Dataflow๊ฐ€ ํ˜„์žฌ ๋ฒ„ํผ๋ง๋œ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณด์กดํ•˜๊ณ  ๊ต์ฒด ์ž‘์—…์—์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œˆ๋„์ž‰์„ ์™„๋ฃŒํ•˜๋Š” ๋™์•ˆ ๋ฒ„ํผ๋ง๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ต์ฒด ์ž‘์—…์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, Dataflow๋Š” ์ด๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ฑฐ๋‚˜ ์—ญ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์—์„œ '์Šคํ…Œ์ดํŠธํ’€(Stateful)' ์ž‘์—… ์‚ญ์ œ. ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์Šคํ…Œ์ดํŠธํ’€(Stateful) ์ž‘์—…์„ ์‚ญ์ œํ•˜๋ฉด ๊ต์ฒด ์ž‘์—…์—์„œ ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dataflow๋Š” ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ํ•จ๊ป˜ ์œตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œตํ•ฉ๋œ ๋‹จ๊ณ„ ๋‚ด์—์„œ ์ƒํƒœ ์˜์กด์ ์ธ ์ž‘์—…์„ ์ œ๊ฑฐํ•˜๋ฉด ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ์ €์žฅ ์ž‘์—…์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    • ๋ถ€์ฐจ ์ž…๋ ฅ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์†Œ๋น„ํ•˜๋Š” ๋ณ€ํ™˜
    • I/O ์ฝ๊ธฐ
    • ํ‚ค๊ฐ€ ์ง€์ •๋œ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€ํ™˜
    • ์œˆ๋„์šฐ ๋ณ‘ํ•ฉ์ด ์žˆ๋Š” ๋ณ€ํ™˜
  • ์Šคํ…Œ์ดํŠธํ’€(Stateful) DoFn ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ. ์ง„ํ–‰ ์ค‘์ธ ์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ํŒŒ์ดํ”„๋ผ์ธ์— ์Šคํ…Œ์ดํŠธํ’€(Stateful) DoFn๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ ์Šคํ…Œ์ดํŠธํ’€(Stateful) DoFn ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ์˜์—ญ์—์„œ ๊ต์ฒด ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ. ์ด์ „ ์ž‘์—…์„ ์‹คํ–‰ํ•œ ์˜์—ญ๊ณผ ๋™์ผํ•œ ์˜์—ญ์—์„œ ๊ต์ฒด ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ‚ค๋งˆ ์—…๋ฐ์ดํŠธ

Apache Beam์—์„œ๋Š” PCollection์—์„œ ์ด๋ฆ„์ด ์ง€์ •๋œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๋ช…์‹œ์  Coder๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ค‘์ฒฉ๋œ ํ•„๋“œ๋ฅผ ํฌํ•จํ•ด) ์ง€์ •๋œ ์Šคํ‚ค๋งˆ์˜ ํ•„๋“œ ์ด๋ฆ„๊ณผ ์œ ํ˜•์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ด ์Šคํ‚ค๋งˆ๋กœ ์ธํ•ด ์—…๋ฐ์ดํŠธ ํ™•์ธ์ด ์‹คํŒจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹ค๋ฅธ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ‚ค๋งˆ ๊ฐœ์„ 

๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ PCollection์˜ ์Šคํ‚ค๋งˆ๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. Dataflow ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์Šคํ‚ค๋งˆ์— ์ค‘์ฒฉ ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ƒˆ ํ•„๋“œ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ์ถ”๊ฐ€
  • ํ•„์ˆ˜(null ๋น„ํ—ˆ์šฉ) ํ•„๋“œ ์œ ํ˜•์„ ์„ ํƒ์‚ฌํ•ญ(null ํ—ˆ์šฉ)์œผ๋กœ ๋งŒ๋“ค๊ธฐ

์—…๋ฐ์ดํŠธ ์ค‘์—๋Š” ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ํ•„๋“œ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ•„๋“œ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ParDo ์ž‘์—…์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€(๋Œ€์—ญ ์™ธ) ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์กด ParDo ์ž‘์—…์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •๋ณด๋ฅผ DoFn ์„œ๋ธŒํด๋ž˜์Šค์˜ ํ•„๋“œ๋กœ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ต๋ช…์˜ DoFn์—์„œ ๋ฉ”์„œ๋“œ๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ์ž๋™์œผ๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค.
  • DoFn.startBundle() ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ParDo.withSideInputs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.