스파크 지식 포인트

6851 단어
Spark 의 디자인 사상 
Spark 의 주요 사상 은 새로운 작업 과 데이터 용 착 방식 을 통 해 디스크 와 네트워크 의 IO 비용 을 줄 이 는 것 이다.이 목적 을 실현 하기 위해 그들 은 새로운 추상 적 인 데이터 구조 RDD (ResilientDistributed Datasets) 를 제시 했다.RDD 는 읽 기 전용 데이터 블록 으로 HDFS 에서 데 이 터 를 읽 을 수도 있 고 다른 RDD 를 조작 할 수도 있다.강조해 야 할 것 은 RDD 의 읽 기 전용 특성 은 하나의 RDD 를 조작 하면 결 과 는 반드시 새로운 RDD 임 을 나타 낸다. 코드 에서 도 같은 변 수 를 사용 하여 RDD 에 저 장 된 것 은 실제 데이터 가 아니 라 일부 메타 데이터 정보 이 고 이 RDD 가 어떤 (일부) RDD 를 통 해 얻 었 는 지, 그리고 어떤 조작 을 통 해 얻 었 는 지 기록 했다.컴퓨터 에 서 는 이런 방식 을 나타 내 는 전문 명사 인 lineage 가 있다.lineage 를 통 해 중간 결 과 를 HDFS 에 저장 하지 않 아 도 되 고 노드 가 잘못 되면 lineage 를 통 해 다시 계산 하면 됩 니 다.
데이터 처리 모델
일반적으로 데이터 처리 에 있어 몇 가지 흔 한 모델 이 있 는데 그것 이 바로 Iterative Algorithms, Relational Queries, MapReduce, Stream Processing 이다.예 를 들 어 Hadoop MapReduce 는 MapReduces 모델 을 사 용 했 고 Storm 은 Stream Processing 모델 을 사용 했다.RDD 는 이 네 가지 모델 을 혼합 하여 Spark 가 각종 빅 데이터 처리 장면 에 응용 할 수 있 도록 했다.
전환 과 동작
다음 표 는 Spark 의 RDD 변환 과 동작 을 보 여 줍 니 다.모든 조작 은 표 지 를 제 시 했 는데 그 중에서 괄호 는 유형 적 인 파 라 메 터 를 나타 낸다.앞에서 말 했 듯 이 변환 은 지연 동작 으로 새로운 RDD 를 정의 하 는 데 사 용 됩 니 다.동작 은 계산 작업 을 시작 하고 사용자 프로그램 에 값 을 되 돌려 주거 나 외부 에 데 이 터 를 저장 합 니 다.
표 1  Spark 에서 지원 하 는 RDD 변환 과 동작
바꾸다
map(f : T ) U) : RDD[T] ) RDD[U] filter(f : T ) Bool) : RDD[T] ) RDD[T] flatMap(f : T ) Seq[U]) : RDD[T] ) RDD[U] sample(fraction : Float) : RDD[T] ) RDD[T] (Deterministic sampling) groupByKey() : RDD[(K, V)] ) RDD[(K, Seq[V])] reduceByKey(f : (V; V) ) V) : RDD[(K, V)] ) RDD[(K, V)] union() : (RDD[T]; RDD[T]) ) RDD[T] join() : (RDD[(K, V)]; RDD[(K, W)]) ) RDD[(K, (V, W))] cogroup() : (RDD[(K, V)]; RDD[(K, W)]) ) RDD[(K, (Seq[V], Seq[W]))] crossProduct() : (RDD[T]; RDD[U]) ) RDD[(T, U)] mapValues(f : V ) W) : RDD[(K, V)] ) RDD[(K, W)] (Preserves partitioning) sort(c : Comparator[K]) : RDD[(K, V)] ) RDD[(K, V)] partitionBy(p : Partitioner[K]) : RDD[(K, V)] ) RDD[(K, V)]
동작
count() : RDD[T] ) Long collect() : RDD[T] ) Seq[T] reduce(f : (T; T) ) T) : RDD[T] ) T lookup(k : K) : RDD[(K, V)] ) Seq[V] (On hash/range partitioned RDDs) save(path : String) : Outputs RDD to a storage system, e.g., HDFS
일부 조작 은 키 값 만 사용 할 수 있 습 니 다. 예 를 들 어 join.또한, 함수 명 은 Scala 및 기타 함수 식 언어 중의 API 와 일치 합 니 다. 예 를 들 어 map 는 1 대 1 의 맵 이 고, flatMap 은 모든 입력 을 하나 이상 의 출력 으로 표시 합 니 다 (MapReduce 의 map 와 유사 합 니 다).
이 동작 외 에 도 RDD 캐 시 를 요청 할 수 있 습 니 다.그리고 사용 자 는 Partitioner 류 를 통 해 RDD 의 파 티 션 순 서 를 얻 은 다음 다른 RDD 를 같은 방식 으로 파 티 션 할 수 있 습 니 다.어떤 조작 은 그룹 바 이 키, reduceByKey, sort 등 해시 나 범위 구역 의 RDD 를 자동 으로 생 성 합 니 다.
의지 하 다
RDD 는 데이터 구조 로 서 본질 적 으로 읽 기 전용 파 티 션 기록 집합 이다.하나의 RDD 는 여러 개의 파 티 션 을 포함 할 수 있 으 며, 파 티 션 마다 dataset 세 션 입 니 다.RDD 는 서로 의지 할 수 있다.
narrow dependency: RDD 의 각 파 티 션 이 Child RDD 의 한 파 티 션 에서 만 사용 할 수 있다 면;
wide dependency: RDD 의 각 파 티 션 은 여러 Child RDD 에 의존 합 니 다.
서로 다른 조작 은 그 특성 에 따라 서로 다른 의존 이 생 길 수 있다.예 를 들 어 map 작업 은 narrow dependency 가 발생 하고 join 작업 은 wide dependency 가 발생 합 니 다.
Spark 가 의존 을 narrow 와 wide 로 나 누 는 이 유 는 두 가지 이유 에서 다.
우선, narrow dependencies 는 같은 cluster node 에서 파이프 형식 으로 여러 명령 을 수행 하 는 것 을 지원 할 수 있 습 니 다. 예 를 들 어 map 를 실행 한 후에 filter 를 수행 하 는 것 입 니 다.반면, wide dependencies 는 모든 부모 구역 을 사용 할 수 있어 야 하 며, MapReduce 와 같은 조작 으로 크로스 노드 를 전달 해 야 할 수도 있 습 니 다.
그 다음은 실패 회복 차원 에서 본다.narrow dependencies 의 실패 회복 은 더욱 효과 적 입 니 다. 잃 어 버 린 parent partition 을 다시 계산 하면 되 고 서로 다른 노드 에서 동시에 재 계산 할 수 있 기 때 문 입 니 다.와 이 드 dependencies 는 RDD 각급 여러 Parent Partitions 와 관련된다.
RDD 는 어떻게 데이터 처리 효율 을 보장 합 니까?
RDD 는 두 가지 특성 인 persistence 와 patitioning 을 제공 합 니 다. 사용 자 는 persist 와 patitionBy 함 수 를 통 해 RDD 의 두 가지 측면 을 제어 할 수 있 습 니 다.RDD 의 파 티 션 특성 과 병렬 컴 퓨 팅 능력 (RDD 는 parallerize 함 수 를 정의 합 니 다) 은 Spark 가 신축 가능 한 하드웨어 자원 을 더욱 잘 이용 할 수 있 도록 합 니 다.분 구 와 지구 화 두 가 지 를 결합 하면 대량의 데 이 터 를 더욱 효율적으로 처리 할 수 있다.예 를 들 면:
input.map(parseArticle _).partitionBy(partitioner).cache()

