Welcome! 🙋‍♂️ View more

전체 글 40

[MongoDB] Timezone(타임존) 문제와 해결 (feat.Python)

Mongo DB는 Time zone이 UTC로 고정되어 있다. 따라서 Mongo DB에서 데이터를 불러올 때, Date 형식의 변수 값이 다를 수 있다. 필자의 경우, pymongo를 통해 데이터를 입력할 때는 정상적으로 되었으나, 추후 Spark를 통해 데이터를 읽어왔을 때 문제가 생겼다. 🤔 문제 필자는 네이버 종목토론방의 정보를 다루는 중이라서 이를 예시로 들겠다. 살펴보면 시간대가 9시간이 차이나는 것을 알 수 있다. 🤔 이러면 Date로 필터링할 때, 엄청난 혼선을 겪을 수 있다. 필자가 그랬다... 생각해보면 Pyspark에서 불러올 때 MongoDB의 시간대는 UTC이고, Pycharm 환경의 시간대는 한국(UTC+9)임으로 자동으로 9시간을 더한 것 같다. 그래서 이를 해결하기 위해서 이것..

Engineering 💻/DB 2022.02.19

[Spark] Exception while deleting Spark temp dir 에러 해결

Python에서 Spark을 실행할 때, 아래 에러가 나타났다. 살펴보니 Spark를 실행하는 동안 %Temp% 폴더에 폴더를 생성하는데, 그것을 지울 수 없다는 내용이다. 💡 우선 방법은 있다. %SPARK_HOME%\conf 폴더에 log4j.properties 파일을 수정하는 것이다. 만약 경로에 해당 파일이 없다면 log4j.properties.template를 복사하여 뒤에 .template를 지워주고, 만들어준다. 그리고 메모장으로 해당 파일을 열어 아래 명령어를 입력하고, 저장한다. log4j.logger.org.apache.spark.util.ShutdownHookManager=OFF log4j.logger.org.apache.spark.SparkEnv=ERROR 그러면 Python에서 S..

[Python] 참조한 모듈이 다른 모듈을 참조할 수 없는 경우 해결 (다른 모듈 참조하기)

파이썬으로 프로그램을 짤 때, 다른 모듈의 클래스나 함수를 사용하고 싶을 때가 있을 것이다. 필자 역시 그러했고, 그렇게 프로그램을 제작하고 있었다. 그러나 프로젝트의 구조를 바꾸고 나니, 제대로 동작하지 않는 경우가 있었다. 아래 경우를 살펴보자. 😫. 문제 상황 여기서 file1.py가 file2.py 모듈을 사용하기 위해서는 어떻게 해야할까? 여기에 대한 해답은 많은 곳에서 나와있다. 아래와 같이 해결하면 된다. # file2.py class Class2: def __init__(self): print('This is class in Class2') # file1.py # 상위 폴더를 참조할 수 있도록 설정한다. import sys, os sys.path.append(os.path.dirname(o..

[Python] 크롤링 방법과 비교 (requests, BeautifulSoup, selenium)

Python에서 웹 크롤링을 하는 방법은 두 가지가 있다. requests 라이브러리로 웹 정보를 받고, BeautifulSoup로 파싱한다. selenium 라이브러리로 브라우저를 열어 웹 정보를 받는다. 보통 웹 컨트롤이 필요할 경우(클릭)에는 selenium을 활용하고, 그렇지 않다면 requests 방법을 이용하는 것이 일반적이다. 왜냐하면 selenium은 웹 브라우저를 여는 과정에서 많은 시간이 소요되기 때문에 비교적 속도가 빠른 requests가 좀 더 유리하기 때문이다. 🤔 궁금한 것 그렇다면.... 만약 웹 컨트롤이 필요해서 selenium을 통해 웹 브라우저를 열어놓은 상태에서 웹 정보를 어떻게 가져오는 게 더 빠를까? 이번에는 그것을 알아볼 것이다. 👀 실험 준비 이번에 크롤링할 대상..

