새소식

반응형
Database/MY SQL

MySQL을 이용하여 Airflow(Crontab) 스케줄 시간 parsing

  • -
반응형

Airflow의 스케줄 시간을 지표로 표현할 일이 있어서 Airflow의 스케줄 시간을 mysql을 통해서 Datetime 형태로 parsing 해야 하는 이슈가 있었습니다. 여기저기 찾아봤지만 정상적으로 안되어서 직접 Query를 작성하였습니다.

 

우선 한 가지 아쉬운 것은 모든 스케줄 시간을 parsing 하지는 못 하였습니다.

스케줄 시간에서 매일 발생하는 스케줄 시간만 표현하였고, 나머지 요일별, 월별, 주별 이런 내용은 parsing 하지 못하였습니다. 차후에 이 부분도 추가하여 글을 작성하도록 하겠습니다. 

 

우선 저희 쪽에서 사용하는 부분은 일별 스케줄이라서, 이 부분만 작성 한 점 죄송합니다.

 

 

원본 데이터 

원본 데이터의 경우 다음과 같은 형태로 있습니다.

여기서 @once도 제외하였습니다. (단 한 번만 실행되므로 필요 없다.)

Airflow 스케줄 시간 원본

Airflow의 스케줄 시간이 이런 식으로 들어가 있는데, 이를 지표로 표현하려면 Datetime 형태로 만들어야 했습니다. 

 

 

결과 데이터

결과는 다음과 같이 표현됩니다.

옆에 Value의 경우 해당 시간에 실행되는 Dag의 개수라고 보시면 됩니다.

Airflow 스케줄 시간 결과

 

Query 살펴보기

Query는 다소 복잡해 보일 수 있습니다.

하지만 하나씩 살펴보면 그렇게 어렵지 않습니다.

 

SELECT CAST(CONCAT(CAST(DATE_FORMAT(NOW(),'%Y-%m-%d')AS CHAR),':',hour_value,':',Min_value) AS DATETIME) AS time
  ,COUNT(*) AS value
FROM 
(
SELECT dag_id
  ,SUBSTRING_INDEX(SUBSTRING_INDEX(Hour_value,',',nt.n),',',-1) AS hour_value
  ,Min_value
  ,schedule_interval 
FROM 
(
SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL
SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL 
SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL 
SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24
 
)AS nt
INNER JOIN 
(
SELECT dag_id
  ,CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE (schedule_interval,'"',''),' ',2),' ',-1= '*' 
   THEN '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23'
   ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE (schedule_interval,'"',''),' ',2),' ',-1) END 
   AS Hour_value
  ,SUBSTRING_INDEX(REPLACE (schedule_interval,'"',''),' ',1)AS Min_value
  ,schedule_interval
FROM dag
WHERE is_active = 1 AND schedule_interval NOT IN ('"@once"') AND is_paused = 0
AND schedule_interval LIKE '%"'
AND schedule_interval LIKE '%* * *"'
)AS ot
ON CHAR_LENGTH(ot.Hour_value) -CHAR_LENGTH(REPLACE(ot.Hour_value, ','''))>=nt.n-1
)AS T1
GROUP BY CAST(CONCAT(CAST(DATE_FORMAT(NOW(),'%Y-%m-%d')AS CHAR),':',hour_value,':',Min_value) AS DATETIME)
ORDER BY CAST(CONCAT(CAST(DATE_FORMAT(NOW(),'%Y-%m-%d')AS CHAR),':',hour_value,':',Min_value) AS DATETIME) ASC
cs

 

위에 보시면 칼럼명이 time , value인데요.

이는 지표에서 표현할 때 필요해서 칼럼명을 위와 같이 만들었습니다.

 

지표의 경우 Grafana를 사용하는데요. Grafana에서는 time , value로 지정해야지 인식하기 때문에 위와 같이 표현하였습니다.

grafana 지표

 

X축이 시간 Y축이 개수로 표현하여 한눈에 해당 시간에 몇 개의 Dag이 동작하는지 볼 수 있습니다.

이렇게 하여, 너무 많은 시간에 겹쳐 있으면 시간을 다르게 주어 부하를 줄 일 수 있습니다.

 

감사합니다.

반응형

'Database > MY SQL' 카테고리의 다른 글

MySQL 설치 시 libaio 관련 Error  (0) 2016.09.12
MySQL 5.5_유저등록  (0) 2015.04.06
MySQL_백업 스케줄러 확인  (0) 2015.04.06
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.