본문 바로가기

개발중/AirFlow

Airflow 병렬 처리의 함정: Worker 분산 없이 처리하면?

728x90
반응형

 

Airflow에서 병렬 처리를 구현할 때 많은 사람들이 성능이 크게 향상될 것으로 기대하지만, Worker 분산 처리가 설정되어 있지 않은 경우에는 오히려 순차 처리보다 더 느려질 수 있는 상황이 발생합니다. 이번 포스팅에서는 Airflow의 병렬 처리와 순차 처리의 테스트 결과를 비교하고, 그 이유를 살펴보겠습니다.

 

테스트 결과 비교

Task 순차 처리

전체 데이터 수 300,000
태스크별 데이터 수 300,000
전체 소요 시간 1시간 56분

 

Task 병렬 처리

전체 데이터 수 300,000
태스크별 데이터 수 75,000
전체 소요 시간 2시간 1분

 

테스트 결과를 보면, 병렬 처리의 전체 소요 시간이 순차 처리보다 오히려 더 길어졌음을 알 수 있습니다. 병렬 처리를 했음에도 불구하고 성능이 기대만큼 향상되지 않은 이유는 무엇일까요?

 

Worker 분산 없이 병렬 처리의 한계

Airflow에서 Worker 분산 처리가 설정되지 않은 경우, 모든 태스크는 동일한 시스템 내에서 실행됩니다. 이 말은 곧, 하나의 CPU와 메모리 자원을 모든 태스크가 공유한다는 뜻입니다. 각 태스크가 병렬로 실행된다고 해도, 결국은 동일한 하드웨어 자원을 나눠 사용하므로 실질적인 병렬 처리 효과를 내지 못하게 됩니다.

 

  • CPU와 메모리 공유: 병렬 태스크가 동시에 실행되면 CPU와 메모리 자원을 나눠 사용해야 하기 때문에, 오히려 태스크 간 자원 경합이 발생합니다. CPU가 여러 태스크를 번갈아 처리하며 발생하는 컨텍스트 스위칭 오버헤드가 전체 성능을 저하시키는 주요 원인입니다.
  • I/O 병목: 여러 태스크가 동시에 데이터베이스와 통신하면, 데이터베이스에 I/O 병목 현상이 발생할 수 있습니다. 이로 인해, 각 태스크가 처리되는 속도가 줄어들고 전체적인 실행 시간이 늘어날 수 있습니다.
  • 실제 병렬성의 부족: 워커 분산 없이 병렬 처리를 구성하면, 병렬로 실행되는 것처럼 보일 뿐, 실질적으로 모든 태스크가 동일한 자원을 나눠 사용하기 때문에 완전한 의미의 병렬 처리가 이루어지지 않습니다.

 

진정한 병렬 처리를 위해 필요한 것: Worker 분산

Worker 분산 처리가 되어야만 진정한 병렬 처리가 가능합니다. 여러 워커가 각각 독립적인 물리적 자원(CPU, 메모리 등)을 사용하기 때문에, 태스크들이 병렬로 실행되면서 성능이 크게 향상될 수 있습니다. 이를 위해 Airflow에서는 CeleryExecutorKubernetesExecutor를 사용하여 여러 워커를 분산 구성할 수 있습니다.

  • CeleryExecutor: 여러 워커 노드를 구성하고, Celery 브로커를 통해 태스크를 분산 처리합니다. 각 워커가 독립적으로 태스크를 실행하므로 자원을 효율적으로 활용할 수 있습니다.
  • KubernetesExecutor: 각 태스크를 Kubernetes Pod로 실행하여 완벽한 격리와 확장성을 제공합니다. 클러스터의 자원을 활용해 유연하게 확장할 수 있습니다.

 

마무리

Airflow에서 병렬 처리를 구현할 때, Worker 분산이 설정되지 않았다면 성능 개선 효과는 기대에 미치지 못할 수 있습니다. 오히려 모든 태스크가 동일한 자원을 나눠 사용함으로써 순차 처리보다도 더 느려질 수 있습니다. 진정한 병렬 처리를 위해서는 여러 워커를 분산하여 구성하는 것이 중요합니다.

728x90
반응형