반응형

도커란

: 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼

 

컨테이너: 컨테이너는 격리된 공간에서 프로세스가 동작하는 기술. VM과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 운영체제(OS)를 공유한다.

source: https://kubernetes.io/ko/docs/concepts/overview/

 

이미지컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않습니다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다. 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가MB에 이릅니다.

hub: https://hub.docker.com/

  • 레이어 저장 방식: 컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기read-write 레이어를 추가합니다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용합니다.

 

참고: 초보를 위한 도커 안내서

 

 

Docker 사용하기

1. docker container생성

DockerFile: 컨테이너 정의서

from  # image import

run  # linux bash command (build시 init!)

env  # linux 환경변수

expose  # port forwarding

entrypoint  # /bin/sh (bash file)

cmd  # bash arguments → pending 되는 command line을 적어야함(server로 사용하려면), 아니면 exit으로 바로 컨테이너 꺼짐

cp  # ex) {local_path} {container_path}

 

** 참고1: docker compose up -d —build 시 file이 변경된 부분부터 다시 실행됨 (file이 변경되도 다시 실행됨)

** 참고2: cmd에서 실행하고자하는 파일이 bash file일 경우는 실행 권한 필요: chmod +x {file_name}.sh

 

2. Container 여러개 생성 & 다른 Container 연결

docker-compose.yaml: 컨테이너s를 오케스트레이션

version: '1'

services:
  test-container:  # services 이름
    container_name: test-container
    hostname: test-container
    build:
      context: .
      dockerfile: DockerFile
    volumes:
      - ./src:/src  # code 싱크 맞추기(=copy) ex) {local_path}:{container_path}

  postgress:
    container_name: postgres
    hostname: postgres
    image: postgres:13  # docker image file 이미 있는 경우 (from hub.docker.com)
    environment:
      POSTGRES_PASSWORD: password
    ports:
      - 8080:8080  # conainer간의 port 연결 {local_port}:{container_port}

* 참고: yaml file 에서는 tab을 쓸 수 없음, “ 쌍따움표 쓸 수 없음

 

3. Docker 명령어

$ docker run

$ docker image ls -a

$ docker compose up -d --build  # -d: log background, --build: 새로 만들어 놓은 이미지로 변경 (해당 folder에서 실행하기)

$ docker compose down

$ docker logs {container_name}

$ docker container ps -a  # 전체 docker 작업 확인

$ docker compose ps -a  # docker-compoase.yaml 안에 있는 작업 확인

$ docker rm -f {container_name}

$ docker exec {service_name} {command}

$ docker exec {service_name} bash # ssh 연결 환경

$ docker volume prune

$ docker logs -tf {service_name}

 

작성한 예시 Docker Code : https://github.com/jaxgxxnxee/docker-test

반응형
반응형

Kafka란?

Kafka는 분산 메세지 큐로 대용량 데이터를 다루면서도 빠른 데이터 처리가 가능하게 합니다.

 

 

본문의 내용은 데브원영님의 강의 '아파치 카프카 for beginners'를 수강하고 정리한 내용입니다.

ref: https://www.youtube.com/@DevWonYoung

 

출처: https://kafka.apache.org/11/documentation/streams/architecture

Kafka Architecture

  1. Kafa Producer API (source application) : click log, … logs 데이터 생성, 및 Topic에 데이터를 저장 (push)
  2. Kafka Cluster(a.k.a Topic) : message 저장소 (핵심 역할)
  3. Kafka Consumer API (target application) : Topic에 저장된 데이터를 읽음(pop). 로그 적재, 로그 처리
    • etc) Kafka Streams API, Kafka Connect API 

 

Apache Kafka Features

