์ด ๋ฌธ์์์๋ ์งํ ์ค์ธ ์คํธ๋ฆฌ๋ฐ ์์ ์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ธฐ์กด Dataflow ์์ ์ ์ ๋ฐ์ดํธํด์ผ ํ ์ ์์ต๋๋ค.
- ํ์ดํ๋ผ์ธ ์ฝ๋๋ฅผ ํฅ์ ๋๋ ๊ฐ์ ํ๋ ค๋ ๊ฒฝ์ฐ
- ํ์ดํ๋ผ์ธ ์ฝ๋์์ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ค๋ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ ํ์์ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ฐ์ดํฐ ์์ค์ ๋ฒ์ ๋๋ ๊ธฐํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ช ํ๊ธฐ ์ํด ํ์ดํ๋ผ์ธ์ ์ ๋ฐ์ดํธํ๋ ค๋ ๊ฒฝ์ฐ
- ๋ชจ๋ Dataflow ์์ ์์ Container-Optimized OS์ ๊ด๋ จ๋ ๋ณด์ ์ทจ์ฝ์ ์ ํจ์นํ๋ ค๋ ๊ฒฝ์ฐ
- ๋ค๋ฅธ ์์ ์ ์๋ฅผ ์ฌ์ฉํ๋๋ก ์คํธ๋ฆฌ๋ฐ Apache Beam ํ์ดํ๋ผ์ธ์ ํ์ฅํ๋ ค๋ ๊ฒฝ์ฐ.
๋ค์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์ ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
- ์งํ ์ค์ธ ์์
์
๋ฐ์ดํธ: Streaming Engine์ ์ฌ์ฉํ๋ ์คํธ๋ฆฌ๋ฐ ์์
์ ๊ฒฝ์ฐ ์์
์ ์ค์งํ๊ฑฐ๋ ์์
ID๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋
min-num-workers
๋ฐmax-num-workers
์์ ์ต์ ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. - ๊ต์ฒด ์์ : ์ ๋ฐ์ดํธ๋ ํ์ดํ๋ผ์ธ ์ฝ๋๋ฅผ ์คํํ๊ฑฐ๋ ์งํ ์ค์ธ ์์ ์ ๋ฐ์ดํธ๊ฐ ์ง์ํ์ง ์๋ ์์ ์ต์ ์ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ๊ธฐ์กด ์์ ์ ๊ต์ฒดํ๋ ์ ์์ ์ ์คํํฉ๋๋ค. ๊ต์ฒด ์์ ์ด ์ ํจํ์ง ํ์ธํ๋ ค๋ฉด ์ ์์ ์ ์์ํ๊ธฐ ์ ์ ์์ ๊ทธ๋ํ๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
์์ ์ ์ ๋ฐ์ดํธํ๋ฉด Dataflow ์๋น์ค๋ ํ์ฌ ์คํ ์ค์ธ ์์ ๊ณผ ์ ์ฌ์ ์ธ ๊ต์ฒด ์์ ์ฌ์ด์ ํธํ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค. ํธํ์ฑ ๊ฒ์ฌ๋ฅผ ํตํด ์ค๊ฐ ์ํ ์ ๋ณด ๋ฐ ๋ฒํผ๋ง๋ ๋ฐ์ดํฐ์ ๊ฐ์ ํญ๋ชฉ์ ์ด์ ์์ ์์ ๊ต์ฒด ์์ ์ผ๋ก ์ ์กํ ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
Apache Beam SDK์ ๊ธฐ๋ณธ ์ ๊ณต๋๋ ๋ก๊น
์ธํ๋ผ๋ฅผ ์ฌ์ฉํ์ฌ ์์
์ ์
๋ฐ์ดํธํ ๋๋ ์ ๋ณด๋ฅผ ๋ก๊น
ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ํ์ดํ๋ผ์ธ ๋ก๊ทธ ์์
์ ์ฐธ์กฐํ์ธ์.
ํ์ดํ๋ผ์ธ ์ฝ๋ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ค๋ฉด DEBUG
๋ก๊น
์์ค์ ์ฌ์ฉํฉ๋๋ค.
- ๊ธฐ๋ณธ ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ ์คํธ๋ฆฌ๋ฐ ์์ ์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์ปค์คํ ํ ํ๋ฆฟ ์คํธ๋ฆฌ๋ฐ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ฐธ์กฐํ์ธ์.
- Flex ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ ์คํธ๋ฆฌ๋ฐ ์์ ์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์ด ํ์ด์ง์ gcloud CLI ์๋ด๋ฅผ ๋ฐ๋ฅด๊ฑฐ๋ Flex ํ ํ๋ฆฟ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ฐธ์กฐํ์ธ์.
์งํ ์ค์ธ ์์ ์ต์ ์ ๋ฐ์ดํธ
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 ํ ํ๋ฆฟ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ฐธ์กฐํ์ธ์.
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์ ๋๋ค.
์์ ์ ์ ๋ฐ์ดํธํ๋ ค๋ฉด
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
ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌํด์ผ ํฉ๋๋ค.์ ํ์ฌํญ: 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 ๋ช
๋ น์ค ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ์์
๋ชฉ๋ก์ ์ฟผ๋ฆฌํฉ๋๋ค.
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 ๋ชจ๋ํฐ๋ง ์ธํฐํ์ด์ค์์ ์์ ์ ์คํ ๊ทธ๋ํ๋ฅผ ๊ฒํ ํ์ฌ ์ด์ ์์ ์ ๋ณํ ์ด๋ฆ์ ๊ฐ์ ธ์ฌ ์๋ ์์ต๋๋ค.

