워크플로 관리 워크플로: 정형적인 업무 프로세스와 같이 정해진 업무를 원활하게 진행하기 위한 구조 주요 역할 1) 정기적으로 태스크를 실행 2) 비정상적인 상태를 감지하여 그것에 대한 해결을 돕는 기능 기존에는 업무용으로 개발된 워크플로 도구를 사용하였지만 최근에는 데이터를 위한 워크플로 도구를 따로 사용한다. ex) Airflow, Luigi, Oozie 태스크: 데이터를 잇달아 이동하면서 반복되는 정해진 처리 = 데이터의 이동 주요 기능 태스크를 정기적인 스케줄로 실행하고 결과 통지 태스크 간의 의존관계를 정하고 순서에 따라 실행 태스크의 실행 결과를 보관하고, 오류 발생 시 재실행 선언형과 스크립트형 선언형: 제공된 기능만을 이용하여 최소한의 기술로 태스크를 정의한다. 유지 보수성이 높다. ex) ..
벌크 형과 스트리밍 형의 데이터 수집 객체 스토리지와 데이터 수집 빅데이터는 대부분 확정성이 높은 분산 스토리지에 저장된다. 데이터베이스가 이용되는 경우도 있지만, 기본적으로 객체 스토리지에 저장한다. HDFS, Amazon S3 등이 유명하다. ※ 스토리지와 데이터베이스의 차이 스토리지는 파일 형태가 되면 무엇이든 담을 수 있다. DB는 서버를 통해 가공된 데이터가 담긴다. 게시판에서 글은 DB에 담기고, 업로드한 파일은 스토리지에 담긴다. 스토리지에 저장된 데이터를 더욱 사용하기 쉽게 만들어주는 것이 데이터베이스라고 할 수 있다. 이러한 객체 스토리지는 작은 데이터에는 오히려 비효율적이다. 네트워크를 거쳐 실행하기 때문에 데이터양에 비해 통신 오버헤드가 너무 크기 때문이다. 데이터 수집 객체 스토리지..
대규모 분산 처리의 프레임워크 구조화 데이터와 비구조화 데이터 SQL로 데이터를 집계하는 경우, 테이블이 명확하게 정의되어 있는 구조화된 데이터를 사용한다. 기존의 데이터 웨어하우스에서 데이터는 항상 구조화된 데이터로 축적하는 것이 일반적이었다. 하지만 텍스트, 이미지, 동영상 등의 구조화되지 않은 비구조화 데이터도 점차 늘어나 SQL로 제대로 집계할 수 없게 된다. 비구조화 데이터를 분산 스토리지 등에 저장하고 그것을 분산 시스템에서 처리하는 것이 데이터 레이크의 개념이다. 이 경우는 데이터를 가공하는 과정에서 스키마를 정의하고, 구조화된 데이터로 변환한다. 스키마리스 데이터: 기본 서식은 있지만, 스키마가 정의 안 됨. CSV, JSON, XML 등의 데이터는 서식은 정해져 있지만, 칼럼 수나 데이터..
크로스 집계의 기본 크로스 집계의 개념: 트랜잭션 테이블, 크로스 테이블, 피벗 테이블 크로스 테이블: 엑셀에서 많이 보는 형태로 행 방향과 열 방향의 데이터가 교차하는 부분에 숫자 데이터가 들어간다. 트랜잭션 테이블: 데이터베이스를 생각하면 되는데, 행 방향으로 증가하는 테이블이다. 크로스 집계: 트랜잭션 테이블에서 크로스 데이블로 변환하는 과정. 피벗 테이블: 소량의 데이터를 크로스 집계하는데 편리한 것이 스프레드시트의 피벗 테이블 기능이다. 룩업 테이블: 트랜잭션 테이블에 새로운 항목을 추가하는 것이 아니라, 다른 테이블과 결합할 수도 있다. 예를 들면 상품 ID를 사용하여 상품명과 상품 카테고리를 참고하는 형태이다. 트랜잭션 테이블과 룩업 테이블은 서로 독립적으로 관리할 수 있다. 트랜잭션 테이블..
고전적인 동기화 문제 3가지 Bounded Buffer 생산자 소비자 문제를 다시 생각해보자. 생산자는 full 버퍼를 만드는 데, 소비자는 empty 버퍼를 만드는 데 각자의 목표가 있다. 여기서 공유 데이터에 접근하기 위해서는 mutex를 통해 버퍼에 하나의 프로세스만 접근하도록 해야한다. 아래 코드에서 볼 수 있다시피 각각의 프로세스는 wait으로 버퍼가 다 비워지거나 채워질 때까지 기다리고 mutex로 한 번에 한 프로세스만 접근할 수 있도록 한다. 그리고 프로세스가 다 끝나면 signal을 통해 프로세스가 다 실행되었다는 것을 알린다. Readers Writers 프로세스가 동시에 실행되고 있는 상태를 자세히 들여다보니, 읽기만 계속 실행되는 것과 쓰기만 계속 실행되는 것처럼 편향적으로 실행되는..
뮤텍스와 세마포어 뮤텍스 락 임계 구역 문제를 조금 더 하이레벨에서 해결하기 위해 Mutex Lock을 통해 상호배타만이라도 해결해보도록 한다. 임계 구역에 들어가려면 열쇠를 가지고 다시 나올 때면 이를 반납하도록 한다. 가장 간단한 방법이다. 여기서 더 발전하여 세모포, 모니터, 라이브니스와 같은 도구들이 나오게 되었다. 지금은 가장 기본이 되는 뮤텍스 락을 알아보자. mutex는 mutual exclusion의 줄임말로 상호배제를 통해 임계구역을 보호하고 경쟁 상태를 막는다. 이것을 사용하기 위해서는 acquire(), release(), available(boolean)만 있으면 된다. 참고로 이 함수는 atomical하게 구현하여야 한다. 하지만 이렇게 간단하게 구현하면 하나의 문제가 생기는데 이..
배경 공유 데이터에 접근할 때 생기는 문제에는 data inconsistency가 있다. 데이터를 동시에 접근할 때 문맥 교환으로 인해 생기는 문제인데 예시를 통해 살펴보도록 하자. int sum; void run void param) { int i; for (i = 0; i < 10000; i++) sum++; pthread_exit(0); } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, run, NULL); pthread_create(&tid2, NULL, run, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); printf("%d\n", sum); } 위의 코드에서 두 개의 ..
CPU 스케줄링 개념 CPU 스케줄링은 멀티 프로그래밍된 운영체제에서는 필수이다. 보통 프로그램을 동작시키면 I/O bound가 CPU bound보다 훨씬 많은 일이 빈번하다. 이러한 상황에서 CPU 효율을 높이기 위해 CPU bound를 조금이라도 더 높이려는데에 스케줄링은 매우 중요한 과정이라고 할 수 있다. CPU 스케줄링이란 대기 상태에 있는 프로세스 중에 어떤 프로세스에 CPU를 할당해줄 것인가를 정하는 과정이다. 다음 프로세스를 선택하는데는 다양한 방법이 있는데, 크게는 FIFO와 우선순위 큐를 이용하는 방법이 있다. 이는 뒤에서 여러 스케줄링 알고리즘을 배우며 알아보도록 하자. 스케줄링에서는 선점형과 비선점형이라는 또 다른 중요한 개념이 있다. 비선점형은 다른 프로세스가 다 끝날 때까지 빼았..
스레드란? 앞서 프로세스는 싱글 스레드로 도는 프로그램이라고 하였다. 하지만 만약 프로세스 안에서 또 작업을 여러 개로 나누어 작동시킨다면 어떨까? 훨씬 작업이 빨라지지 않겠는가? 이러한 발상에서 착안된 것이 바로 스레드이다. 스레드는 가벼운 프로세스로서 실제적으로로 CPU를 점유하는 단위이다. 이제는 여러 개의 스레드를 두어 프로세스를 실행시키기 때문에 실제로 CPU를 점유하는 가장 작은 단위는 스레드라고 할 수 있다. 이 또한 똑같이 고유의 TCB를 가지고 있다. 당연히 여기에는 여러 장점이 있다. 우선 프로세스가 다 끝날 때까지 기다리지 않고 비동기적으로 처리할 수 있고, 위의 그림처럼 기본적인 자원을 공유하기 때문에 훨씬 경제적이다. 또한 여러 개의 작업으로 병렬처리가 가능해진다. 사실 우리는 멀..
프로세스간 통신(IPC) 프로세스가 동시에 실행될 때 프로세스 간 서로 데이터를 공유하지 않고 독립적으로 작동하면 별 문제가 없겠지만 데이터를 공유한다면 문제가 생길 것이다. 이렇게 프로세스 간 통신하는 방법을 IPC(Inter-Process Communication)이라고 한다. IPC를 통해 협력 프로세스는 서로 데이터를 주고 받을 수 있다. Shared-Memory IPC 모델은 Shared-Memory와 Message-Passing으로 나눌 수 있다. 잠깐 Shared-Memory를 살펴보기 전에 알아두어야 할 개념이 있는데, 이러한 협조 프로세스에는 항상 생산자-소비자 문제가 따라온다. 단어에서 볼 수 있듯이 데이터를 생산하는 생산자와 그 데이터를 소비하는 소비자가 있다는 개념인데, 웹서버가 H..