작성
·
227
0
멀티 스케줄러 환경에서, 각 스케줄러는
Dag Parsing
DB에 해당정보를 기록
Scheduler Loop
의 과정을 거친다고 이해했습니다.
여기서, Dag Parsing에 관한 부분은 DB에 관한 정보를 참고해서 하는것이 아닌 코드만을 가지고서 돌려보는 것으로 이해하고 있는데, 그렇다면 1번 과정(Dag Parsing)은 멀티 스케줄러 환경을 구성한다고 해서 시간 단축의 효과를 얻을 수 없는것인가요??
DAG이 10개가 있고, 스케줄러가 두개가 있다면,
1번 스케줄러가 첫번째 DAG를 돌렸고, Lock을 걸은 후, 해당 작업이 큐까지 들어가게 되면 DB에 관한 정보의 Lock을 해제 하나요? 그렇다면 만약 다른 스케줄러가 해당 DAG의 정보를 검색했을때, 해당 DAG에 관한 Scheduler Loop를 돌것이고, 그렇다면 이 상황에서는 멀티스케줄러의 이점을 얻을 수 없는것인지가 궁금합니다.
감사합니다.
답변 1
1
안녕하세요 Hyeonghwan Kwon 님
요약하자면 스케줄러는
DAG Parsing 단계에서는 스케줄러를 N개를 띄운다해서 각 스케줄러의 부하가 1/N로 줄지는 않습니다.
스케줄러는 DAG Parsing을 각자 독립적으로 진행하죠.
하지만 Scheduler Loop 단계에서는 스케줄러를 N개 띄우면 각 스케줄러의 부하는 1/N로 줄어듭니다.
Scheduler Loop 단계는 수업에서 설명드렸듯이 실행 준비가 된 DAG에 대해 RUN ID 생성 -->Task를 인스턴스화해서 Celery 큐에 넣어 실행되도록 하죠.
그리고 이 과정에서 메타 Database 테이블에 Lock을 걸어놓음으로써 다른 스케줄러가 중복처리되지 않도록 합니다.
따라서 이 단계에서는 선형적이지는 않겠지만 스케줄러가 많으면 많을수록 스케줄러당 부하가 감소될 수 있습니다. 물론 파라미터들을 조정하면서 실험적으로 테스트해봐야 합니다 (max_dagruns_to_create_per_loop, max_dagruns_per_loop_to_schedule)
추가로 질문주신 아래 내용에 대해서는
1번 스케줄러가 첫번째 DAG를 돌렸고, Lock을 걸은 후, 해당 작업이 큐까지 들어가게 되면 DB에 관한 정보의 Lock을 해제 하나요?
정확히 언제 Lock을 해제하는지 문서에 나와있지는 않습니다만, RUN ID를 만들어 메타 database table 에 insert하고 task instance 도 database table에 insert 가 완료될 때까지만 Lock이 유지되지 않을까 합니다. task가 수행중일 때는 lock이 해제될 것으로 생각되는데요.
task는 수행되면서 여러 status를 가집니다. queued --> running --> success or failed 등의 상태를 가지지요. 각 상태가 바뀔때마다 스케줄러가 메타 테이블에 update를 수행합니다.
보통 Application을 작성할 때 row의 상태가 변할때에만 lock을 걸고 DML을 수행합니다.
즉 첫 Insert 단계에서 Lock 수행 --> Insert --> Lock 해제 --> Task의 상태가 변할때마다 Lock --> update --> Lock 해제 이런식으로 동작하지 않을까 싶네요.
궁금하신게 해결됐으려나요? ^^
네 Celery Executor 에서 워커는 스케줄러의 존재를 모릅니다. Celery 큐(redis)를 통해 지시된 작업만 처리한다고 보시면 되요.
늦은시간까지 열공하시네요.
화이팅입니다 ^^
다시 생각해보니, 질문하면서 scheduler와 worker의 동작에도 약간이 혼동이 있었던것 같은데, 핵심만 짚어서 잘 설명해주셔서 감사합니다!!.