[DB] Index란 (feat. B+-Tree)

DB의 성능 DB는 많은 사람들이 공통으로 사용하는 데이터 모음이기 때문에, 대량의 데이터가 조회/저장되는 일이 빈번하게 발생한다. 그리고 이를 빠르게 진행하는 것이 무엇보다 중요하다. 이때 DB의 성능과 관련된 핵심이 디스크 I/O를 어떻게 줄이느냐이다. 디스크 I/O = 플래터(원판)을 돌리고, 디스크 헤더를 이동하여 데이터를 읽는 것을 의미한다. 물론 순차 I/O가 랜덤 I/O보다 빠르다. 하지만 현실은 대부분 랜덤 I/O이며, 이를 순차로 바꾸어 보자는 아이디어에서 Index와 쿼리 튜닝이 나타났다. Index란? Index란 추가적인 저장 공간을 활용하여 DB 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 DB 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 시간이 오래 걸릴..

Engineering 💻/DB 2022.02.13

[PostgreSQL] Python에서 다중 행을 Insert하는 다양한 방법과 비교

🤔 Python으로 DB에 데이터를 입력할 때, 다중 행을 입력하는 경우가 많을 것이다. 이를 어떻게 실행해야 가장 빠르게 입력할 수 있을까? 😀 이러한 고민에 3가지 방법을 실행해봤고, 각 방법이 시간이 어떻게 차이나는 지 공유해보고자 한다. 먼저 입력할 데이터와 DB를 연결하자. 사용될 데이터는 10만개의 행과 3개의 열을 가진 Integer 데이터를 사용할 것이다. DB는 PostgreSQL로 구축한 DB를 활용할 것이다. import time import psycopg2 N = 100000 data = [(i,i,i) for i in range(N)] print('data length: ', len(data)) #10만개의 행 db = psycopg2.connect(host='localhost',..

Engineering 💻/DB 2022.02.10

[알고리즘] 다이나믹 프로그래밍 (feat. Leetcode)

다이나믹 프로그래밍이란? 큰 문제를 작은 문제로 나누어 풀고, 작은 문제의 답을 재활용하는 기법을 의미한다. 메모리 비용을 활용하여 시간적 비용을 줄이는 방식이다. 👉 조건 부분 반복 문제: 작은 문제가 반복되는 경우 최적 부분 구조: 같은 문제는 구할 때마다 정답이 같을 경우 작은 문제가 반복되고 그 문제의 답이 같기 때문에, 굳이 작은 문제에 대한 계산을 반복하지 않고 이를 메모리에 저장하여 활용하는 것이다. Fibonacci 수열 DP를 설명할 때 가장 기본적으로 예를 들 수 있는 것이 Fibonacci 수열이다. 이는 f(n) = f(n-1) + f(n-2)의 점화식을 가진다. 아래 Leetcode 문제를 재귀 함수를 이용하는 방법과 동적 프로그래밍을 사용하는 방법으로 풀어볼 것이다. https:..

[자료구조] 힙 (Heaps)

Heap이란? 👉 개념 우선순위큐(Priority Queue)에서 사용되는 자료구조이며, 최대값이나 최솟값을 찾는 데 소요되는 시간이 O(1)이다. 하지만 노드 수정시, 힙구조 유지하기 위해 heapify과정을 거쳐 구조를 유지한다. 이는 결국 O(log n)의 시간 복잡도를 가진다. 👉 특징 Tree 중 배열에 기반한 완전 이진 트리 형식(왼쪽에서 오른쪽으로 순서대로 차곡차곡 채워진 이진 트리)을 가지며, 최대힙/최소힙 두 종류가 있다. 최대 힙 key(부모 노드) ≥ key(자식 노드) 최소 힙 key(부모 노드) ≤ key(자식 모드) 완전 이진 트리이기 때문에 삽입/삭제 연산이 배열의 가장 끝에서 발생한다. BST의 경우 삽입/삭제를 위해서 값을 찾아주는 과정이 필요했지만, 힙은 일단 배열의 맨 ..

