2016-10-22 3 views
6

같은 노드에있는 모든 실행 프로그램이 사용하기를 원하는 정말 큰 읽기 전용 데이터가 있습니다. Spark에서 가능합니까? 나도 알다시피, 당신은 변수를 방송 할 수 있지만, 정말로 큰 배열을 방송 할 수 있습니까? 후드 아래에서 동일한 노드의 집행자간에 데이터를 공유합니까? 동일한 노드에서 실행되는 executor의 JVM간에 데이터를 어떻게 공유 할 수 있습니까?스파크에서는 두 명의 집행자간에 데이터를 공유 할 수 있습니까?

+0

데이터가 실행 프로그램에 어떻게 고정되어 있습니까? 해결하려는 문제를 설명해 주시겠습니까? – maasg

+1

기본적으로 약 6GB의 읽기 전용 데이터가 있습니다. 이 데이터는 조회 테이블의 일종으로 각 실행자가 수시로 읽어야합니다. 각 실행 프로그램은 전체 찾아보기 테이블에 액세스 할 수 있어야합니다. 나는 각 집행 인에게 많은 기억을주고 싶지 않다. 동일한 노드에서 실행되는 집행자간에 메모리를 공유하여 각 집행자에게 메모리를 거의주지 않아도되도록합니다. – pythonic

+5

로컬 서비스를 사용하는 것처럼 들릴 수 있습니다. 예 : 해당 데이터를 로컬 Redis (또는 유사한 메모리 내 db/cache)에로드하고 Spark 작업의 싱글 톤 JVM 객체를 사용하여 로컬 인스턴스를 처리합니다. 새로 고침을하는 관리 서비스도 필요합니다. 당신이 원하는 것을 성취 할 수있는 즉시 사용 가능한 스파크 솔루션이 있다고 생각하지 않습니다. – maasg

답변

5

예, 데이터가 읽기 전용 (불변) 인 것으로 간주 할 때 broadcast 개의 변수를 사용할 수 있습니다. 브로드 캐스트 변수는 다음 속성을 만족해야합니다. 클러스터

에 분산

  • 불변의 메모리에

    • 맞추기 그래서, 여기에 유일한 조건은 데이터가 하나 개의 노드의 메모리에 맞게 할 수 있어야한다. 이는 데이터가 초대형이거나 거대한 테이블처럼 메모리 한계를 초과해서는 안된다는 것을 의미합니다.

      각 실행자는 브로드 캐스트 변수의 사본을 수신하고 특정 실행자의 모든 태스크가 해당 데이터를 읽고 사용합니다. 이것은 클러스터의 모든 작업자 노드에 큰 읽기 전용 데이터를 보내는 것과 같습니다. 즉 각 작업자가 아닌 각 작업자에게 한 번만 보내고 집행자 (작업 임)는 데이터를 읽습니다.

  • +0

    @pythonic은 "의 JVM간에 데이터를 공유하는 방법"을 묻습니다. –

    +0

    @LostInOverflow 나는이 질문이 약간의 혼란을 일으킨다 고 생각한다. OP가 올바른 문구를 사용하고 있지 않습니다. 2 명의 실행자! = 2 개의 애플리케이션 JVM – eliasah

    +0

    그렇습니다. JVM 공유에 대한 대답은 Apache Spark는 분산 데이터 처리 프레임 워크입니다. 따라서 여기에서는 작업/응용 프로그램/작업 또는 RDD를 공유 할 수 없습니다. HDFS와 같은 영구 저장소를 통해 데이터를 공유하는 유일한 방법입니다. IgniteRDD라는 RDD 위에 추상화를 제공하는 프레임 워크 인 Apache Ignite는 RDD의 상태를 다른 작업, 응용 프로그램 및 작업자와 공유하는 Spark RDD 및 DataFrame API를 구현합니다. – Kris

    관련 문제