분류 전체보기 37

Kafka의 Zero copy

Zero copy Zero-copy란 컴퓨터에서 CPU의 개입을 받지 않고 한 메모리의 영역에서 다른 메모리의 영역으로 데이터를 카피하는 작업을 말한다. 불필요한 데이터 복사을 줄이고 CPU 자원을 아껴 성능을 개선할 수 있다. Kafka는 이 방식을 사용하여 클라이언트에서 요청하는 메시지를 빠르게 송신할 수 있다. 카프카는 파일(또는 리눅스의 경우 파일시스템 캐시)의 메시지를 중간 버퍼 메모리에 쓰지 않고 곧바로 네트워크 채널로 전송한다. 데이터를 클라이언트에게 전송하기 위해 로컬 캐시 메모리에 저장하는 대부분의 데이터베이스와 달리 Kafka가 갖는 하나의 특징이며 데이터 전송을 빠르게 하여 성능을 향상시킨다. 아래에서 데이터를 전송하는 일반적인 방식과 Kafka가 채택한 Zero copy 방식을 비교..

PPA (Personal Package Archive)

PPA (Personal Package Archive) 개인 패키지 저장소는 말 그대로 우분투의 공식 패키지 저장소에 없는 Third-party 소프트웨어의 패키지 저장소다. 공식적으로 제공하지 않는 다양한 패키지를 이용할 수 있다. 우분투의 공식 패키지는 업데이트가 자동적으로 가능하겠지만 이 외의 패키지는 이 저장소를 추가하여 다운로드, 업데이트 등이 가능하다. 활용 # 저장소 추가 $ sudo apt-add-repository # 저장소 추가 예시 $ apt-add-repository 'deb http://myserver/path/to/repo stable myrepo' $ apt-add-repository 'http://myserver/path/to/repo myrepo' $ apt-add-repo..

Linux 2022.02.11

컴퓨터 시스템의 기본

컴퓨터의 동작 방식 컴퓨터가 동작하는 방식은 아래의 세 단계를 반복하는 것과 같다. 입력 장치 혹은 네트워크 어댑터를 통해 컴퓨터에 처리 요청이 들어온다. 메모리에 있는 명령을 읽어 CPU에서 실행하고 그 결과를 다시 메모리의 다른 영역에 기록한다. 메모리의 데이터를 하드디스크(HDD)나 SSD 등의 저장 장치에 기록하거나 네트워크를 통해 다른 컴퓨터에 전송하거나, 혹은 디스플레이 등의 출력 장치를 통해 결과를 보여준다. 이러한 순서를 반복해서 하나의 처리(기능)으로 정리한 것을 프로그램이라고 하는데, 프로그램은 크게 애플리케이션, 미들웨어, OS(운영체제)로 구분할 수 있다. 프로그램의 종류 애플리케이션: 사용자가 직접 사용하는 프로그램. 오피스, 계산기, 브라우저 등 미들웨어: 여러 애플리케이션이 공..

Spark의 핵심 RDD

RDD (Resilient Distributed Datasets) RDD는 변경 불가능하며 파티셔닝된 레코드들의 모음이다. (변경 안되고, 나누어져있는 기록들) RDD를 조작하는 코드를 짠다는 것은 실제로 조작하는 것이 아니라 어떻게 조작할지 기록하는 행위다. Directed acyclic graph(DAG)형태로 Lineage를 기록하는 과정이다. Transformation과 Actions RDD Operator에는 지연 처리 방식의 transformation과 즉시 실행 방식의 action 두 가지 operator가 있다. transformation operator는 데이터를 어떻게 조작할지 정의하는 operator(Lineage를 작성하는 operator)이고 action operator는 실제로 ..

Spark Application Architecture - 스파크의 작동 순서(스파크 클러스터)

클러스터 모드로 spark-submit 명령을 수행했을 때 spark application이 어떤 순서로 작동하는지 알아본다. 클라이언트의 요청 첫 단계는 스파크 애플리케이션(컴파인된 JAR파일이나 라이브러리 파일)을 제출하는 것. 스파크 어플리케이션을 제출하면 로컬에서 코드가 실행되어 클러스터 드라이버 노드에 요청한다. 이 과정에서 스파크 드라이버 프로세스의 자원을 함께 요구한다. 클러스터 매니저가 이 요청을 받아들이면 클러스터 워커 노드 중 한 곳에서 스파크 드라이버 프로세스를 실행한다. 스파크 잡을 제출한 클라이언트 프로세스는 이 때 종료되며 스파크 애플리케이션은 클러스터 내에서 수행된다. 애플리케이션 시작 드라이버 프로세스가 실행된 다음 사용자 코드가 실행된다. 사용자 코드에는 반드시 스파크 클러..

