불꽃의 셔플

0 셔플 개요

  셔플, 빅 데이터를 소개하고 분산을 이해합니다. 우리는 데이터가 큰 분산 스토리지에 저장되어있는 것을 알고, 빅 데이터 컴퓨팅 프레임 워크는 분산 컴퓨팅 프레임 워크입니다. 양방향 데이터 전송이 배포되어야한다, 짧은 셔플은 양방향 데이터 전송 과정에서 배포됩니다. 

  아래에 도시 된 바와 같이, 출력 데이터가 블록에 기록 스테이지 0 셔플 라이터를 통과하는 상기 제 1 단계는 블록으로부터 판독 입력 데이터를 필요로 기입 처리는 이러한 중간 결과이다 판독 셔플 번.

  그림 1

  그래서 질문, 왜 직접 일 개 처리 단계로 넘겨 될 수있는 데이터의 0, 셔플은 그것의 과정을 거쳐야 할 단계는 무엇입니까?

  : 여기에 우리가 RDD의 단계 구분에 따라, 분할 무대로 시작하면 폭, 폭에 의존 분할 기준 참조 기사에 의존 https://www.cnblogs.com/beichenroot/p/11414173.html

  이유 RDD의 폭에 따라가, 스파크 점화 분산 컴퓨팅 엔진 RDD 탄성 분산 데이터 세트에 대한 고유 특성은 스파크 로직 유닛 데이터를 처리한다. RDD 데이터 기억 아래와 같이 :도 RDD 데이터는 세 개의 서로 다른 노드 실행기 파티션 (파티션)에 저장되고, 분할 블록 블록의 다른 표시가, 파티션에 세 개의 서로 다른 노드에 대응 있다는 것을 이해할 수있을 것이다 함께 RDD에 파티션을 형성한다.

  폭이 의존하는 경우, 상기 현재 데이터를 다른 노드 RDD 때문에 위로 화제, 종속이 좁은 경우, 즉 서브 - 영역 가동 파티션 사이의 데이터는 데이터를 교환 할 필요가없는, 다른 노드에서 병렬로 분산 컴퓨팅 판독과 다른 파티션으로 송신 된 데이터 요구를 쓰기 데이터가 필연적 셔플 생성된다. 

1.의 중요성을 셔플

  도 1Shuffle 공정의 세 부분을 포함 셔플 공정에서 신 :

  1. Wiiter 셔플

  2. 네트워크 전송

  3. 셔플 的 읽기

  이 세 부분의 작업은 스파크 응용 프로그램의 효율성의 대부분에 영향을 미치는, 메모리 작업, 디스크 I / O, 네트워크 I / O 관리 및 JVM이 포함되어 있습니다. 좋은 코드의 경우, 성능 (95 %)의 대부분은, 로컬 디스크 파일 셔플 쓰기 단계에서 소비 데이터 전송 네트워크와 데이터를 가져올 수 있습니다. 그래서 셔플을위한 최적화 과정의 많은 일을 불꽃.

2. 스파크 셔플 개발 과정

  초기 셔플은 HashShuffle를 사용하는 스파크, 가장 큰 문제는 HashShuffle의 수 (조각의 매퍼 번호 * 감속기의 조각의 수)이다 IO 메모리 소비와 GC의 엄청난 부담이 많은 수의 결과로 너무 많은 파일이 생성;

  아래와 같이 SortedBasedShuffle 파일의 수에 따른 작업지도를 이용하여 생성 스파크 태스크마다 두 맵 파일을 생성하고, 데이터 파일이 프래그먼트에 기록되는 오프셋 파일 슬라이스마다 기록 정보가 존재하지 않습니다. 데이터를 판독 할 때 감소 태스크 우선 파일 내의 오프셋 (offset)로부터 위치 데이터를 취득하고, 데이터 파일의 데이터를 판독한다. 다음과 같이 SortedBasedShuffle 최적화를 가지고, 작업의 번호에 * 셔플 2 맵 파일의 수를 줄일 수 있습니다 :

  1. 매퍼 단부는 작은 메모리 풋 프린트된다

  2. 대규모 데이터 스파크를 처리하는 능력을 향상시키기 위해 (병렬 작업의 수를 증가)

  3. 감속기 종료 시간 적은 데이터 가져 오기

  4. 핸들 네트워크 채널이 덜해진다

  데이터 자체는 감소 된 메모리 소비 인

 

스파크 셔플 세부 내용을 참조 할 수 있습니다 : https://www.cnblogs.com/itboys/p/9226479.html

3. 모듈과 스토리지 사이의 상호 작용을 셔플

  스파크 저장 모듈 저장소로 추출하고, 데이터 기억 시스템을 나타내는 저장 스파크 (차단) 관리 블록에 대한 책임을, 블록은 RDD 파티션에 상당 액세스 데이터의 최소 단위이다.

  저장 추상적 모듈은 두 가지 수준으로 나누어 져 있습니다 :

  1. 통신 레이어 : 기본 구조에서 전형적인 통신 계층 정보 및 마스터와 슬레이브 사이에 전송 제어 상태이다. 주로 BlockManager, BlockManagerMaster, BlockManagerMasterEndPoint 의한 통신 계층은 다른 카테고리 BlockManagerSlaverEndPoint.

  2. 메모리 층 : 그것은 자기 또는 힙 메모리 외부 메모리에 저장된 데이터에 대한 책임이 때때로 원격 노드의 데이터의 사본이 필요하다. 스파크 구현 클래스 및 저장 층 DiskStore MemoryStore있다.

  데이터의 물질은 읽기 및 쓰기 프로세스는 셔플 BlockManager 인터페이스의 조작에 의해 달성된다.