Topic & Partition

  • Topic: 데이터가 저장되는 공간
    • 여러 개 생성 가능: 각 log별로 나눠서 저장 (message를 구분하는 용도)
  • Partition: topic의 실제 저장 공간 단위
    • que 역할: Producer에서 들어온 데이터는 partition에 쌓이게 되고 Consumer에서 가장 오래된 데이터부터 가져감
      • 단, 데이터가 partiton에서 사라지지 않고 그대로 보관됨
      • (message가 저장되는 최대 시간과 크기를 지정할 수 있음)
    • partition 여러 개 생성 가능 (=병렬처리 가능)
      • 다중 partition의 경우 기본 저장 방법: 라운드 로빈
      • 단, partition은 늘릴 수 있지만 줄일 수는 없음
    • Offset: 메세지를 어디까지 넣었는지, 읽었는지 저장하는 값 (위치)
  • Partitioner: Producer가 데이터를 보내면 partitioner를 통해 topic의 partition으로 데이터가 전송됨, partitioner는 데이터를 어떤 partition에 넣을지 결정하는 역할을 함
    • message key(hash)를 통해서 위치를 결정할 수 있음
    • 하나의 컨슈머는 하나의 파티션만 연결 (Consumer 1: Partition1), 하나의 컨슈머 기준으로 파티션의 순서 보장
  • Lag: 모니터링 지표 중 하나
    • Consumer가 마지막으로 읽은 offset과 Producer가 마지막으로 넣은 offset의 Gap (여러 개 존재 가능)

 

Broker, Replication, ISR

  • Broker: 카프카가 설치되어있는 서버 단위 (3개 이상을 권장)
  • replication(핵심!): 서버의 이슈에 대비하여 데이터가 유실되는 것을 방지하고 복구하기 위해 복제본을 다른 broker에 저장해 둠 (=고가용성)
    • 최대 broker 개수만큼 지정할 수 있음
    • replication이 1인 경우, broker 중 1대에 partition의 정보가 저장됨
    • replication이 2인 경우, partition 정보가 원본 1개, 복제본 1개가 각각 2대의 broker에 저장됨
  • ISR(In Sync Replica): **** 원본(leader)과 복제본(follower)을 합쳐서 부르는 용어
  • Producerack 동작: partition에 새로운 데이터를 저장할 때 리더 데이터의 업데이트와 팔로워 데이터의 복제가 정상적으로 되었는지 확인하는 방법 (option: 0, 1, all)

 

Zookeeper

: 분산처리 관리 시스템

  • Kafka 관련 정보를 저장하는 역할
  • Kafka의 Broker를 관리(유지보수, 조정)할 수 있음
  • Apache Kafka에서 Zookeeper가 단계적으로 제거되는 중…

 

Consumer, Producer

여기서 자세히 다루지 않음. 더 궁금하신 분들은 아래의 두 동영상을 추천합니다!

 

장점

  • High throughput message capacity
  • Scalability & Fault tolerant : Broker, Partition, Consumer 등 구성요소를 쉽게 추가할 수 있음
  • Undeleted log

 

설치, 실행하기

 

활용 예시

 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

 

반응형
반응형

데이터 파이프라인 이란?

(a.k.a ETL(Extract-Transform-Load))

Data Source(log, api, product dataset,.. etc)에서 원하는 데이터를 Extract 해서 원하는 특정 format으로 Transform 하고 데이터를 원하는 곳(Data Warehouse,... etc)에 적제(Load)하는 일련의 과정 및 Architecture를 이야기한다.

(최근에는 순서를 바꿔 ELT 프로세스로 사용하기도 한다.)

 

멱등성이란?

데이터 파이프라인에서 가장 중요한 것은 재실행의 안전성이다. 즉, *멱등성(Idempotency)를 보장해야 한다. Airflow는 **Backfill이 쉽다.

*멱등성: 동일한 테스크를 여러 번 수행해도 동일한 결과가 되도록 하는 것 (도중에 오류가 발생해 재실행을 해도 중복이 발생하지 않아야 한다.)

**Backfill: 과거 데이터를 다시 채우는 과정

 

Airflow란?

Apache Airflow

워크 플로우 관리도구 중 하나로 데이터 파이프라인을 쉽게 해주는 프레임워크이다.