[자료구조] Binary Search Tree

Binary Search Tree란? 👉 개념 Binary Search Tree(BST)는 효율적인 탐색을 위한 데이터 저장 방법이다. 👉 규칙 노드에 저장되는 키는 유일하다. 부모의 키 값이 왼쪽 자식 노드의 키 값보다 크다. 부모의 키 값이 오른쪽 자식 노드의 키 값보다 작다. 왼쪽과 오른쪽 서브트리도 BST이다. 👉 장단점 장점 탐색 연산 시간복잡도가 O(log N)이다. (명확히 말하면 O(h)) 단점 편향 트리의 경우 저장 순서에 따라서 한 쪽으로만 노드가 추가되는 경우가 발생한다. 최악의 경우는 탐색 시간복잡도가 O(N)이다. 배열보다 많은 메모리를 사용한다. Leetcode 문제를 통한 BST 구현 BST를 직접 구현하는 것이 도움이 될 것이라 생각하여 아래 문제를 풀어보았다. 1. 탐색: ..

[DB] SQL과 NoSQL

데이터를 다룸에 있어서 SQL과 NoSQL을 필수적으로 접해야하는 언어이고, 그 차이도 분명히 할 필요가 있다고 생각했다. 이 전에 정리를 했지만, 좀 더 자세히 정리를 해보기로 했다! 😤 https://deep-flame.tistory.com/7 [DB] 데이터베이스 기초 데이터베이스란? 데이터베이스란 여러 사람들이 공유하고, 사용될 목적으로 통합하여 관리되는 데이터의 집합 데이터 베이스를 사용하기 이전에는 파일 시스템을 이용하여 데이터를 관리했다. deep-flame.tistory.com SQL Structured Query Language의 줄임말로, 관계형 데이터베이스 시스템(RDBMS)에서 자료를 관리 및 처리하기 위해 설계된 언어이다. 👉 SQL 문법의 종류 DDL (Data Definitio..

Engineering 💻/CS 2022.02.02

[Docker] 컨테이너와 도커 그리고 쿠버네티스

Cloud를 공부하다보면 컨테이너/도커/쿠버네티스라는 개념이 자주 등장한다. 간단히 말하면 과거 가상머신의 불편함을 해결하고자 컨테이너와 도커라는 개념이 생겨났고, 컴퓨팅 파워가 늘어나다보니 다수의 도커와 컨테이너를 운영해야하는 상황이 발생하여 쿠버네티스가 생겨났다. 해당 글에서는 이 항목들에 대해서 살펴볼 것이다. 도커와 컨테이너 소프트웨어는 OS와 라이브러리에 의존한다. 따라서 성격이 다른 컴퓨터(OS, 라이브러리 버전이 다름)에서 같은 소프트웨어를 실행할 때 어려움을 느낄 수 있다. Docker는 Container기반의 가상화 플랫폼이다. Docker를 사용하여 Container를 생성할 수 있으며, 같은 Container를 여러 개 생성하는 것도 가능하다. 이렇게 위의 문제를 해결할 수 있는 것이..

[Hadoop] Spark 동작 단계

Spark는 Hadoop의 연산 프레임 워크 중 하나로서, 대규모 통합 분석 엔진으로 가장 범용적으로 쓰이는 기술 중 하나이다. 이에 동작 단계에 대해 좀 더 상세히 알아보기 위해 블로그에 정리해보기로 했다. 해당 자료는 이전에 작성했던 글이다. https://deep-flame.tistory.com/10 [Hadoop] 연산 프레임워크 (feat. MapReduce, Spark, Flink) 대다수 프레임워크는 사용자가 정의하거나 합성한 임의의 연산을 잘게 나눠서 분산 실행한다. Hadoop MapReduce 대용량의 데이터를 분산/병렬 컴퓨팅 환경에서 처리하기 위해 제작된 모델이다. 단순 deep-flame.tistory.com Spark의 동작 단계 크게 5단계로 이루어진다. DataFrame이나 ..