Spark Application Architecture - 실행 모드

실행 모드는 스파크 애플리케이션을 실행할 때 요청한 자원의 물리적인 위치를 결정한다. 실행 모드는 총 3가지로 클러스터 모드, 클라이언트 모드, 로컬모드가 있다. 클러스터 모드 클러스터 모드를 사용하려면 컴파일된 JAR파일이나 파이썬 스크립트, R 스크립트를 클러스터 매니저에게 전달해야 한다. 클러스터 매니저는 파일을 받은 다음 하나의 워커 노드에 스파크 드라이버을 실행하고 다른 워커 노드에 스파크 익스큐터 프로세스를 실행한다. 클러스터 매니저는 모든 스파크 애플리케이션과 관련된 프로세스를 유지하는 역할을 한다. 클러스터 모드에서는 스파크 드라이버, 스파크 익스큐터가 모두 클러스터 워커 노드에서 실행된다. 클라이언트 모드 클라이언트 모드는 애플리케이션을 제출한 클라이언트 머신에 스파크 드라이버가 위치한다..

Spark Application Component - Component

스파크 드라이버 스파크 애플리케이션의 ‘운전자 역할’을 하는 프로세스. 스파크 어플리케이션의 실행을 제어하고 스파크 클러스터(익스큐터의 상태와 태스크)의 모든 상태 정보를 유지힌다. 물리적 컴퓨팅 자원 확보, 익스큐터 실행을 위한 클러스터 매니저와의 통신 등도 수행한다. 요약하면 물리적 머신의 프로세스이며 클러스터에서 실행중인 애플리케이션의 상태를 유지하는 역할을 수행한다. 스파크 익스큐터 위에서 기술한 스파크 드라이버가 할당해준 태스크를 수행하는 프로세스. 스파크 익스큐터는 스파크 드라이버가 할당한 태스크를 받아 실행하고 태스크의 상태와 결과를 드라이버에 보고한다. 모든 스파크 애플리케이션은 개별 익스큐터 프로세스를 사용한다. 클러스터 매니저 클러스터 매니저는 스파크 어플리케이션을 수행할 클러스터 머신..

메모리계층

메모리 장치의 계층 구조 [레지스터] - [캐시 메모리] - [메모리] - [저장장치] 크기 작음 크기 크다 가격 비쌈 가격 저렴 속도 빠름 속도 느림컴퓨터의 동작 흐름 명령어를 바탕으로 메모리에서 레지스터로 데이터를 읽는다. 레지스터에 있는 데이터를 바탕으로 계산을 수행한다. 계산 결과를 메모리에 쓴다. 컴퓨터는 레지스터에서 계산하는 시간보다 메모리에 접근하는 데 걸리는 시간, 레이턴시가 극도로 느리다. (2)단계가 아무리 빨라도 (1)과 (3)단계에서 병목이 발생하여 전체 처리속도는 메모리에 읽고 쓰는 레이턴시와 별 차이가 없게 되버린다. 캐시 메모리 캐시 메모리를 통해 레지스터 안에서 계산하는 것과 메모리에 접근하는 것 양 쪽 처리 시간의 차이를 메운다. [레지스터] - [캐시 메모리]의 레이턴시가..

메모리관리

리눅스는 커널의 메모리 관리 시스템으로 시스템에 탑재된 메모리를 관리한다. 각 프로세스는 물론이고 커널 자체도 메모리를 사용한다. 메모리 통계정보 메모리 통계정보는 free 명령어로 확인할 수 있다. (base) [user@server ~]$ free total used free shared buff/cache available Mem: 65387028 16650384 7639664 233184 41096980 48005532 Swap: 32767996 6065624 26702372 (base) [user@server ~]$ (base) [user@server ~]$ free -h total used free shared buff/cache available Mem: 62G 15G 7.3G 227M 39..

Dockeroperator의 Bind mount을 활용한 Airflow 운영

Docker operator 나는 Airflow에서 Dockeroperator를 활용한다. Dockeroperator는 scheduling된 job을 수행할 때 미리 구성해놓은 docker image로 container를 생성하고, 그 안에서 job을 수행한다. 이러한 방식을 활용한 주요한 이유는 의존성 문제이다. 각각의 job이 요구하는 환경을 docker image로 미리 구성해놓고, 필요할 때 마다 job에 맞는 환경을 생성하는 방식으로 예기치 않게 발생할 수 있는 문제에 대처하기 위해 Dockeroperator를 활용했다. Mount 방식에 대한 고민 Docker image를 만들며, 컨테이너 내부에 job을 위한 코드는 어떻게 담을 것인지에 대한 고민을 시작했다. Dockerfile의 COPY ..