Batch Server 구성하기
로그에 쌓여있는 대화 데이터들을 일정한 주기마다 읽어(아마 InstanceID 기준)와 요약하여 (프롬프트 이용) Redis나 NAS와 같은 저장소에 저장할 수 있도록 배치 서버를 구성하는데 필요한 Batch Server 기술 스택을 조사한다.
배치 애플리케이션이란?
배치(Batch)는 일괄처리이다.
매일 전날의 데이터를 집계 해야한다고 가정할 때처럼 큰 데이터를 읽고, 가공하고, 저장한다면 해당 서버는 순식간에 CPU, I/O 등의 자원을 다 써버려서 다른 Request를 처리하지 못하게 됨.
또한 이런 집계 기능은 자주 사용되지 않음, 그러므로 이를 위해 API를 구성하는 것은 낭비임.
추가로 데이터가 너무 많아서 처리중에 실패가 난다면, 5만번째에서 실패했다면, 5만 1번째부터 다시 실행할 수 있다면 좋음
또, 같은 파라미터로 같은 함수를 실행할 경우 이미 실행한 적 있어 실패하는 기능을 지원하면 좋음
이럴때 단발성으로 대용량의 데이터를 처리하는 애플리케이션이 배치 애플리케이션.
Batch Server 구성 기술스택
Java Spring + CronJob
- 프로젝트 구성
Java: 데이터를 읽고 가공하는 로직을 작성.
Spring: Spring Boot를 사용하여 간편하게 프로젝트를 구성하고, 배치 작업을 위한 스케줄링.
Redis: Java에서 Redis와 상호작용하기 위해 Redis 클라이언트를 사용.
CronJob: 주기적으로 Java 프로그램을 실행하기 위한 크론 작업을 설정.
- Redis 클라이언트
Java에서 Redis에 연결하기 위해 다음과 같은 Redis 클라이언트를 사용:
Jedis: 간단하게 사용 가능한 Redis 클라이언트.
Lettuce: 비동기 작업과 고성능을 요구할 때 사용하는 클라이언트.
- CronJob 설정
먼저 리눅스의 crontab에 Java 프로그램을 실행하도록 설정. 이를 위해 .jar 파일을 실행하는 명령어를 설정.
예를 들어, Java 프로젝트를 Maven이나 Gradle로 빌드한 후 log_to_redis.jar 파일을 얻었다고 가정하면, 다음과 같이 설정 가능:
1 | crontab -e |
그리고 crontab에 다음과 같이 입력하여 매일 특정 시간마다 Java 애플리케이션을 실행하도록 설정
1 | 0 * * * * java -jar /path/to/log_to_redis.jar |
위 명령은 매일 정각에 log_to_redis.jar를 실행
- Java 코드 작성
로그 파일에서 데이터를 읽고 편집 후 Redis에 저장하는 로직을 작성.
로그 파일 읽기: BufferedReader 등을 이용하여 로그 파일을 읽음.
데이터 편집: 데이터를 가공하거나 필요한 형식으로 변환.
Redis 저장: Jedis나 Lettuce를 이용하여 Redis에 데이터를 저장.
예시코드
1 | import redis.clients.jedis.Jedis; |
- CronJob과 Java 연동
CronJob은 위에서 설정한 것처럼 crontab에서 특정 시간마다 Java 프로그램을 실행하도록 설정됨.
주기적인 실행은 cron이 관리하고, 로그를 처리하는 부분은 Java 코드가 처리.
CronJob이란
특정시간 또는 일정한 주기마다 작업을 자동으로 실행하기 위해 사용하는 유닉스 계열 시스템의 스케줄러
주요 개념
cron : 유닉스 기반 시스템에서 주기적으로 명령을 실행하는 데 사용하는 데몬(백그라운드 프로세스)
crontab : cron 작업을 설정하고 관리하는 테이블 파일 또는 유틸리티로, 사용자가 명령어를 입력해 작업을 정의
cronjob : 주기적으로 실행되는 프로그램들
Command
sudo systemctl enable cron : cron을 활성화 시킴.
crontab -l : 현재 등록되어 있는 cron job을 보여줌
crontab -e : cron job을 등록할 수 있음. 첫 실행 시에 editor(nano, vim 등)를 선택하는 선택지가 출력
crontab -r : cron job을 지울 수 있음
cronjob 설정 방법
cron job 등록 방법에 대해서.
1 | minute | hour | dom(day of month) | month | dow(day of week) | command |
순서는 이렇게 된다.
command 같은 것들은 “cd ~/my_project && bash run.sh” 이렇게도 가능하고, 단순하게 bash run.sh 하나만 작성해도 괜찮다.
예시
crontab -e 로 crontab 편집기를 연다.
0 5 * * “sudo systemctl restart mongod” 를 문서의 맨 아래에 삽입한다.
매월/매일 05:00am에 MongoDB가 재시작된다.
Spring Batch(Java)
Spring Batch는 대용량 데이터를 처리하기에 적합하며, 주기적으로 실행되는 배치 작업을 쉽게 관리할 수 있다.
- 프로젝트 설정
Spring Batch 프로젝트를 설정하려면 Spring Initializr 또는 Maven/Gradle을 사용하여 기본 프로젝트를 구성한다.
Redis와 Spring Batch를 사용하기 위해 다음 의존성을 추가한다.
Gradle 의존성 예시:
1 | dependencies { |
- Spring Batch 구성
Spring Batch는 Job, Step, Reader, Processor, Writer 등으로 구성됩니다. 로그 파일에서 데이터를 읽고, 가공하고, Redis에 저장하기 위해 각각의 구성 요소를 설정.
주요 구성:
Job: 배치 작업의 전체적인 단위.
Step: Job을 이루는 각각의 처리 단계.
ItemReader: 데이터를 읽어오는 역할.
ItemProcessor: 데이터를 가공하는 역할.
ItemWriter: 가공된 데이터를 Redis에 저장하는 역할.
- 로그 파일 읽기 (ItemReader)
로그 파일을 읽기 위한 FlatFileItemReader를 설정합니다. 이 리더는 CSV 또는 텍스트 파일의 각 줄을 읽는다.
1 |
|
- 로그 데이터 가공 (ItemProcessor)
로그 데이터를 가공하는 ItemProcessor를 작성한다. 이 프로세서는 입력된 로그 데이터를 가공하거나 변환한다.
1 |
|
- Spring Batch Job 및 Step 구성
이제 Reader, Processor, Writer를 사용하여 Job과 Step을 정의한다. Step은 로그 데이터를 읽고 가공한 후 Redis에 저장하는 단위 작업
1 |
|
- 스케줄링 설정
Spring Batch를 일정 시간마다 실행하려면 Spring의 @EnableScheduling과 @Scheduled를 사용하여 스케줄링을 설정할 수 있다.
1 |
|
위의 코드는 크론 표현식을 사용하여 배치 작업을 매 시간마다 실행하게 설정한 예이다. @Scheduled의 크론 표현식을 조정하여 원하는 주기에 맞게 실행할 수 있다.
- Redis 설정
Spring Boot의 application.yml 파일을 통해 Redis 설정을 추가한다.
1 | spring: |
또는 Jedis를 직접 사용하려면 Jedis 인스턴스를 빈으로 등록해 사용할 수 있다.
1 |
|
전체 흐름:
Spring Batch가 일정 시간마다 Job을 실행힌다.
ItemReader가 로그 파일에서 데이터를 읽어온다.
ItemProcessor가 데이터를 가공한다.
ItemWriter가 Redis에 데이터를 저장한다.
Batch Server 구성하기
install_url
to use ShareThis. Please set it in _config.yml
.