728x90

1.  컴포넌트

종류 ) 스파크 코어, 스파크 SQL, 스파크 스트리밍, 스파크 GraphX, 스파크 MLlib

 

이 글에선 스파크 MLlib, GraphX 를 제외하고 나머지 컴포넌트에 대해 다룬다.


A. 스파크 코어 

스파크 job, 다른 스파크 컴포넌트에 필요한 기본 기능 제공. 

- 여기서 가장 중요한 개념은 RDD 인데, RDD : 분산 데이터 컬렉션 (Dataset) 을 추상화한 객체로,

데이터셋에 적용할 수 있는 연산 및 변환 메서드를 함께 제공한다.

 

RDD는 노드에 장애가 발생해도 데이터셋을 재구성 할 수있는 복원성을 갖추고있다. 

 

- 스파크 코어는 HDFS , GluterFD, 아마존 S3 등 다양한 파일 시스템에 연결할 수 있다.

  또, 공유변수/누적변수를 사용해 컴퓨팅 노드 간 정보를 공유할 수있다.

 

- 스파크 코어에는 네트워킹, 보안, 스케줄링 및 데이터 셔플링 등 기본 기능이 구현되어있다.

 

 

 

B.  스파크 SQL

스파크와 하이브SQL 이 지원하는 SQL을 사용해 대규모 분산 정형 데이터를 다룰 수 있는 기능을 제공한다. 

- JSON, Parquet, RDB테이블, Hive table 등 다양한 정형 데이터를 읽고 쓰는데도 사용할 수 있다.

(*Parquet : 데이터, 스키마를 함께 저장할 수 있는 파일 포맷. 최근 널리 사용된다고 한다. )

 

- 스파크 SQL 은 DataFrame, Dataset에 적용된 연산을 일정 시점에 RDD 연산으로 변환해 일반 스파크 잡으로 실행한다. 

 

- '카탈리스크' 라는 쿼리 최적화 프레임워크를 제공하며,

       사용자가 직접 정의한 최적화 규칙을 적용해 프레임워크 확장도 가능하다. 

 

- 외부시스템은 '아파치 Thrift 서버'를 통해 JDBC, ODBC 프로토콜을 이용하여 쿼리를 실행할 수 있다. 

 

 

 

C. 스파크 스트리밍 

다양한 데이터 소스에서 유입되는 실시간 스트리밍 데이터를 처리하는 프레임워크이다.

지원 스트리밍 소스

- HDFS, 아파치 카프카, 아파치 플립, 트위터, ZeroMQ, 커스텀 데이터 소스.

 

- 스트리밍 데이터를 처리할 때는 장애 복원성이 매우 중요한데, 

    스파크 스트리밍은 장애 발생 시 연산 결과를 자동으로 복구한다. 

 

- 이산 스트림 방식으로 데이터를 표현. 

   => 기징 마지막 타임 윈도 안에 유입된 데이터를 RDD로 구성해 주기적으로 생성한다.

 

- ver 2.0 에서 정형 스트리밍 API 를 사용해 일괄 처리 프로그램을 구현하는 것처럼 스트리밍 프로그램을 구현할 수 있다.

 


 

2. 스파크 프로그램의 실행 과정

 

만약 한 파일 (ex. 로그파일) 이 여러 노드로 구성된 HDFS 에 분산저장 되어있다면, 

(HDFS 는 파일의 크기를 자동으로 나눠 각 블록을 클러스터의 여러 노드에 나누어 저장한다.) 

 

 

가장 먼저 스파프 셸을 시작하고 스파크 클러스터에 연결한 후,

scala 명령을 입력해 HDFS 에 저장된 로그 파일을 메모리에 로드한다. 

 

 

이 때 스파크는 데이터 지역성을 만족하기 위해 로그 파일의 각 블록이 저장된 위치를 하둡에게 요청하고, 

모든 블록을 클러스터 노드의 RAM 메모리로 전송한다. 

(* 대량의 데이터를 네트워크로 전송해야 하는 상황을 만들지 않기 위해 데이터 지역성이 필요하다.)

 

 

데이터 전송이 완료되면 스파크 shell 에서 RAM 에 저장된 각 블록 (파티션) 을 참조할 수 있다. 

(

이 파티션의 집합 => RDD 가 참조하는 분산 컬렉션. 

즉 , RDD 를 사용하면 비-분산 로컬 컬렉션을 처리하는 것과 같은 방식으로 대규모 분산 컬렉션을 다룰 수 있다. 

사용자는 컬렉션이 여러 클러스터 노드에 분산 저장된다는 사실을 굳이 알 필요가 없고, 노드 장애에 따로 대비할 필요도 없다. 

 

 

스파크는 RDD의 컬렉션에 함수형 프로그래밍을 사용할 수 있는 정교한 API 를 제공한다.

이를 통해 (1) RDD의 컬렉션 필터링하거나 사용자정의함수로 컬렉션 매핑하고,

               (2) 누적 값 하나로 리듀스하고,

               (3) 두 RDD 를 서로 빼거나 교차하거나 결합하는 등

다양한 작업 실행할 수 있다. 

)

 

 

컬렉션을 변수를 주어 필터링하면 RDD 에는 분석에 필요한 데이터만 포함된다. 

cache 함수를 호출 해 추후 다른 잡을 수행할 때도 RDD 가 메모리에 계속 유지되도록 지정할 수있다. 

+ Recent posts