![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bG8WxL/btsLZ5IrvP1/7n4rK04VXUsX4cWx06XJi0/img.png)
airflow 에서 logical_date 와 schedule 을 고려하면 월배치를 돌리려면 말일 기준의 logical_date 기준으로 배치가 돌아야 한다. 하지만 다 알고 있는것처럼 월말은 1월은 31일이요, 2월은 28 혹은 29일, 3월은 31일 등등 이런식이라 처리하기가 어렵다.제대로 처리하려면 Airflow 2.4.x 이상버전에서는 Timetables 을 직접 구현하는게 가장 베스트인걸로 보인다.하지만, 여기서는 AirflowSkipException 과 schedule 의 crontab 표현을 이용해 해결하는 방법을 알려주고자 한다. 쉽게 생각해서 crontab 에서 매월 28,29,30,31 에 스케쥴을 활성화 하고,월말을 계산해서 아닌날은 스케쥴을 넘기는 형태로 해결하는 방법이다. 해결방법..
airflow 2.x 로 올라가면서 ui 에서 타임존을 고려한 처리가 좋아지긴했는데, DAG 를 만들때 logical_date 를 이용해 값을 유도할때 우리가 의도한 값이 안나올때가 있다. 우선 airflow 의 환경변수기반으로 구성했다는 가정으로 타임존을 아래와 같이 구성하고export AIRFLOW__CORE__DEFAULT_TIMEZONE="Asia/Seoul"export AIRFLOW__WEBSERVER__DEFAULT_UI_TIMEZONE="Asia/Seoul" DAG 선언할때도 start_date 값에 타임존까지 잘 지정했다면 반은 성공한것이다. 근데 , 2024-01-02 00:00 가 되면 2024-01-01 00:00 의 logical_date 가 바인딩될것으로 기대되는데 이상하게{{ l..
airlfow 에서 한국시간으로 사용하기위해서 은근히 번거로운일이 많다, start_date 에 타임존을 지정하고, 설정에 타임존을 지정하더라도 의도한 값을 뽑아내려면 logical_date 를 타임존에 맞춰 변환후 사용해야 제대로 값을 추출할 수 있는 경우가 많다.근데 이걸 매번 DAG 코드에 넣는건 비효율적이기 때문에, Plugin 에 jinja template 으로 커스텀 필터를 추가해서 사용하는 방법을 제안한다. 커스텀 필터 추가하기참고로 airflow 2.9.x , 2.10.x 버전에서 동작 테스트 했었고, plugins 폴더에 넣어주면 사용가능하다.아래와 같이 커스텀 필터를 추가하면 jinja template 에서 쉽게 변환이 가능하다.from airflow.plugins_manager imp..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bb67NJ/btsLZfELGX7/yDPl8YoCAmGiIAIeUSyUm1/img.png)
월별 지표를 만들기위해 말일에 스케쥴을 어떻게 할지 고민하다가, crontab 표현으로 28~31 활성화 하고, 체크로직을 넣어 실행을 제한하는식으로 접근을 했는데 마지막날이 스케쥴 안되는 문제가 발생했다. 예를 들어, 아래와 같이 스케쥴을 걸면 10/28 , 10/29, 10/30, 10/31 이 스케쥴이 활성화 되면서 실행되길 기대했는데...31일 스케쥴이 활성화가 안되는 상황이다.with DAG( dag_id="sample_dag", start_date=datetime.datetime(2024, 10, 1, tzinfo=pendulum.timezone("Asia/Seoul")), schedule_interval="0 0 28-31 * *", # 매월 말일 실행 max_act..
duckdb 에서는 Parquet 은 지원하는데, orc 는 지원하지 않는다. 그리고 이슈를 찾아보면 별로 지원할 생각도 없는거 같다.그래서 cli 툴로는 접근하는 제한이 있는데, apache arrow 를 경유하면 다양한 포맷을 읽는것이 가능하다.여기서는 pyarrow 를 이용해서 접근하는 예제를 알려주도록 하겠다.당연하지만, pip install pyarrow 가 선행되어야 한다. 해결방법다음과 같이 pyarrow.orc 를 이용해서 orc 파일을 읽어내는게 가능하다.아래 예제는 hdfs://my/user/user/export/sample/* 파일이 orc 포맷으로 저장되어있을때 읽는 예제이다. hadoop 에 저장된 orc 파일을 읽어내는 샘플코드를 정리했다.import pyarrow as paim..
텍스트 포맷으로 데이터를 다룰때 가장편하게 사용하는게 우리팀은 탭을 구분자로 만든 파일을 사용한다.그리고 일반적으로 이걸 읽어들이는 모듈은 csv 관련 모듈을 써서 사용하게 된다. 이를 케이스별로 어떻게 쓰는지 알려주고자 한다. 1. 헤더라인 있음 + 구분자 정의맨 윗줄에 필드명이 정의된 경우를 의미한다. 이때는 특별히 해줄것은 없다.단, 구분자의 변경이 필요하다면, 다음과 같이 parse_options 을 잘 정의해줘야한다.나는 chatGPT 가 과거 버전의 해결법을 알려준건지 이것때문에 삽질을 꽤 했다.import pyarrow.fs as fsimport pyarrow.csv as csvimport duckdbhdfs = fs.HadoopFileSystem(host='hdfs://my', user='..
우선 duckdb 에서 s3 는 기본지원이 되는데, hdfs 는 기본지원이 안된다.jupyter 에서 duckdb 를 이용해서 간단한 필터링과 정렬을 sql 기반으로 다룰수 있어서 유용한데 hdfs 의 파일을 분석할때 고민이 되는데, 이때는 pyarrow 를 이용하여 연동하면 대부분 해결된다. (orc 포맷도 pyarrow 로 해결가능함) 해결방법당연하지만 pyarrow 와 duckdb 라이브러리는 깔려있어야한다.그리고 여기서는 kerberos 인증을 keytab파일을 통해 hadoop 연결을 한다고 가정하겠다.우선 다음과 같이 keytab 인증을 한다고 가정한다. 주피터에서는 이런 명령을 실행할때 맨앞에 ! 를 넣고 라인에서 실행하는것도 가능하다.kinit -kt /home1/user/myuser.ke..
python 3.10 환경에 분석을 위한 다양한 라이브러리를 구성하다보니 호환성 문제로 아래와 같은 문제가 밸생했다. 1. 오류내용크게보면 여러 라이브러리에서 아래와 같은 문제가 발생했다. 사실 처음에는 다양한 라이브러리를 한번에 설치해서 원인을 찾기 힘들었는데 하나식 역추적하며 결국 해결방법을 찾았다. 1.1 numpy 버전 문제 오류A module that was compiled using NumPy 1.x cannot be run inNumPy 2.0.2 as it may crash. To support both 1.x and 2.xversions of NumPy, modules must be compiled with NumPy 2.0.Some module may need to rebuild ins..