hive 쿼리를 다루다보면 array, map 같은 데이터 타입이 존재하는데, 이런 데이터를 다룰때 기본적으로는 explode() 후 처리하는것이 기본적인 접근방식이다. 1. hive 기본 array 함수 별도의 jar 를 추가할 필요없이 hive 에서 기본으로 제공하는 array 관련 함수이며, 관련된 내용은 아래 링크에 정리되어있다. https://cwiki.apache.org/confluence/display/hive/languagemanual+udf 1.1 size 배열의 사이즈를 구하는 함수이다. beeline> select size( array(1,2,2,3) ); +------+ | _c0 | +------+ | 4 | +------+ 1.2 array_contains 배열에 특정한 아이템이..
airflow 의 best practices 글을 읽어보면, Variable.get(키) 형태로 직접 값을 가져오지 않고, 바인딩처리해서 {{var.value.키}} 표현해서 사용하는것을 기본 가이드로 하고 있다. 그 이유는 일단 DAG 를 구성할때 top level code 에 관련된 로직이 존재한다면 DAG 실행뿐 아니라, 로딩되는 시점에서도 그 코드가 동작되기 때문에 성능에 문제가 될 수 있다. https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html#airflow-variables from airflow.models import Variable # Bad example foo_var = Variable.get("foo")..
airflow 로 스케쥴 관리를 하고 있는데, logical_date 가 1초 밀리는 희안한 일이 일어났다. logical_date 의 경우 RUN_ID 값에 시간값이 붙어서 쉽게 인지가 가능한데, 정상적일땐 아래와 같이 RUN_ID 값이 00 으로 딱 떨어졌는데, 어느순간 다음과 같이 RUN_ID 의 값이 00 으로 딱 안떨어지고, 뒷 단위가 조금씩 밀리는 현상이 발견되었다. 구분 정상일때 비정상일때 RUN_ID scheduled__2003-12-07T20:00:00+00:00 scheduled__2003-12-07T21:00:01.0099+00:00 이게 문제가 되는 이유는 ExternalTaskSensor 의 경우는 앞쪽 DAG 의 의존성을 체크할때 logical_date 가 같은 이력을 참조하기 ..
airflow 에서는 code 탭에서 dag 를 구성한 python 파일을 볼 수 있다. 그런데, 이 파일과 dag 값이 다르게 로딩되서 한참 삽질한 경험을 공유하고자 한다. 결론부터 말하면 dag 를 선언한 파일에서 다른 dag 의 파일을 import 하면서 영향을 받았다. 원인 확인방법 airflow 에서는 dag 파일을 읽고, dag bag 에 담아서 관리된다. 문제는 이때 관련된 정보가 잘못 인지되었던 문제였다. dag 로딩이 잘되었는지는 airflow dags list 명령으로 확인이 가능하다. 원래 primitive.py, hour.py, day.py 3개의 파일이 따로 존재하고, dag 도 파일별로 따로 선언했는데 아래와 같이 primitive.py 경로가 아닌 hour.py 로 잘못잡히는걸..
hive 에서는 string, bigint, double, decimal 같은 일반적인 primitive 데이터 타입이외에 map, struct, array 같은 complex type 을 지원한다. 테스트용 쿼리를 만들때 primitive 타입의 경우 쉽게 표현이 가능한데 complext type 을 표현하는 방법은 종종 헛갈릴때가 많아서 간단히 표현법을 다루고자 한다. hive 에서는 기본적으로 "select 값" 형태로 더미 값을 출력해보는게 가능한데, complext type 을 선언하여 보는건 아래와 같이 사용하면 된다. 참고로 array 와 같이 N개의 아이템을 풀어서 분석하려면? explode 를 이용해 분석하면 되는데, 그건 아래 글을 참고하도록 하자. 2023.11.27 - [데이터처리/..
airflow 를 기동할때 편의를 자주쓰는 유틸리티나 스크립트를 PATH 환경변수에 정의하고 데몬을 기동하여 사용하는 경우가 있다. 예를 들어, /home/user/foo/script 라는 경로에 내가 편의를 위해 만든 쉘스크립트를 넣고, PATH 환경변수에 지정해서 잘 쓰고 있었는데, BashOperator 에서 env 옵션을 사용하면 이상하게 해당 스크립트를 찾지 못하는 문제가 발생했다. # export PATH=$PATH:/home/user/foo/script 가 시스템환경변수에는 존재함 ## 이 녀석은 잘 실행되는데 BashOperator( task_id='t1', bash_command='myscript.sh', ) ## 이 녀석에서는 myscript.sh 를 찾지 못한다 BashOperator..
인증이 없는 하둡끼리의 distcp 처리를 할 때는 특별히 해줄일이 없다. 굳이 해줘야한다면 다른 nameservice 를 등록해서 처리하면 namenode 의 active/standby 문제를 해결할 수있다는 정도? 하지만, kerberos 인증이 있는 하둡과 인증이 없는 하둡, 혹은 다른 kerberos 인증서버를 사용하는 클러스터간 데이터 복제는 생각보다 해결방법이 잘 안나오는거 같다. 그래서 케이스별 distcp 사용 사례를 정리하고자 한다. 보통 회사에서 팀별로 하둡클러스터를 각자 운영할 때 이런일을 겪을것이다. 1. 인증없는 하둡간 복제 특별히 해줄게 없다. hadoop 명령에서 distcp 명령을 쓰고, src, target 경로만 적어주면 된다. hadoop distcp hdfs://mys..
과거에는 execution_date 라는 명칭으로 사용하던 개념이 있는데, 이게 execution 이라는 이름이 있어서 실제 실행된 시간의 개념으로 오해하는 문제가 있었다. (특히 crontab 에 익숙한 사람이라면 더더욱더) 이런 문제때문에 Airflow 2.2 부터는 execution_date 를 쓰지 않고, logical_date 를 쓰는 방향으로 변경되었다. (하위호환성을 위해 execution_date 도 쓸수 있긴하지만 쓰지말자 용어가 헛갈리게 하는 주범이다.) https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-39+Richer+scheduler_interval 헛갈리는 개념? 논리적? 실행시간? crontab 에서는 단순히 특정 스케쥴이 실행..