분류 전체보기 30

NoSQL Database를 찾아보자 : MongoDB

MongoDB 개요 MongoDB는 대표적인 NoSQL 데이터베이스이다. 2007년에 개발되었고, 이 서비스로 무려 나스닥 상장까지 했으니 그 파워풀함은 구구절절 설명할 것은 없겠다. 창업자들은 구글의 자회사 출신 개발자들이라고 하며, 기존의 RDBMS의 저조한 확장성을 보완할 데이터베이스로서 MongoDB를 개발했다고 한다. 여기서 말하는 확장성은 두 가지로 볼 수 있다. 1️⃣ 데이터 용량이 급증하면서 더 확장된 저장 용량이 필요함. 2️⃣ 서비스가 발전하면서 데이터의 스키마가 변해감. RDBMS는 데이터 용량이 급증할 때 데이터베이스의 서버 용량을 높이는 Scale-up의 방식으로 대응해야하지만 MongoDB는 분산 저장을 하는 Scale-out의 방식으로 대응할 수 있다는 점, RDBMS는 기존..

RDBMS 조인 알고리즘 : Nested Loop Join

RDB(Relational Database 관계형 데이터베이스)를 사용할 때 Join이 빠질 순 없다. Join은 서로 다른 테이블을 결합하는 과정이며, 이 결합의 과정은 Join Key라고 하는 두 테이블의 컬럼에서 매칭되는 값을 찾고, 매칭되는 row를 이어 붙이는 과정이라 할 수 있다. 두 테이블의 컬럼을 매칭시키는 방법은 아주 다양할 수 있다. 이 방법들을 조인 알고리즘이라 부른다. 아래에선 조인 알로리즘 중 가장 보편적으로 활용되는 Nested Loop Join에 대해 설명하겠다. 개념 Nested Loop Join는 Loop라는 단어를 그 속에 가진 것처럼 프로그래밍 언어의 For문과 같은 반복적(iterable) 과정을 가진다. Nested라는 단어는 '중첩된'이라는 뜻인데, 여기서 말하는..

(pyspark+jupyterlab) Ubuntu내 분석 환경 설정

ubuntu 20.04 (multipass)python 3.8.9pyspark 3.3wget https://dlcdn.apache.org/spark/spark-3.3.1/spark-3.3.1-bin-hadoop3.tgzUbuntu 가상환경 셋팅multipass launch -c 2 -m 2G --name machine focal Pyspark 다운로드spakr 바이너리 파일을 다운로드 받는다. 여기엔 pyspark를 구동하는 라이브러리들이 모두 모아져 있다. https://www.apache.org/dyn/closer.lua/spark/spark-3.3.1/spark-3.3.1-bin-hadoop3.tgzwget https://dlcdn.apache.org/spark/spark-3.3.1/spark-3...

[Python] Child process 생성

