Spark Boradcast 원리

3830 단어 Spark
  • 방송 안내
  • TorrentBroadcast
  • 드라이버 단자
  • Executor end

  • 방송 안내
    Spark 가 제공 하 는 방송 변 수 는 패 킷 함수 가 외부 큰 변 수 를 인용 하여 발생 하 는 성능 문 제 를 해결 할 수 있 습 니 다.Spark 는 통신 원 가 를 낮 추기 위해 효율 적 인 방송 알고리즘 을 사용 하여 방송 변 수 를 나 누 어 준다.방송 변 수 는 읽 기 전용 으로 모든 기계 의 로 컬 에 캐 시 되 고 효율 적 인 방식 으로 각 노드 에 대형 입력 데이터 세트 의 사본 을 제공 할 수 있 습 니 다.
    방송 변수의 가장 중요 한 특징 은 같은 실행 기 에 있 는 모든 작업 이 하나의 변수 복사 본 을 사용 하 는 것 이 아니 라 이 Broadcast 를 공유 할 수 있다 는 것 이다.
    방송 변 수 는 가 변 변수 val v 에서 호출 SparkContext.broadcast(v) 방법 으로 생 성 된다.방송 변 수 는 변수 v 의 포장 기 로 그 값 은 호출 value 방법 으로 얻 을 수 있다.
    scala> val broadcastVar = sc.broadcast(Array(1,2,3,4))
    broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(2)
    
    scala> broadcastVar.value
    res9: Array[Int] = Array(1, 2, 3, 4)

    Spark Action 작업 의 실행 은 몇 개의 Stage 를 거 칩 니 다. 이 단 계 는 분포 식 Shuffle 작업 으로 구 분 됩 니 다.Spark 는 모든 단계 에서 작업 에 필요 한 공동 데 이 터 를 자동 으로 방송 합 니 다. 이런 방식 으로 방송 하 는 데 이 터 는 직렬 화 된 방식 으로 캐 시 되 고 모든 작업 을 실행 하기 전에 반 직렬 화 됩 니 다.이 는 명시 적 으로 방송 변 수 를 만 드 는 것 은 여러 단 계 를 뛰 어 넘 는 작업 이 같은 데 이 터 를 필요 로 할 때 나 역 직렬 화 된 형식 으로 데 이 터 를 캐 시 할 때 만 유용 하 다 는 뜻 이다.
    방송 변 수 를 만 든 후에 클 러 스 터 를 실행 하 는 모든 함수 에서 방송 변 수 를 사용 해 야 합 니 다. 원시 변수 v 가 아 닌 방송 변 수 를 사용 해 야 합 니 다. 그러면 v 노드 에 여러 번 보 내지 않 습 니 다.또한 모든 노드 가 같은 방송 변 수 를 가지 도록 변수 v 가 방송 되 고 나 서 더 이상 수정 되 지 않도록 val 유형 으로 밝 혀 야 한다.
    TorrentBroadcast
    Broadcast 의 전통 적 인 실현 은 HTTP Broadcast 이다. 말 그대로 Driver 를 data server 로 하 는 것 이다. 모든 Executor 는 http 프로 토 콜 을 통 해 Driver 에 게 서 데 이 터 를 끌 어 올 리 는데 Http Broadcast 의 가장 큰 문 제 는 driver 가 있 는 노드 에 네트워크 가 막 힐 수 있다 는 것 이다.
    HTTP 브 로드 캐 스 트 의 네트워크 정체 문 제 를 해결 하기 위해 스파크 는 또 하나의 브 로드 캐 스 트 를 새롭게 설계 하여 Torrent Broadcast 라 고 부른다.흔히 볼 수 있 는 BitTorrent 기술 과 유사 하 게 기본 사상 은 data 를 하나의 Blocks 로 나 누 어 Driver 의 BlockManager 에 저장 하 는 것 이다.현재 일부 Executors 가 blocks 를 얻 었 다 고 가정 하면 이 Executors 들 은 data server 가 될 수 있 습 니 다.fetch 의 Executor 가 점점 많아 지면 서 더 많은 data server 가 가입 하 는 것 을 의미 합 니 다. 그러면 data 는 곧 모든 Executor 에 전송 할 수 있 습 니 다.다음은 토 렌 트 브 로드 캐 스 트 의 구체 적 인 세부 사항 을 논의 하 겠 습 니 다.
    드라이버 엔 드
  • Driver 는 먼저 data 를 byte array 로 정렬 한 다음 에 block Size 크기 의 data blocks (Array [ByteBuffer]) 로 잘 랐 다.
  • 절단 을 마 친 후 각 블록 데 이 터 를 driver 자신의 BlockManager 에 저장 하고 StorageLevel 은 MEMORY 입 니 다.AND_DISK_SER, 저장 이 완료 되면 BlockManager Master 에 보고 합 니 다.

  • 실행 자 측
  • 먼저 로 컬 에서 완전한 데 이 터 를 캐 시 했 는 지 확인 하고 조회 가 되면 즉시 되 돌려 줍 니 다.그렇지 않 으 면 드라이버 나 다른 Executor 에서 Torrent 블록 을 가 져 옵 니 다.
  • 새로 만 든 그룹 readBlocks 은 원 격 에서 가 져 온 Block 을 저장 하 는 데 사 용 됩 니 다. 이 어 무 작위 색인 순서 (5 개의 블록 이 있다 고 가정 하면 흐 트 러 진 후에 끌 어 온 색인 순 서 는 3 - 1 - 4 - 2 - 5) 에 따라 하나씩 fetch block data 를 제거 할 수 있 습 니 다.
  • 모든 block data 는 하나의 유일한 id (예 를 들 어 broadcast xx piece 0) 를 가지 고 있 습 니 다. 먼저 이 id 에 따라 BlockManager 에 게 로 컬 에 데이터 가 있 는 지, 있 으 면 배열 에 데 이 터 를 색인 에 대응 하 는 위 치 를 조회 합 니 다.그렇지 않 으 면 id 에 따라 BlockManager 에 원 격 으로 데 이 터 를 끌 어 옵 니 다.
  • BlockManager 는 먼저 Driver 에 해당 하 는 블록 이 어떤 locations 에 존재 하 는 지 조회 합 니 다. 현재 Executor 는 무 작위 로 하나의 location 을 선택 하여 다운로드 하고 다운로드 가 완료 되면 BlockManager Master 에 게 보고 합 니 다.다운로드 한 Executor 가 많 을 수록 이 location 도 많 고 data block 서버 도 많아 집 니 다.
  • 모든 BlockData 를 가 져 오 면 (모든 BlockData 는 Array [BlockData] 에 저 장 됩 니 다) 이 어 이 array 의 블록 데 이 터 를 역 직렬 화 하여 원본 data 를 얻 습 니 다.마지막 으로 현재 Executor 의 BlockManager 에 데 이 터 를 넣 습 니 다. 나중에 데 이 터 를 다시 가 져 올 때 로 컬 에서 직접 얻 을 수 있 습 니 다.
  • 좋은 웹페이지 즐겨찾기