
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 에서는 단순히 특정 스케쥴이 실행..
하둡 데이터를 다루다보면, 종종 다른팀의 하둡클러스터의 데이터를 복제해와야 할 경우가 존재한다. 이때, 네임노드와 호스트(혹은 ip) 와 포트를 이용해서 연결하는게 가능한데, 문제는 active, stand by 서버가 변경되면 연결이 안되는 상황이 발생되는 문제가 존재한다. 이런 문제를 해결하려면 nameserivce 정보를 hdfs-site.xml 에 추가해서 사용하는게 좋다. 근데, 1회성 작업이거나 연결가능여부를 테스트하기위해서 설정을 변경해보는건 꽤 번거로운 작업이 된다. 이럴때 사용할 수 있는 방법은 hadoop 명령어를 날릴때 -D 옵션을 이용해 해당 정보를 인자값으로 직접 넣어주는것이다. 2021.11.18 - [데이터처리/Hadoop] - [팁] 다른 hdfs 클러스터의 nameservi..
external table 로 테이블을 만들어 관리할때, table 이름을 rename 해도, 폴더가 테이블명에 맞춰서 수정되지 않는다. 그렇다고 테이블의 location 속성의 경로를 수정해도, 파티션 테이블인 경우 인지가 안되는 문제가 존재한다. location 까지 세트로 변경이 안되면, hdfs 에서 직접 데이터를 바라보는 사람은 테이블명과 다르면 혼란이 올 수 있기 때문에 완벽하게 테이블명과 location 의 폴더명도 세트로 변경하고 싶은 경우를 의미한다. 문제예시 예를 들면 아래와 같다. location 폴더를 백업폴더로 이동하고, table 의 location 을 이동시킨 폴더로 변경하더라도 바로 조회되지 않는다. 테이블이 아닌 파티션별 location 을 변경해야 한다. 문제는 이런 파티..
hive 에서는 Array 형태의 데이터를 풀어서 ROW 로 풀어내는게 가능하다. 이때 사용하는문법이 explode 이다. posexplode 는 무엇이냐? 인덱스번호까지 알아야할 경우가 종종 있는데 이때는 posexplode 를 쓰면 된다. 이해를 돕기위해 아래와 같은 데이터가 존재한다고 가정하자. (v_sample) beeline> select * from v_sample; +------------------+-------------------------+ | v_sample.tags | v_sample.title | +------------------+-------------------------+ | ["fun","happy"] | hello! my name is haha | | [] | test..