작업 간에 별도의 프로세스를 만들어서 작업을 처리해야할 때가 있다. 가장 흔하게는 controller 역할을 하는 어플리케이션에서 worker 혹은 executor 등의 작업 주체를 만드는 경우가 있다. Airflow에서 Celery worker를 사용할 때가 그렇다. airflow는 worker들을 데몬으로 미리 띄워놓는게 아니라 작업이 수행되는 때에 필요에 따라 worker process를 띄워서 사용한다. 이번 포스트에서는 간략하게 python으로 child process를 띄우는 코드를 소개한다. import osprint(f'Current PID : {os.getpid()}')pid = os.fork()if pid > 0: _, ret = os.waitpid(pid, 0) print("Pare..

[Java DataEngineering] Parquet 파일 쓰고 읽는 코드 정리 Write & Read

Java를 이용해 Parquet 파일을 쓰고 읽는 코드를 소개한다. 라이브러리 버전 정보org.apache.parquet:parquet-avro:1.12.2org.apache.hadoop:hadoop-common:3.3.4org.apache.hadoop:hadoop-mapreduce-client-core:3.3.4유의점 parquet 파일 저장 코드를 소개하는 포스트들은 대게 Path 경로만 넣어서 writer를 빌드하는 방법을 사용한다. 허나 아쉽게도 해당 코드는 Deprecated 처리되었는데 이유는 정확히 모르겠다.. 어쨌거나 Path가 아닌 org.apache.parquet.io.OutputFile (interface) 를 구현한 클래스를 넣어야 한다. https://issues.apache...

[Java Gradle] 등록된 라이브러리 Jar 목록 확인(Classpath)

gradle 7.4https://docs.gradle.org/7.4/userguide/userguide.html Java 프로젝트를 만들 때 간혹 추가한 외부 라이브러리가 classpath에 제대로 등록되지 않는 경우가 있다. 대게 문법 오류로 인한 문제겠다. 이럴 땐 제대로 등록된 라이브러리 목록을 봐가며 점검을 할 필요가 있다. 아래엔 Gradle Task를 이용해 등록된 라이브러리 Jar 목록을 출력하는 방법을 소개한다. Gradle 버전에 따라 문법이 다를 수 있으니 주의할 것! ...configurations { testImplementation { canBeResolved(true) }}dependencies { testImplementation 'org.junit.j..

IT 이모저모 2022.11.25

[Javascript Byte 다루기] ByteArray <-> UTF-8 ( over the 'fromCharCode' )

NodeJs에서 byte를 Decoding 하는 함수는 fromCharCode 이다. 문제는 이 함수의 인코딩이 ASCII만 지원된다는 것이다. 그러니까 영어와 숫자 정도를 다루는데는 무리가 없으나 한글이 끼어버리는 순간 망해버린다. 이때는 ByteArray에서 Byte들을 일일이 가져와 독해하고 처리하는 과정이 필요하다. 고맙게도 구글의 closure 코드 중에 관련된 처리를 해주는 함수가 있어서 기록해둔다. 또 좀더 단순해보이는 코드를 어느 블로그에서 발견해서 그것도 기록해둔다. 코드 분석을 해보고 싶지만 엄청난 비트 연산의 나열을 보면 차마 엄두가 안난다. 그냥 가져다 써야징~ 구글 참고https://github.com/google/closure-library/blob/8598d87242af59..

IT 이모저모 2022.11.22

Netty 기반 경량 Http Server 구성 ( with Gradle )

Netty는 이벤트 기반 네트워크 어플리케이션 구성을 위한 프레임워크다. 통상 NIO 기반 비동기 프로토콜 서버 구축용 프레임워크로 더 잘알려져있다. NIO는 New input output의 약자로 Channel Buffer의 방식으로 입출력을 다루는 자바의 기본 IO 라이브러리를 뜻한다. Netty가 비동기 프로토콜 서버를 구출할 수 있는 이유는 이러한 NIO를 사용하기 때문이며 달리 말하면 NIO가 Non-Blocking IO를 지원하기 때문이다. Blocking IO란 먼저 입력된 데이터가 처리되어 출력되기 전까지 새로운 데이터를 입력받지 않는 방식을 말하며 Non-Blocking은 이와 반대로 먼저 입력된 데이터의 처리 여부와 상관없이 다른 데이터들의 입력을 받고 입력 순서과 상관없이 처리 순서에..

IT 이모저모 2022.09.25

Cursor 와 Loop Query 그리고 Procedure ( in MYSQL )

통상적인 관계형 데이터베이스 작업은 DB와 Connection 을 맺고 SQL을 던져서 질의 결과를 반환받는 과정이다. Connection 이 성공적으로 맺어지고 SQL 구문 상의 오류가 없다면 RDB는 전달받은 SQL에 맞춘 알맞은 실행 계획을 세워 질의를 수행하고 결과를 만들어 반환해준다. 거의 모든 데이터베이스 작업은 이런 DML 작업으로 충분히 처리되지만 간혹 조금 더 자유도가 높은 처리가 필요한 때가 있다. 가령 Table의 Row 단위로 처리를 통제하거나 질의 내에서 Loop 를 돌리는 처리 등이 있겠다. CURSOR 커서는 흔히 GUI 환경에서 마우스를 따라 움직이는 작은 이미지를 가리키는 명칭으로 쓰인다. 프로그래밍적으로 말하자면 커서는 마우스의 위치와 마우스 동작 이벤트의 정보를 저장..

DNS ? Hostname ? Domain ? A RECROD, CNAME ? Name Server?

인터넷에 연결된 수많은 컴퓨터들은 ip로 서로를 식별한다. 일반적인 ip는 점과 숫자로 구성된다. 모든 통신의 과정에서 ip로 접근정보를 추려야하는 건 출석부의 학생들을 숫자와 문자가 혼용된 식별자로 구별해야하는 것처럼 난감한 일이다. 난감함을 피하고자 학생들에게 철수, 영희, 민수 등의 이름이 있듯이 컴퓨터에게도 보다 직관적인 이름이 붙여진다. 이를 도메인 혹은 Hostname이라고 한다. 허나 이름을 무엇으로 붙이던 거의 모든 프로토콜은 결국 ip를 이용해 접근공간을 파악한다. 따라서 도메인과 ip는 양방향적으로 수월히 변환되어야하고 이런 변환 서비스를 제공하는 것이 DNS ( Domain Name System ) 이다. 과거에는 접근이 필요한 모든 host의 정보를 client가 가지고 있었다. ..

IT 이모저모 2022.09.15