최근에 팀 airflow 프로젝트를 컨테이너 기반으로 전환하면서 런타임에 디버깅하는 환경을 별도로 구축했어야했는데 Remote – containers 플러그인을 이용하면 운영환경에서 크게 변경없이 디버깅할 수 있어서 사용방법을 간단히 정리해본다. 이 확장을 이용하면 디버깅 용으로 별도 로컬 환경을 구축하지 않아도 컨테이너로 관리하는 서비스들을 운영 이미지 그대로 디버깅할 수 있는데, 아직 preview 버전이긴 하지만 사내에서 사용하고 있는 airflow 이미지 기준으로 […]
Airflow 2.x HA 구성 (3 node docker 환경)
airflow 2.0 에서 공식적(?)으로 HA 를 지원한다. 1.x 버전에서는 scheduler 프로세스를 동시에 여러개 구동하면 작업이 중복 실행될 수 있는 위험이 있었서 무조건 single 로 운영해야했고 이 때문에 가용성을 보장할 수 없었는데 2.x 에서부터는 row-level locking 을 이용해서 multiple scheduler 이용이 가능하도록 개선이 됐다. (대신 SKIP LOCKED 또는 NOWAIT 구문을 지원하는 mysql8.0 이상을 써야하는 제약조건이 있다.) […]
[Airflow] execution_date 이해하기
Airflow DAG는 Jinja Macro 로 구현돼 있는, 사전 정의된 값들을 가져다가 사용함으로써 좀 더 다이나믹하게 구현할 수 있다. Airflow Macros reference 그 중에서도 execution_date 를 가장 자주 사용하게 되는데 이 매크로는 DagRun, TaskInstance 가 instantiated 될 때 값이 정해지면서 특정 인스턴스에 정해진 날짜 값을 갖게 해주기 때문에 추후 재작업 등을 하는데 용이하게 쓰인다. 그런데 이 […]
[Airflow] RBAC
RBAC; Role-Based Access Control 참고: https://airflow.apache.org/docs/stable/security.html#rbac-ui-security Airflow 1.10.9 버전 이후 Web UI가 Flask-Admin에서 Flask-Appbuilder 기반으로 변경되면서 RBAC를 활성화할 수 있다. 다음과 같이 다섯개의 Role 이 정의돼 있고 이 외에도 커스텀 롤을 생성할 수 있다. Admin Op User Viewer Public 각 Role들은 아래와 같은 형태의 권한들의 집합인데 세부 권한들은 다음과 같은 형태로 정의 돼 있어서 […]
[Airflow] 1.10.10 싱글 설치
rbac 기능을 이용하면 DAG-level Access Control 이 가능하다고 한다. 새롭게 추가된 tag 기능에 더해져서 tag-level 권한 관리도 됐으면 좋았겠지만.. rbac 기능을 이용하면 기본적 제공되는 롤 뿐만 아니라 Customized role 을 통해 가능해질 사용자 권한 관리를 기대하며 최신 1.10.10 버전을 설치해본다. 기존에 LDAP 연동해서 사용하던 Airflow 시스템을 업그레이드 해서 사용할 수 있을지 확인해보기 위해 OpenLDAP 환경을 […]
라즈베리 파이 4 * APM 홈서버 구축하기 4 – mysql 소스 설치
성공한 케이스를 그대로 적으면 짧은 내용이지만 혹시나 나중에 다시 쓸모가 있을지도 모르는 삽질 과정을 기록하기 위해서 mysql 설치 과정만 별도로 정리한다. cannot execute binary file: Exec format error 일단, 기존에 x86 환경에서 정리해놓은 스크립트로 mysql 바이너리를 그냥 다운 받아 실행했는데 위 에러가 발생해서 잠깐 동안 고민에 빠졌었다. 몇번이고 그냥 실행해보다가 보니 바이너리(mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz)에 x86_64 라고 적힌게 […]
[impala] from_utc_timestamp 타임존 처리
HUE는 타임존이 UTC 로 하드코드 돼 있어서 설정을 통해 기본 타임존을 바꿔줄 수는 없다고 한다. impala 3.1 버전 부터는 TIMEZONE 설정이 생겼다고는 하는데 최신 HUE 에서도 설정이 가능할 지는 모르겠다. 테스트 환경인 v2.10.0-cdh5.13.0 버전에서는 impala 자체적으로도 타임존을 변경할 수 없다. 어쨋든 from_utc_timestamp 함수를 이용해 쿼리 레벨에서 타임존 처리가 가능한데, 타임존 코드를 'KST'로 잘못 넣어서 오랫동안 […]
[Impala] ALL_TAB_COLUMNS for Impala (Hive)
현재 업무에서는 임팔라를 주력 데이터베이스로 활용하고 있다. 오라클 엑사 DW에서 하둡으로 ETL 한 뒤, 운영 DW에는 하기 부담스러운 헤비한 쿼리를 하는데에 사용한다. 원천이 오라클 데이터베이스인 탓에 소스 데이터베이스인 오라클과 주기적으로 스키마를 맞춰주어야 하는데, 오라클에는 ALL_TABLES, ALL_TAB_COLUMNS 와 같은 시스템 카탈로그가 있어, 테이블 스키마 관련 필요 정보를 쿼리해보기 좋았는데 임팔라에는 이런 시스템 카탈로그가 기본 제공되고 있지 […]
[Impala] Error parsing row 현상
impala 에서 parquet 테이블을 보정할 일이 있어서, CTAS로 일부분만 백업해두고 혹시 문제가 있는지 쿼리를 해봤는데 다음과 같은 에러가 발생했다. Error converting column: 126 to DOUBLE Error parsing row: file: hdfs://cluster01/user/hive/warehouse/imp.db/tab_dpcn_info_l/a7422143a7852306-8b0cbcb600000005-1957752130_data.0, before offset: 629145600 에러 메시지 자체는 126번 컬럼을 DOUBLE 로 형변환 하는데 실패했고 해당 문제가 발생한 데이터가 위 hdfs://.. 경로에, offset 번째 줄에 있다는 내용인데, […]
[impala] rpad와 아스키 코드를 이용한 인덱스 컬럼 범위 검색
rpad 문법은 rpad(A,N,B) 와 같이 썼을 때, 전체 문자열 길이가 N 만큼 되도록 B 문자열을 붙여준다. 때문에 fixed-width 컬럼의 값이나 검색 조건을 만들어내는 데에 사용할 수 있다. 우리 시스템에서는 특정 이벤트를 식별하기 위해서 맨 앞 열 여섯 자리는 해당 이벤트 발생 시간이면서 33 자리인 id를 키로 사용하고 있는데 이 때에 rpad 를 활용하면 유용하다. 특정 […]