๋ณตํฉ ๋ณํ ์ด๋ฆ ์ง์
๋ณํ ์ด๋ฆ์ ๊ณ์ธต์ ์ด๋ฉฐ ํ์ดํ๋ผ์ธ์ ๋ณํ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ํ์ดํ๋ผ์ธ์ ๋ณตํฉ ๋ณํ์ด ์๋ ๊ฒฝ์ฐ, ์ค์ฒฉ๋ ๋ณํ์ ํฌ๊ดํ๋ ๋ณํ์ ๊ด์ ์์ ์ด๋ฆ์ด ์ง์ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ดํ๋ผ์ธ์ 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 ์๋น์ค์์ ๊ณ์ ์คํ๋๋ฉฐ ๊ต์ฒด ์์ ์ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
์๋ฐ
์ ํ์ฌํญ์ผ๋ก ์ธํด ์ฝ์ ๋๋ ํฐ๋ฏธ๋์์ ์คํจํ ์ ๋ฐ์ดํธ ์๋ ์ค๋ฅ๋ฅผ ๋ณด๋ ค๋ฉด ์คํ ์ฐจ๋จ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ํ์ดํ๋ผ์ธ ์ฝ๋์ pipeline.run().waitUntilFinish()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
--update
์ต์ ์ ์ฌ์ฉํ์ฌ ๊ต์ฒด ํ์ดํ๋ผ์ธ ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค.- ๊ต์ฒด ์์ ์ด ํธํ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
Ctrl+C
๋ฅผ ์ ๋ ฅํ์ฌ ์ฐจ๋จ ์คํ์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํฉ๋๋ค.
๋๋ Dataflow ๋ชจ๋ํฐ๋ง ์ธํฐํ์ด์ค์์ ๊ต์ฒด ์์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์์๋์์ผ๋ฉด ํธํ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ๊ฒ์ ๋๋ค.
Python
์ ํ์ฌํญ์ผ๋ก ์ธํด ์ฝ์ ๋๋ ํฐ๋ฏธ๋์์ ์คํจํ ์ ๋ฐ์ดํธ ์๋ ์ค๋ฅ๋ฅผ ๋ณด๋ ค๋ฉด ์คํ ์ฐจ๋จ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ํ์ดํ๋ผ์ธ ์ฝ๋์ pipeline.run().wait_until_finish()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
--update
์ต์ ์ ์ฌ์ฉํ์ฌ ๊ต์ฒด ํ์ดํ๋ผ์ธ ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค.- ๊ต์ฒด ์์ ์ด ํธํ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
Ctrl+C
๋ฅผ ์ ๋ ฅํ์ฌ ์ฐจ๋จ ์คํ์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํฉ๋๋ค.
๋๋ Dataflow ๋ชจ๋ํฐ๋ง ์ธํฐํ์ด์ค์์ ๊ต์ฒด ์์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์์๋์์ผ๋ฉด ํธํ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ๊ฒ์ ๋๋ค.
Go
์ ํ์ฌํญ์ผ๋ก ์ธํด ์ฝ์ ๋๋ ํฐ๋ฏธ๋์์ ์คํจํ ์
๋ฐ์ดํธ ์๋ ์ค๋ฅ๋ฅผ ๋ณด๋ ค๋ฉด ์คํ ์ฐจ๋จ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํนํ --execute_async
๋๋ --async
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ฐจ๋จ ์คํ์ ์ง์ ํด์ผ ํฉ๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
--update
์ต์ ์ ์ฌ์ฉํ๊ณ--execute_async
๋๋--async
ํ๋๊ทธ ์์ด ๊ต์ฒด ํ์ดํ๋ผ์ธ ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค.- ๊ต์ฒด ์์ ์ด ํธํ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
Ctrl+C
๋ฅผ ์ ๋ ฅํ์ฌ ์ฐจ๋จ ์คํ์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํฉ๋๋ค.
gcloud
์ ํ์ฌํญ์ผ๋ก ์ธํด ์ฝ์ ๋๋ ํฐ๋ฏธ๋์์ ์คํจํ ์ ๋ฐ์ดํธ ์๋ ์ค๋ฅ๋ฅผ ๋ณด๋ ค๋ฉด ์คํ ์ฐจ๋จ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- Java ํ์ดํ๋ผ์ธ์ ๊ฒฝ์ฐ ํ์ดํ๋ผ์ธ ์ฝ๋์ pipeline.run().waitUntilFinish()๋ฅผ ์ฌ์ฉํฉ๋๋ค. Python ํ์ดํ๋ผ์ธ์ ๊ฒฝ์ฐ ํ์ดํ๋ผ์ธ ์ฝ๋์ pipeline.run().wait_until_finish()๋ฅผ ์ฌ์ฉํฉ๋๋ค. Go ํ์ดํ๋ผ์ธ์ ๊ฒฝ์ฐ Go ํญ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
--update
์ต์ ์ ์ฌ์ฉํ์ฌ ๊ต์ฒด ํ์ดํ๋ผ์ธ ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค.- ๊ต์ฒด ์์ ์ด ํธํ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
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
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ๋ค์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
- Apache Beam ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ด๋: ParDo ์ค ํนํ DoFn ๋ง๋ค๊ธฐ ๋ฐ ๋ถ์ฐจ ์ ๋ ฅ ๊ด๋ จ ์น์
- Java์ฉ Apache Beam SDK ์ฐธ์กฐ: ParDo