워크플로 관리 기술을 사용하면 스케줄러 기능뿐 아니라 데이터 파이프라인이 복잡해짐에 따라 크고 작은 장애가 발생하더라도 오류 처리와 다시 처리하기 위한 기능을 만들어 관리할 수 있다.

 

Airflow에 의한 워크플로는 여러 task(=operator)로 이루어진 DAG(Directed Acyclic Graph)의 형태로 정의한다.

 

예시

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime

# config
dag = DAG(
    dag_id='helloword_dag',
    start_date=datetime(2022,12,19),
    catchup=False,
    tags=['example'],
    schedule_interval='0 2 * * *')  # crontab과 유사

def print_hello():
    print("hello!")
    return "hello!"

def print_goodbye():
    print("goodbye!")
    return "goodbye!"

# PythonOperator: 범용적
# 보통 task를 3개로 나눔 (ETL)
print_hello = PythonOperator(
    task_id='print_hello',
    python_callable=print_hello,
    dag=dag)

print_goodbye = PythonOperator(
    task_id='print_goodbye',
    python_callable=print_goodbye,
    dag=dag)

#Assign the order of the tasks in our DAG
print_hello >> print_goodbye
  • 출처: '실리콘밸리에서 날아온 데이터 엔지니어링 스타터 키드' 스터디
반응형
반응형

Apache Spark

Spark란?

: 인 메모리 형의 고속 데이터 처리

대량의 메모리를 활용하여 고속화 실현이 가능하다. Spark는 *Hadoop을 대체하는 것이 아니라 Hadoop의 구성 요소 중 분산 데이터 처리에 사용되는 **MapReduce를 대체하는 존재다. (Hadoop과는 다른 독립된 프로젝트이다.)

Spark는 스크립트 언어(JAVA, Scala, Python, R)를 사용할 수 있다는 장점이 있다.

*Hadoop: 대표적인 빅데이터 처리 시스템으로 분산된 다수의 컴퓨터에서 대량의 데이터를 처리하기 위한 시스템

**MapReduce: 대량의 데이터를 배치 처리하기 위한 시스템 (Map과 Reduce 기능으로 구성)

 

 

Pandas DataFrame vs Spark DataFrame

Pandas DataFrame

numpy ndarray를 기반으로 데이터 분석을 쉽고 빠르게 처리하기 위해 많이 사용되고 있다. 병렬 처리가 안된다.

이전 포스팅) 현업에서 많이 사용하는 Python 모듈 | Pandas 참고

 

현업에서 많이 사용하는 Python 모듈 | Pandas (Series, DataFrame)

안녕하세요~ "현업에서 많이 사용하고 있는 Python 모듈 마스터하기!" 라는 시리즈를 포스팅하려고 합니다. 그 중 첫 번째편은 바로 Pandas 입니다! Pandas의 DataFrame의 형태가 데이터베이스의 테이블

everyday-deeplearning.tistory.com

 

Spark DataFrame

a.k.a SQL의 탈을 쓴 DataFrame

Spark는 SQL과 유사한 형태의 연산을 지원하는 API로 구성되어 있다.

병렬 CPU처리 및 분산 서버 데이터 처리가 가능하다.

Spark DataFrame의 경우 Pandas DataFrame과 달리 대부분 새로운 DataFrame 객체를 반환하는 형태로 구성되어있다.

 

예시)

table

gender age
M 31
F 27
M  
F 32

Query

SQL Pandas DataFrame Spark DataFrame
Select gender From table table['gender'] table.select('gender')
Select * From table Where gender='F' table[lambda x: x['gender'] == 'F'] table.filter(F.col('gender') == 'F')
Update age=age+1 From table table['age'] = table['age'].apply(lambda x: x+1) table.withColumn('age', F.col('age') + 1)
Select gender, count(*) From table Group By gender table.groupby('gender')['gender'].count().reset_index() table.groupBy('gender').count()

 

두 DataFrames간 변환이 가능하다.

spark_df = spark.createDataFrame(pandas_df)
pandas_df = spark.select('*').toPandas()

 

반응형

+ Recent posts