Python 91

[Airflow] Docker를 통한 Airflow 설치

도커를 이용해서 airflow를 설치해보기 전에, 도커에 대해 간략하게 살펴보고 갑시다. 도커가 있기 전에는 가상화서버(Virtual Machine)라는 것을 많이 이용했습니다. 가상화 서버에는 'Hyper Visior' 라는 것이 있는데, Hyper Visor는 물리적인 서버 위에 설치되어 있는 OS가 아닌 그 OS위에 가상화 VM들을 올리고 관리할 수 있도록 해줍니다. 가상화 VM들을 여러개 세팅하고 나면, 이 가상화 VM들은 서로간에 영향을 주지않고 완전히 독립적인 환경에서 구동될 수 있는 장점이 있었습니다. 하지만, 단점이 분명 존재하는데, 바로 '오버헤드'입니다. CPU나 메모리, 디스크 같은 공간을 가상화 서버에다가 명시적으로 할당을 해줘야하기 때문에, 그만큼 호스트 OS가 사용할 수 있는 가..

[Airflow] 에어플로우가 뭘까?

Airflow는 파이썬으로 제작된 도구이자 워크플로우 생성시에도, 파이썬으로 구현해야 합니다 하나의 워크플로우는 DAG이라고 하며, DAG은 Directed Acyclic Graph 의 약자로, 방향성을 가진 그래프지만, 순환하지 않는 그래프를 말합니다. ( 보통 '댁'이라고 말합니다) DAG 안에는 1개 이상의 TASK 가 존재하며, TASK간 선후행 연결은 가능하지만, 순환되지는 않습니다. 보통 워크플로우(dag)는 다음과 같은 단계(task)를 거칩니다. 1. Rest API를 사용한 데이터를 받아서 전처리 2. 데이터를 DB에 넣기 전에 중복을 제거하기 위한 처리 3. 전처리한 데이터를 DB에 삽입 Cron 기반의 스케쥴링을 사용합니다. (리눅스에서 사용하는 기법으로, task들이 실행되어야 하는..

[리트코드/leetcode/python] 238. Product of Array Except Self

이 문제를 푸는 것에 있어서 O(n^2)으로는 바로 풀 수 있겠지만, 결과적으로 시간초과가 나고, follow up을 보면, 공간복잡도를 O(1)로 풀기를 제안하고 있습니다. 처음에 제가 접근한 방식은 배열의 길이를 2배로 늘려서 [1,2,3,4] 가 인풋 배열이라면, [1,2,3,4,1,2,3,4] 로 만든 후, 1을 바라볼 때는, [2,3,4] 의 곱을 2를 바라볼 때는 [3,4,1], 3을 바라볼 때는 [4,1,2], 4를 바라볼 때는 [1,2,3] 을 곱해서 결과 배열을 만드려고 했습니다. 위와 같은 방식으로 문제를 풀 때, 많은 변수들이 필요했고, 파이썬의 for문을 돌면서, index를 다시 뒤로가도록 하는 것에 있어서 어려움을 겪었습니다. 결국, 저는 문제를 O(n)의 방식으로 30분만에 풀..

[리트코드/leetcode/python] 102. Binary Tree Level Order Traversal

이 문제는 지난 PreOrder 문제에 이어 Level Order Traversal 문제입니다. Level Order는 말그대로 레벨 순으로 순회를 하는 것인데, 트리에서는 보통 root 노드부터 레벨 1로 시작되고 아래로 내려오면서 level이 증가합니다. 해당 문제에서는 레벨별로 노드를 묶는 것이 관건인데요, 코드를 살펴보면서 설명드리겠습니다. # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right from collections import deque ..

[리트코드/leetcode/python] 1. Two Sum

리트코드에서의 1번문제입니다. 문제를 설명해보자면, 입력값으로 nums 라는 숫자배열이 주어집니다. 그리고 target값도 입력값으로 주어지는데요, nums배열에서 두 숫자를 더해 target을 만들 수 있다면, 해당 두 숫자의 인덱스 값을 배열 형태로 출력하는 문제입니다. 문제 자체는 비교적 간단한 문제입니다만, 이 문제를 어떻게 효율적으로 풀어야 할지는 고민해봐야 할 부분입니다. 해당 문제를 직관적으로 풀자면 for문을 두 번 돌면 됩니다. 대략적인 코드는 아래와 같겠죠. for i in range(len(nums)): for j in range(i+1,len(nums)): if (nums[i] + nums[j]) == target: return [i,j] 하지만, 위와 같이 푼다면, 이미 시간복잡도..

반응형