전체 글 32

[PL/SQL] 프로시저란? 프로시저의 장/단점

해당 글은 Oracle의 공식 Document를 보고 작성하였습니다. 경로 프로시저란? 프로시저는 SQL을 확장하여 고성능의 트랜잭션 처리 언어이다. 즉 트랜잭션의 특징인 원자성, 일관성, 독립성, 영속성을 가지며 데이터의 상태를 변화시키기 위해 일련의 절차를 작성한 프로그램이다. 더 쉽게 정리하자면 데이터베이스 내부에 SQL명령문(INSERT, SELECT, DELETE, UPDATE)의 수행 로직을 하나의 함수처럼 실행하기 위해 RDBMS에 저장한 쿼리의 집합이다. 프로시저의 장점 SQL과 유사하다. 프로시저는 모든 SQL 데이터의 조작, 커서제어, 트랜잭션 제어, SQL 함수 등을 사용할 수 있다. 프로시저는 SQL의 데이터 유형을 사용하여 SQL과 형변환 등이 필요 없다. 프로시저는 정적 SQL과..

[Django] Django(장고)란?

Django(장고)는 풀스택 프레임워크다. 장고를 사용하면 웹 어플리케이션의 개념부터 실행까지 몇 시간 만에 완료할 수 있으며 웹 개발의 번거로움 대부분을 처리하기 때문에 어플리케이션 작성에 집중할 수 있다. 수십가지 추가 기능(사용자 인증, 콘텐츠 관리, 사이트 맵, RSS, ORM...) 등의 작업등을 수행할 수 있다. 또한 보안을 중요하게 생각하며 SQL injection, site scripting 등의 일반적인 보안 실수를 피할 수 있도록 도와준다. [장고의 구성] URLs : 단일 함수를 통해 모든 URL 요청을 처리하는 것이 가능하지만, 분리된 뷰 함수를 작성하는 것이 각각의 리소스를 유지보수하기 훨씬 쉽다. URL 매퍼는 요청 URL을 기준으로 HTTP 요청을 적절한 View로 보내주기 위..

백엔드/Django 2023.10.27

[Airflow] 기반의 데이터 파이프라인(9) - Executor

Executor는 Task 인스턴스들을 실행하는 메커니즘입니다. 공통 API를 가지고 있으며 요구되는 사항에 맞게 Executor를 변경하여 설치할 수 있습니다. 다만 Airflow는 한 번에 하나의 Executor를 구성할 수 있으며, airflow.cfg에서 옵션을 변경할 수 있습니다. Executor Executor는 크게 두 가지로 분류할 수 있다. Local Executors 스케줄로 프로세스 내부에서 작업을 실행한다. dag.test() Debugging Airflow DAGs on the command line SequentialExecutor : Airflow 초기 설치 시 default값 다중 연결을 지원하지 않기 때문에 sqllite만 유일하게 지원한다. 한 번에 하나의 작업 인스턴스만..

[Hive] 하이브 Query 주의 사항

업무상 데이터분석가분들과 업무를 자주 하게 되는데 아무래도 주력이 Python이신 분들이 많다 보니 쿼리 사용에 미숙한 채로 Workflow를 개발하여 3~4시간 동안 서버의 cpu, memory를 전부 잡아먹는 배치를 만드는 경우가 잦아 쿼리 튜닝 중 자주 발생하는 문제점 몇 가지 주의사항을 공유하겠습니다. 1. 조건절 내부 사용자 정의함수(UDF) 제거 Hive 버전마다 상이하긴 하지만 UDF를 조건절에 사용하는 경우 optimizer가 제대로 된 실행계획을 작성하지 못하는 경우가 발생합니다. 따라서 UDF를 최대한 피하는 방향으로 쿼리를 작성하여야 합니다. 2. Partition column의 조회 Partition column을 substring 등으로 변경하지 않는다. Partition의 경우 ..

[Hive]하이브 관련 튜닝 옵션 정리

Hive 관련 업무를 진행하면서 지속적으로 찾게 되는 Hive관련 옵션들을 정리하였습니다. 아래 순서는 튜닝순서와는 전혀 관련이 없으며 Hive 배치들을 튜닝하며 사용한 옵션들을 메모해 놓은 것을 정리하였습니다. 혹시 틀린부분이 있다면 댓글로 정정부탁드립니다. 감사합니다. Tez SET hive.execution.engine=tez; Hive query의 실행 엔진을 tez엔진으로 세팅한다. mr엔진 혹은 spark로도 변경할 수 있으며 각각 옵션은 mr, spark이다. Hive 2.x 버전부터 default는 tez SET tez.am.container.reuse.enabled=true; tez 엔진이 동일한 컨테이너를 재사용하여 여러 쿼리를 실행할지 여부를 결정 매개변수를 활성화 하면 모든 쿼리에 ..