partition By 함 수 는 다음 과 같은 Partitioner 대상 을 받 아들 여야 합 니 다.
val partitioner = new HashPartitioner(sc.defaultParallelism)

RDD 는 본질 적 으로 메모리 데이터 세트 로 RDD 에 접근 할 때 포인터 가 조작 과 관련 된 부분 만 가리킨다.예 를 들 어 열 을 대상 으로 하 는 데이터 구조 가 존재 하 는데 그 중 하 나 는 Int 로 이 루어 진 배열 이 고 다른 하 나 는 Float 로 이 루어 진 배열 이다.Int 필드 에 만 접근 하면 RDD 의 지침 은 Int 배열 에 만 접근 하여 전체 데이터 구조 에 대한 검색 을 피 할 수 있 습 니 다.
RDD 는 조작 을 두 가지 로 나 누 었 다. transformation 과 action.몇 번 이나 transformation 작업 을 실 행 했 든 RDD 는 연산 을 제대로 수행 하지 않 고 action 작업 이 실 행 될 때 만 연산 이 실 행 됩 니 다.한편, RDD 의 내부 실현 체제 에서 바 텀 인 터 페 이 스 는 교체 기 를 바탕 으로 데이터 접근 을 더욱 효율 적 으로 만 들 고 대량의 중간 결과 가 메모리 에 대한 소 모 를 피한다.
이 를 실현 할 때 RDD 는 transformation 작업 에 대해 RDD 에서 계승 하 는 유형 을 제공 합 니 다. 예 를 들 어 map 작업 은 MappedRDD 로 돌아 가 고 flatMap 은 FlatMappedRDD 로 돌아 갑 니 다.맵 이나 flatMap 작업 을 수행 할 때 현재 RDD 대상 을 해당 하 는 RDD 대상 에 게 전달 하 는 것 에 불과 합 니 다.예 를 들 면:
def map[U: ClassTag](f: T => U): RDD[U] = new MappedRDD(this, sc.clean(f))

