For Each 태스크
For Each 태스크 는 입력 배열의 각 요소에 대해 내부 태스크를 반복 실행합니다. 동일한 로직을 여러 테넌트, 여러 리전, 여러 파티션에 적용하는 패턴에 매우 유용합니다.구조
- For Each 태스크 (외부): 반복할 파라미터 배열을 정의합니다
- 내부 태스크 (nested task): 각 반복에서 실행할 태스크를 정의합니다
concurrency: 동시 실행할 최대 태스크 수를 제어합니다
Asset Bundle YAML 예시
동적 배열 사용 (upstream 태스크 값 활용)
참고: For Each 태스크 공식 문서
Job 생성 방법
UI에서 생성
- 좌측 메뉴 Workflows → Create Job 클릭
- Job 이름 입력
- Task 추가 (노트북 경로, SQL 쿼리 등 지정)
- Task 간 의존성 설정 (드래그&드롭 또는
depends_on선택) - 컴퓨트 설정 (Serverless, Job Cluster, 또는 기존 All-Purpose Cluster)
- 스케줄, 알림, 재시도 정책 설정
Asset Bundles (IaC)
Infrastructure as Code 방식으로 Job을 정의하면 버전 관리와 환경별 배포가 쉬워집니다.베스트 프랙티스
태스크 분리 기준
- 단일 책임 원칙: 하나의 태스크는 하나의 명확한 역할만 수행합니다 (수집, 변환, 검증 등)
- 재실행 단위: 실패 후 재실행하고 싶은 최소 단위로 태스크를 나눕니다
- 컴퓨트 요구사항: 리소스 요구가 크게 다른 단계는 별도 태스크로 분리하여 클러스터를 개별 최적화합니다
의존성 최소화
- 실제로 필요한 의존성만 선언합니다. 불필요한 직렬화는 전체 Job 실행 시간을 늘립니다
- 논리적으로 독립적인 데이터 소스 수집은 항상 병렬 태스크로 설계합니다
- 팬인 지점(합류 태스크)은 반드시 필요한 경우에만 추가합니다
멱등성 설계
모든 태스크는 멱등성(idempotency) 을 갖도록 설계합니다. 같은 태스크를 여러 번 실행해도 결과가 동일해야 합니다.흔한 실수
과도한 의존성
모든 태스크를 직렬로 연결하면 병렬화의 이점을 전혀 얻지 못합니다. 태스크 A의 출력이 태스크 B에 실제로 필요한지 먼저 검토합니다.태스크 값 크기 제한 초과
dbutils.jobs.taskValues의 최대 크기는 48KB 입니다. DataFrame, 대형 리스트, 바이너리 데이터를 태스크 값으로 전달하지 마십시오.
타임아웃 미설정
타임아웃을 설정하지 않으면 무한 대기 상태의 태스크가 클러스터를 점유합니다. 예상 실행 시간의 2-3배를 타임아웃으로 설정합니다.디버그 시 debugValue 미활용
노트북을 독립 실행할 때 dbutils.jobs.taskValues.get은 Job 컨텍스트가 없어 오류를 발생시킵니다. debugValue 파라미터를 반드시 설정합니다.