3.1 BlockManager 아키텍처  

 

  1. 응용 프로그램 시작에 SparkEnv에 BlockManagerMaster 및 MapOutputTracker을 등록됩니다

    . BlockManagerMaster : 블록 데이터는 전체 클러스터를 관리 할 수

    . MapOutputTracker B : 모든 매퍼 출력 추적

  2. BlockManagerMaster BlockManagerMasterEndPoint를 구축하기 위해 만들어, BlockManagerMasterEndPoint 자체는 원격 통신의 방법으로 BlockManager 모든 노드를 관리 할 책임이 메시지 본문입니다.

  3. ExecutorBackend, BlockManager가 원격 통신 BlockManagerMaster 의해 인스턴스화하고, 등록이 시작되지 않았다 실행자 실질적 레지스터 BlockManager 주어진 BlockManagerMasterEndPoint에게 운전을 시작할 때.

  4. MemoryStore BlockManager 클래스는 읽기 및 쓰기 데이터 및 메모리를 저장하기위한 책임이 있습니다.

  5. DiskStore 읽고 디스크 데이터 저장 클래스 BlockManager 책임을 작성합니다.

  6. DiskBlockManager : 디스크 디스크 파일에 대한 논리 블록 관리 및 물리적 블록 사이의 매핑 및 작성, 읽기, 쓰기에 대한 책임이 있습니다.

3.2 셔플 BlockManager 상호 작용할

3.2.1 셔플 쓰기 데이터

  정렬 구현 기반 ShuffleHandle 포함 BypassMergeSortShuffleHandle 및 BaseShuffleHandle, 예 SortShuffleWriter 빗 여기, ShuffleHandle 클래스 BypassMergeSortShuffleWriter 및 SortShuffleWriter에 대응하는 기록 데이터의 두 종류 셔플.

  다음 쓰기 방법에 의해 달성 데이터를 기록 SortShuffleWriter, 우리는 먼저 ShuffleBlockResolver에 의한 데이터 파일에 도착해야합니다.

   / **이 작업의 출력에 레코드의 무리를 쓰기 * / 
  무시 데프 쓰기 (기록 : 반복자 [제품 2 [K, V]]) : 단위 = { 
  ... 
    // 병합 열 수있는 시간을 포함하여 귀찮게하지 마십시오 셔플 쓰기 시간에서 출력 파일은 
    단지 하나의 파일을 열기 때문에 // 그래서 일반적으로 정확하게 측정 할 너무 빠른 
    // (SPARK-3570 참조).     발 출력 = shuffleBlockResolver.getDataFile (dep.shuffleId,의 mapId)   ...   발 Utils.tempFileWith TMP = (출력)   시도 {     브로 BLOCKID = ShuffleBlockId (dep.shuffleId,의 mapId, IndexShuffleBlockResolver.NOOP_REDUCE_ID)     브로 partitionLengths = sorter.writePartitionedFile (BLOCKID , TMP)






    shuffleBlockResolver.writeIndexFileAndCommit (dep.shuffleId,의 mapId, partitionLengths, TMP)

  당신이 실제로 blockManager에 의해 획득 된 데이터를 볼 수 있습니다 IndexShuffleBlockResolver의 상세한 통화 getDataFile 방법 ShuffleBlockResolver의 서브 클래스입니다.

데프 getDataFile (shuffleId : INT,의 mapId : INT) : 파일 = { 
    blockManager.diskBlockManager.getFile (ShuffleDataBlockId (shuffleId,의 mapId, NOOP_REDUCE_ID)) 
  }

  이어서 ShuffleBlockId 데이터 writePartitionedFile ExternalSorter 방법의 최종 기록을 생성한다. 호출의 물질 writePartitionedFile 쓰기 방법 blockManager에 아직도있다. 그래서 Shffle는 기본 데이터가 blockManager에 의해 실현된다 물품.

DEF writePartitionedFile ( 
      BLOCKID : BLOCKID, 
      출력 _ : 파일) 배열 [롱] = { 

    // 출력 파일의 각 영역의 위치 추적 
    발 길이 = 새 Array [롱 (numPartitions) 
    브로 라이터 = blockManager.getDiskWriter (BLOCKID, 출력 _ , serInstance, fileBufferSize, 
      context.taskMetrics (). shuffleWriteMetrics)

3.2. 셔플은 데이터를 읽고

  셔플 대해 getReader의 데이터 판독기 SortShuffleManager로부터 검색되는 데이터를 판독 대해 getReader 방법은 BlockStoreShuffleReader 인스턴스를 생성한다. ,

  BlockStoreShuffleReader 첫번째 읽기 방법은 ShuffleBlockFetcherIterator를 인스턴스화합니다. 읽고 메모리와 디스크 관리 blockManager ShuffleBlockFetcherIterator 멤버에 데이터를 기록.

  * ShuffleBlockFetcherIterator 랜덤 방식으로 대기열 원격 요청 로컬 및 원격 splitLocalRemoteBlocks 분할 블록 Utils.randomize (remoteRequests)는, 원격 전송 요청 취득 블록 로컬 블록을 획득 fetchLocalBlocks fetchUpToMaxBytes.

 

추천

출처www.cnblogs.com/beichenroot/p/11417668.html