본문 바로가기

데이터처리/spark

Spark - RDD 생성 방법과 동작 과정

Contents

  • RDD 의 생성 방법
  • RDD의 동작 과정

 

Resilient Distributed Datasets (RDDs)

Spark 는 병렬로 동작할 수 있는 , 결함이 생겨도 복구가 가능한 컬렉션인 RDD 의 개념을 중심으로 한다.

RDD 를 생성하는 방법은 2가지가 있다.

 

1. driver 프로그램에서 기존 컬렉션을 병렬로 만들기

2. HDFS , HBase 같은 공유 파일 시스템에서 데이터셋을 참조 하기

 

- Parallelized Collections

1. 기존 컬렉션을 병렬로 만들기

기존 컬렉션을 RDD 로 만드는 방법은

JavaSparkContext의 parallelize 메소드를 이용해 생성한다.

컬렉션의 elements 는 병렬로 동작할 수 있는 분산 dataset 을 형성하기 위해 복사된다.

 

한번 생성되면, 분산된 dataSet 이 병렬로 운영 할 수 있다.

예를들면 distData.reduce((a, b) -> a + b) 를 실행하면 목록의 elements 를 추가할 수 있다.

 

병렬 수집을 하기 위해 중요한 파라미터는 dataset 을 잘라낼 파티션 의 수 다

스파크는 한 task 를 클러스터에 있는 각각의 파티션에 실행을 시킨다.

일반적으로 클러스터의 각 CPU가 2~4 파티션들을 사용한다.

보통은 스파크는 클러스터의 맞춰서 자동으로 파티션의 수를 정하지만 ,

원한다면 매개변수를 넣어서 파티션 수를 정할 수 있다.

 

ex) sc.parallelize(data, 10) 

 

- External Datasets

Spark 는 Hadoop 에서 지원하는 모든 스토리지 소스에서 분산 데이터 셋 을 생성할 수 있다.

Text file RDD 는 SparkContext 의 textFile 메소드로 만들 수 있다.

 

이 메소드는 파일의 URI(hdfs://, s3a://, etc URI) 를 사용해서 행 집합으로 read 한다.

JavaRDD 파일이 일단 생성되면, dataset 작업들에 의해 동작 할 수 있다.

예를들면, map 과 reduce 메소드를 통해 모든 행들에 사이즈를 합칠 수 있다.

ex)  distFile.map(s -> s.length()).reduce((a, b) -> a + b).

 

 

*파일을 읽을 때 참고사항

 

1. 디렉토리나 와일드 카드 를 사용해서 읽을 수 있다. ex) textFile("/my/directory"), textFile("/my/directory/*.txt"), textFile("/my/directory/*.gz")

 

2. HDFS 에서는 블록이 기본적으로 128mb 인데, 

스파크는 기본적으로 파일의 각 블록에 대해 하나의 파티션을 생성하지만,

textFile 에 두번째 파라미터에 값을 넣어서 더 많은 수의 파티션을 요청 할 수 도 있다.

 

 

RDD Operations

RDD는 2가지 타입의 작업을 지원한다.

Transformation : 기존 dataset 에서새로운 dataSet 을 생성시킴

actions : dataSet 에 계산 을 실행 한 후 드라이버 프로그램에 값을 반환하는 동작

 

예를들어, Map 은 각 데이터 집합 요소를 함수를 통해 전달하고, 결과를 새로운 RDD 에 반환하는 Transformation 이다.

반면 reduce 는 RDD 의 모든 요소를 계산하고, 결과를 드라이버 프로그램에 반환하는 action 이다.

 

모든 스파크의 transformation 은 Lazy 하다. 

transformation 은 오직 action 결과를 드라이버 프로그램에 return 할 때만 계산된다.

 

기본적으로 RDD 는 작업을 실행 할 때마다 다시 계산 할 수 있다.

그러나 캐시를 사용하여 메모리에 RDD 를 유지 할 수 도 있고 ,

이 경우엔 클러스터에 elements를 보관하게 된다.