[Airflow] 기반의 데이터 파이프라인(8) - 워크플로우 트리거

워크플로우 트리거 : 미리 정의된 시간에 워크플로우를 시작하지 않고 특정 Task의 수행으로 시작해야 하는 경우 사용 외부 이벤트의 결과 공유 드라이브 등에 파일 업로드 변경된 코드가 repository에 푸시된 경우 Hive 테이블에 파티션이 생성된 경우 등등.. 위와 같은 사례의 일반적인 경우는 새로운 데이터가 도착하는 경우라고 볼 수 있다. 1. 센서(Sensor) 워크플로우 생성 시 특정 Event를 기다려야 하는 경우가 존재한다. 이러한 경우 Sensor를 사용할 수 있습니다. Sensor는 BashOperator, PythonOperator등과 같은 operator로써 해당하는 Event가 발생하는 것을 기다리도록 설계되어 있어 시간 혹은 파일 등의 외부 Event를 기다린 이후 수행하여 다운..

[Airflow] 기반의 데이터 파이프라인(7) - 태스크 간 데이터 공유

안녕하세요 아래 내용을 정리하다 보니 내용이 너무 빈약해 조금 더 공부하고 내용을 추가할 예정입니다. 1. XCom XCom(cross-communications) : 작업이 완전히 격리되어 있고 완전히 다른 서버에서 실행될 수 있기 때문에 작업이 서로 통신할 수 있도록 한다. XCom은 key와 task_id, dag_id에 의해 식별된다. XCom은 xcom_push, xcom_pull 메소드를 사용하여 값을 주고받는다. # push_task의 instance에서 xcom_push를 통해 XCom 값을 게시한다. push_instance.xcom_push(key="xcom unique key", value='보낼값') # pull_task의 instance에서 xcom_pull을 통해 XCom 값을 ..

[Airflow] 기반의 데이터 파이프라인(6) - 태스크 간 의존성 및 브랜치

의존성 1. 선형 의존성 Airflow에서 선형 의존성을 가진 Task는 이전 Task의 결과가 다음 Task의 입력값으로 사용되기 때문에, 다음 태스크로 이동하기 전에 각 태스크가 완료되어야 한다. Airflow에서는 >> 연산지 혹은 second_stream >> third_stream # 유형 2 # 유형 1과 마찬가지로 first_stream ~ third_stream까지 차례로 수행된다. # 후행Task.set_upstream(선행Task) second_stream.set_upstream(first_stream) third_stream.set_upstream(second_stream) # 유형 3 # set_downstream # 유형 1과 마찬가지로 first_stream ~ third_str..

[Airflow] 기반의 데이터 파이프라인(5) - 백필(BackFilling)

Workflow를 개발, 운영해본 입장이라면 과거데이터 재소급 등의 이유로 과거 시점의 데이터 처리를 진행할 필요가 있다는 것을 알고 있을 것이다. Airflow의 BackFilling은 이를 위해 존재한다. dag=DAG( dag_id="backfill_examples", schedule_interval="@daily", # 매일 자정에 실행되도록 DAG를 스케줄하는 매크로 start_date=dt.datetime(2023.1.1), # 2023.1.1 부터 DAG 실행 스케줄을 시작할 날짜/시간 end_date=dt.datetime(2023.12.31), # 2023.12.31 까지 DAG가 실행된다. catchup=True, # ...생략... ) catchup=True 인 경우 현재 시점보다 과거..

[Airflow] 기반의 데이터 파이프라인(4) - Airflow의 실행 날짜 이해

Airflow는 시작날짜, 스케줄 간격, 종료날짜의 세 가지 매개변수를 사용하여 DAG를 실행하는 시점을 제어할 수 있다. Airflow는 스케줄의 간격이 지난 시점에 DAG를 트리거 한다. 따라서 start_date 기준 schedule_interval이 도래한 가장 첫 시점에 DAG가 실행된다고 보면 된다. (실무에서 사용해보지 못했지만 오픈 카톡방인 '한국 데이터 엔지니어 모임' 에서 종종 물어보는 질문이다.) 책의 예시에서는 2019-01-03일의 데이터를 2019-01-04의 정각에 수집하는 예를 보여준다. 일반적인 스케줄러라면 시작일을 2019-01-04로 해야 하겠지만 Airflow에서의 start_date는 예약 간격의 실행 날짜 이기 때문에 start_date는 2019-01-03으로 주..