배치 & 스케쥴러 [ batch & scheduler ]

송수혁·2023년 1월 1일
0

batch

목록 보기
1/2
post-thumbnail

배치? 스케쥴러?

  • 배치는 대용량 처리를 하기 위한 시스템 및 프로그램을 의미한다
  • 스케쥴러는 정해진 시간에 정해진 작업을 수행하는 프로그램을 의미한다

스케쥴러는 어떤 행위를 시작하게하는 트리거 역할을 한다.
배치는 어떤 행위를 의미한다

즉, 배치와 스케쥴러는 비교의 대상이 아니다.

Scheduler

  • Linux Crontab
  • k8s Cronjob
  • Quartz
  • Agenda
  • apache Airflow

스케쥴러에서는 사용하기 위해 정해진 시간을 설정하는데, 가장 대표적으로 사용이 되는 시간 체계는 Crontab 에서 사용하는 포멧을 많이 사용하는것으로 보인다.

Crontab

Linux 에서 기본 제공하는 Scheduler
crontab 은 Linux 계정마다 실행이 가능하다

제일 간단한 스케쥴러

별도의 계정에 별도의 스케쥴을 가동하는 것이 가능하여, 권한이 없는자가 수정 불가능하도록 할 수 있다.

crontab -e # crontab 수정 
crontab -l # crontab 리스트

위 명령어를 통해 crontab 을 수정하는 파일로 들어가게 되면 각 줄마다 스케쥴을 작성할 수 있다.

# 각 계정마다 진행을 하므로, ~[home] 표시 사용 가능
# 아래 내용은 매 분마다 123 을 temp.file 에 붙인다
* * * * * /bin/echo 123 >> ~/temp.file

아래 사이트에서 설정하는 시간에 대해 명시가 잘 되어있다.
https://crontab.guru/

Window 에서는 찾아보니 taskschd.msc 와 같은 형식으로 스케쥴링을 할 수 있다.
차후에 Window 에서 진행을 하려면 실행 > taskschd.msc 로 들어가게되면, 작업 스케쥴러가 실행된다

k8s cronjob

병렬 처리도 가능하고, 정해진 횟수 만큼도 가능하고 k8s 는 여러 컴퓨터를 클러스터링 하는 것 과 동일하게 처리할 수 있는 기법을 많이 제공하므로, 장점은 명확하다

잘 사용하면 좋을 것 같지만, 배우는 시간이 길 수 있다.

k8s job

  • 어떤 동작이 정상적으로 수행할 때 까지 pod 를 띄워, 진행한다.

크론잡 오브젝트 : 한 줄의 crontab 명령어와 동일

크론잡 시간 : K8s 를 관리하는 kube-controller-manager 의 타임존과 동일한 타임존을 사용한다

크론잡 설정에 관련한 사항은 공식 문서를 확인하자

https://kubernetes.io/ko/docs/concepts/workloads/controllers/cron-jobs/

quartz

Quartz 는 자바 어플리케이션을 위한 라이브러리이다.
빌드된 라이브러리 파일로 관리가 되며, Java 에 소스로 관리할 수 있다.

Spring boot 를 사용한다면, 간단히 설정 할 수 있다.

쿼츠는 scheduler, job, trigger 를 통해 동작하게 된다

http://www.quartz-scheduler.org/

apache airflow

스케쥴러 보단, UI 와 Admin 을 제공하고, Dag 을 통한 Docker 를 동작 시키는 것, 쿠버네틱스를 수행하게 하는 것, Python 을 수행하게 하는 것 등 다양한 작업을 수행하는 관리 프로세스로 보는게 더 좋을 것 같다.

Python, 혹은 Go 언어를 사용해서 개발을 진행해야 하므로, 파이썬을 이용한 대용량 데이터를 다루는 데이터 팀이나 혹은 인공지능을 다루는 팀에서 사용하면 편리하게 사용할 수 있다고 생각한다.

agenda job

Node 에서 스케쥴링을 통한 작업을 수행하기 위한 라이브러리 개인적으로 사용해 보았을 때, 가장 가볍게 사용할 수 있는 라이브러리가 아닐까 생각한다.

API 콜을 위하여 사용하고 있고, js 로 구현 된 내용들을 수행하는데 편하게 사용할 수 있어 강점이 있다.

https://github.com/agenda/agenda

배치

기본적으로 배치를 만들어 본 경험으로 작성한다.

배치의 의미

배치의 기본적인 개념은 대용량 처리를 한번에 하기 위한 작업이다.

한 번에 큰 작업을 수행하는 것을 배치라고 한다

프로그램의 한계

우리는 프로그램의 한계에 대해 알고 있다.
프로그램은, cpu register, 메모리, HDD 등 저장 장소에 내가 수행하고자 하는 데이터를 저장한다.

overflow

버퍼 오버플로 또는 버퍼 오버런은 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점이다.

나누어 처리한다

자원을 한 곳 에서만 소비하지 않기 위해서 사용하는 기법으로 여러가지 방식이 있다.

배치 뿐 아니라 API 에서도 자주 사용하는 DB Pagination, 데이터를 한꺼번에 웹 메모리에 올리지 않기 위한 게시판의 page, 혹은 컴퓨터 클러스터링 또한 그 방식 중 하나로 본다.

DB Pagination

한꺼번에 가져오는 네트워크의 양을 줄여 Latency를 줄이고, 메모리상에 올린 작업의 일체가 끝나고 나면 해당 데이터를 버려 메모리를 줄일 수 있다.

게시판의 page

사용자가 보는 화면은 제한적, 모든 데이터를 메모리에 올려서 보고 있을 필요가 없다.
throughput 이 동일할 때, 데이터량이 많으면 많을 수록 Latency 가 증가하므로, 보는 화면상에 있는 데이터만 실제 있는 데이터를 가져온다.

컴퓨터 클러스터링

컴퓨터를 클러스터링 한다는 것은 동일한 작업의 수행을 여러 컴퓨터가 나누어서 진행한다는 것을 의미한다.

위 이미지는 Web Service 에서 부하를 분산하고, 필요한 데이터를 한곳에만 요청하는 부분을 줄이기 위한 기본적인 구조다.
Network Load Balancer는 특정 알고리즘을 통해 여유가 있는 컴퓨터에 요청을 보내게 되고, 해당 자원을 좀더 효율적이고, 빠르게 수행이 가능하도록 한다.

길게 설명한 이유

배치는 기본적으로 데이터 량이 대량일 때 사용한다고 얘기가 되었으므로, 데이터량이 대량이면, 이를 다 메모리상에 올린다는 것은 굉장히 비효율이고, 프로그램이 뻗어버릴 수 있다.

배치를 만들 때 고려해야 하는 사항을 위해서이다.

  • 데이터를 가공하는 데이터를 어떻게 원자성 있게 만들어 낼 것 인가?
  • 어떻게 저장하고 관리할 것인가?

위 2가지를 생각하면서 배치를 이용해야하는 데이터를 설계한다면, 좀 더 정확한 데이터를 추출해 낼 수 있을것이다.

k8s 를 사용한다면 job 에서 제공하는 입력 데이터를 나누어 받을 수 있는 설정을 사용하거나,
혹은 Spring Batch 를 사용한다면 Spring Batch 의 핵심인 chunk 라는 개념을 익히고 진행한다면 더욱 좋은 결과를 만들 수 있을 것으로 생각된다.

profile
매일 발전하는 Backend 개발자

0개의 댓글