RDD 에서 계승 하 는 클래스 들 은 모두 compute 함 수 를 정의 합 니 다.이 함 수 는 action 작업 이 호출 될 때 실 행 됩 니 다. 함수 내부 에 서 는 교체 기 를 통 해 대응 하 는 변환 작업 을 합 니 다.
private[spark]
class MappedRDD[U: ClassTag, T: ClassTag](prev: RDD[T], f: T => U)
  extends RDD[U](prev) {

  override def getPartitions: Array[Partition] = firstParent[T].partitions

  override def compute(split: Partition, context: TaskContext) =
    firstParent[T].iterator(split, context).map(f)
}
private[spark]
class MappedRDD[U: ClassTag, T: ClassTag](prev: RDD[T], f: T => U)
  extends RDD[U](prev) {

  override def getPartitions: Array[Partition] = firstParent[T].partitions

  override def compute(split: Partition, context: TaskContext) =
    firstParent[T].iterator(split, context).map(f)
}

RDD 오류 지원
지원 오 류 는 보통 두 가지 방식 을 사용 합 니 다. 데이터 복사 나 로그 기록 입 니 다.데 이 터 를 중심 으로 하 는 시스템 에 있어 서 이 두 가지 방식 은 모두 매우 비싸다. 왜냐하면 이 는 클 러 스 터 네트워크 를 통 해 대량의 데 이 터 를 복사 해 야 하기 때문이다. 왜냐하면 대역 폭 의 데 이 터 는 메모리 보다 훨씬 낮 기 때문이다.
RDD 는 천성적으로 잘못 사용 하 는 것 을 지지한다.우선, 그 자 체 는 변 하지 않 는 (immutable) 데이터 세트 입 니 다. 그 다음 에 작업 그림 (Graph of Operation) 을 구축 하 는 것 을 기억 할 수 있 기 때문에 작업 을 수행 하 는 Worker 가 실 패 했 을 때 작업 그림 을 통 해 이전에 실 행 된 작업 을 얻 고 다시 계산 할 수 있 습 니 다.replication 방식 으로 잘못 사용 할 필요 가 없 기 때문에 네트워크 를 뛰 어 넘 는 데이터 전송 원 가 를 잘 낮 출 수 있 습 니 다.
그러나 일부 장면 에서 Spark 도 로 그 를 기록 하 는 방식 으로 잘못 사용 하 는 것 을 지원 해 야 한다.예 를 들 어 Spark Streaming 에서 데이터 에 대해 update 작업 을 하거나 Streaming 이 제공 하 는 window 작업 을 호출 할 때 실행 과정의 중간 상 태 를 복원 해 야 합 니 다.이 때 는 Spark 가 제공 하 는 checkpoint 메커니즘 을 통 해 checkpoint 에서 복구 할 수 있 도록 지원 해 야 합 니 다.
RDD 의 wide dependency 에 대해 가장 효과 적 인 잘못 사용 방식 역시 checkpoint 체 제 를 사용 합 니 다.그러나 Spark 의 최신 버 전 은 여전히 auto checkpointing 메커니즘 을 도입 하지 않 은 것 같다.
총결산
RDD 는 스파크 의 핵심 이자 전체 스파크 의 구조 적 기반 이다.그것 의 특성 은 다음 과 같이 요약 할 수 있다.
그것 은 변 하지 않 는 데이터 구조 저장 소 크로스 클 러 스 터 를 지원 하 는 분포 식 데이터 구조 데이터 에 기 록 된 key 에 따라 구 조 를 구분 할 수 있 습 니 다 굵 은 입자 의 조작 을 제공 하고 이 조작 들 은 모두 구역 을 지원 합 니 다.
그것 은 데 이 터 를 메모리 에 저장 하여 낮은 지연 성 을 제공 했다.

좋은 웹페이지 즐겨찾기