스파크 최적화 요약 (3 개) - 매개 변수 조정

스파크 최적화 요약 (3 개) - 매개 변수 조정

머리말

  • 마술 마법의 즉시 좋은 결과를 얻을 수있는 매개 변수를 수정 기대하지 마십시오! 당신은 맛을 풍부하게 할 수 향신료의 요리로 함께 인수를 넣어,하지만 주로 원료 및 조리 기술의 품질에 의존한다 (때로는 효과 ^ _ ^ 정말 좋은 것입니다).
  • 스파크 응용 프로그램을 개발할 때, 그것은 당신의 애플리케이션 코드를 최적화하기 위해 잘해야합니다 (필수 매개 변수 저장) 조정 최적화 매개 변수를 다시 생각한다.
  • 매개 변수의 조정은, 다른 코드가 동일한 매개 변수를 생산 다른 결과가 발생할 것보다 복잡한 주제, 다른 환경입니다. 우리는 프로덕션 환경, 좋은 명백한 문제 후 코드의 최적화를 결정하는 것이 좋습니다 후, 테스트 파라미터 조정을한다.
  • 참조로, 목록 일부 매개 변수가 개발에 사용하고, 설명을 다음

간단한 예

  • 작업 제출 예 불꽃

    spark-submit \
    --queue test_queue --master yarn --deploy-mode cluster \
    --num-executors 10 --executor-memory 8G --executor-cores 4 \
    --driver-memory 4G --driver-cores 2 \
    --conf spark.network.timeout=300 \
    --conf spark.locality.wait=9s \
    --class com.skey.spark.app.MyApp /home/jerry/spark-demo.jar 
    
  • 매개 변수 설명

    • -Queue test_queue는 test_queue 위의 작업 큐 원사에 제출됩니다
    • ○ 석사 실 작업은 상단 YARN에서 실행됩니다
    • -deploy 모드 클러스터 지정 클러스터 모드
    • -num-10 실행기 지정된 개시 10 개 실행자 프로세스
    • -executor 메모리 8G 8G 메모리 각 실행기에 할당
    • -executor 코어 (4) 각각의 할당 된 실행 프로그램의 코어 (4)는, 코어는 스레드에 대응
    • 드라이버 - 드라이버를위한 메모리 4G 4G 메모리 할당 프로세스
    • - 드라이버 코어 2 드라이버 코어는 스레드에 대응하는, 2 개의 코어를 할당
    • -conf spark.network.timeout = 300S는 300S의 클러스터 네트워크 통신 지연 내에 배치
    • 노드가 집행자을 시작하지 여분의 자원을 않는 경우 -conf spark.locality.wait = 9S 현지화 데이터 세트는 시간 대기, 대기 시간을로드
    • 실행에 스파크 지정된 응용 프로그램 클래스 -class com.skey.spark.app.MyApp 필요
    • /home/jerry/spark-demo.jar 실행에 항아리 패키지 요구 사항을 지정

공통 매개 변수

  • 다음 매개 변수에 나와있는 스파크의 2.4.3 구성 표준을
  • spark.memory.useLegacyMode
    • 기본값 : 거짓
    • 설명 : (인 텅스텐 프로그램 메모리 모델, 1.6 이전 버전 전에입니다) 메모리 관리의 유산을 사용할지 여부를이 매개 변수를 제어하는 ​​데 사용됩니다. 레거시 모드 메모리 spark.storage.memoryFraction (0.6) + spark.shuffle.memoryFraction (0.2) + 디폴트 (0.2) 조성물.
    • 권장 사항 : 켤 수 없습니다 응용 프로그램을 개발하기 시작, 당신은 동적 할당을 지시 할 수있다. 개발이 완료되면 응용 프로그램이 스토리지의 양이, 대신 진정한 시도 할 때 그렇게 동적으로 할당되지 않은 메모리를 수행 때마다 셔플 판단 할 수있는 경우, (시간이 소요가 필요합니다). 또한, 동적 할당 모드 실행에 관계없이 스토리지로 복귀되지 않아도, 그 몇 가지 문제점이 발생할 수없는 필요성 저장 메모리에서 차용.
  • spark.storage.memoryFraction
    • 기본 : 0.6
    • 설명 : 캐시 메모리 섹션을 제어하기위한, 진정한 효과적인 spark.memory.useLegacyMode로 설정
    • 권장 사항 : 캐시 된 데이터가 상대적으로 큰 경우, 당신은 매개 변수를 설정할 수 있습니다
  • spark.shuffle.memoryFraction
    • 기본 : 0.2
    • 설명 : 진정한 효과 spark.shuffle.memoryFraction로 설정하면, 셔플 섹션 제어
    • 권장 사항 : 당신이 (쓰기에 오버 플로우) 유출 자주 발생하는 경우, 당신은 매개 변수를 설정할 수 있습니다. 이 매개 변수의 큰 캐시 거의 하드 조정할 경우 응용 프로그램 ^ _ ^
  • spark.storage.unrollFraction
    • 기본 : 0.2
    • 설명 : spark.memory.useLegacyMode은 20 % spark.storage.memoryFraction를 차지의 직렬화 / 역 직렬화에 대한 사실 유효한, 캐시 된 데이터입니다
    • 제안 : 당신은 전송할 수 없습니다
  • spark.executor.memoryOverhead
    • 기본 값 : executorMemory * 0.10, 가장 낮은 384M
    • 설명 : 각 힙 메모리는 주로 자신의 JVM, 문자열, NIO 버퍼 및 기타 경비, 집행자 외부에 제공됩니다. 컨테이너와 동일한 메모리 - 집행자 메모리. (이 매개 변수는 공식 웹 사이트에서 발견되지 않음)
    • 추천 : 중고 스파크가 NIO에 기반 NIO 직접 메모리 공간 효율이 매우 높고, 그 외측 힙 영역에 할당 된 메모리의 적절한 부분이 될 수있다.
  • spark.locality.wait
    • 기본 값 : -3
    • 해석 : 현지화 긴 미세한 조정을위한 세 개의 하위 매개 변수 (spark.locality.wait.node, spark.locality.wait.process, spark.locality.wait.rack)를 포함하여, 지정된 데이터 대기 시간.
    • 권장 사항 : 일반적으로, 균일 한 조정 spark.locality.wait이 될 수 있습니다. 적절하게 많은 양의 데이터, 우리는 더 나은, 지역화 할 수있는 경우 특히, 대기 시간이 연장 될 수 있습니다.
  • spark.network.timeout
    • 기본 값 : 120 초
    • 설명 : 스파크 메모리 통신 지연 네트워크
    • 권장 사항 : 불꽃 신청 과정은 시간이 많이 걸리는 경우에는 지연으로 인한 오류를 방지하기 위해 적절한 매개 변수 (예 : 300S)를 높일 수 있습니다
  • spark.default.parallelism
    • 기본값 : 없음
    • 설명 : 지정 RDD 셔플 작업의 파티션의 수, 예를 들어 reduceByKey의이 같은 가입 할 수 있습니다. 운영자 지정 우선 순위 서브 - 파티션 번호, 그렇지 spark.default.parallelism 값 또는 격벽 상위 RDD의 수의 값이 사용되는 경우없는 값을 이용하여, 셔플 카운트 자정 전화. 셔플에 잘못된 SQL.
    • 권장 사항 : 당신이 미세 제어를 원하는 경우, 사업자는 다음 각 셔플을위한 병렬 처리 값을 추가하고자하는 ^ _ ^ 설정하지 마십시오. 값이 제 세트에게 추천 (예를 들어, 코어의 2-3 회 전체), 다음 코드는이 디폴트 값을 덮고, 오퍼레이터 서브 셔플 매개 변수 전달을 조절해야한다. (DO 병렬 온라인 말도 어느 정도를 믿기로 오해 할 수 없습니다)
  • spark.sql.shuffle.partitions
    • 기본 : 200
    • 설명 : SparkSQL 셔플의 이행을위한 파티션 지정 번호입니다. (이 매개 변수는 공식 웹 사이트에서 발견되지 않음)
    • 권장 사항 : 당신은 코어의 총 수보다 200 이하 기본 경우 실행 셔플, 자원의 낭비가 될 것이다 SQL. 권장 설정은 전체 코어의 2 ~ 3 배이다.
  • spark.jars
    • 기본값 : 없음
    • 설명 : (쉼표로 구분)을 지정 항아리 패키지, 드라이버, 집행자 끝을 확산한다
    • 권장 사항 : 불꽃 lib 디렉토리 아래의 패키지 또한, 라이브러리는 다른 추가 참조를 지정하는 것이 좋습니다. (클라이언트 모드에서 전용 드라이버 라이브러리를 사용합니다, 당신은 전달할 수 없습니다)
  • spark.jars.excludes
    • 기본값 : 없음
    • 설명 : 충돌을 의존 방지, 패킷을 배제하지 마십시오. 형식의 groupId : artifactId를
    • 권장 사항 : ...
  • spark.executor.userClassPathFirst 与 spark.driver.userClassPathFirst
    • 기본값 : 거짓
    • 설명 : 우선 순위가 사용됩니다 여부를로드 사용자 지정 단지로 지정
    • 권장 사항 : 사용자가 지정한 기본 항아리와 스파크 문제 귀하의 항아리 없음 문제가있는 경우 충돌이, 당신이 결정할 수 있습니다 때 충돌 할 수 있습니다 라이브러리 항아리 패키지가 있기 때문에, true로 설정할 수 있습니다. (버그가 발생하기 전에 화웨이는 하나의입니다)
  • spark.driver.maxResultSize
    • 기본값 : 1g
    • 설명 : 최대 양 드라이버 데이터 단자, 예를 들면, 수집 작업을
    • 권장 사항 : 때때로 많은 양의 데이터, 매개 변수는 데이터의 양에 따라 조정할 수 있습니다 직접 풀 필요할 수 있습니다.
  • spark.reducer.maxSizeInFlight
    • 기본 값 : 48m
    • 설명 : 각 데이터의 최대 양을 잡아 작업을 감소
    • 표준은 각 출력 소비가 비교적 큰 버퍼를 생성 할 필요가있다. 메모리가 큰 경우에는 값, 인상 속도까지 증가 할 수있다.
  • spark.shuffle.file.buffer
    • 기본 값 : 32K
    • 그는 설명 : 셔플, 출력 데이터를 파일의 버퍼 크기, 버퍼를 작성 후, 데이터가 디스크 오버 플로우에 기록됩니다.
    • 권장 사항 : 값을 설정하면 디스크 (I / O의 감소)에 오버 플로우의 수를 줄일 수는 성능을 향상시킬 수 있습니다. 적절한 메모리, 당신은 64K로, 최대 해제 할 수 있습니다.
  • spark.shuffle.io.maxRetries
    • 기본값 : 3
    • 설명 : 쓰기 측 엔드 당겨 데이터 재시도 수에서 읽을 셔플 시간을,
    • 권장 사항 : 풀은, 사고를 방지하기 위해 재시도 횟수에 적절한 증가 실패에 대한 GC, 네트워크 지연 및 다른 문제가 발생할 수 있기 때문에.
  • spark.shuffle.io.retryWait
    • 초기 값 : 5 초
    • 설명 : spark.shuffle.io.maxRetries 각 재시도 오래 기다릴 필요가
    • 제안은 : 안정성을 향상시키기 위해 증가 될 수있다
  • spark.shuffle.manager
    • 기본 값 : 종류
    • 설명 : 디스크 모드로 문서 출력 관리를위한 shuflle. 권장 바이두는 상세한 흐름을 볼 수 있습니다. 기본 HashShuffleManager 전에 버전 1.2, 기본 후 SortShuffleManager입니다. 2 더 이상이 매개 변수가 점화 후 직접 SortShuffleManager, 기본 데이터 정렬되지 않습니다됩니다.
    • 제안 : 당신이 spark.shuffle.sort.bypassMergeThreshold 조정을 기준으로 정렬 할 수 있습니다.
  • spark.shuffle.sort.bypassMergeThreshold
    • 기본 : 200
    • 설명 : 이하 200 이상 읽기 작업 번호, 바이 패스 메커니즘을 가능하게 할 것이다 경우 shffle는 경우 : 정렬 작업이 결국 작업을 생성 한 파일을 병합하고, 인덱스를 생성하지 않습니다
    • 권장 사항 : 정렬 필요가없는 것은,이 매개 변수를 증가시킬 수있다, 당신은 작업 셔플의 수보다 큰 읽어 보시기 바랍니다. (유무 좋은 효율 향상이, 내 응용 프로그램 중 하나는 시간의 20 % 감소)
  • spark.kryo.registrationRequired
    • 기본값 : 거짓
    • 설명 : kryo 직렬화를 강제 여부
    • 권장 사항 : 클래스 이름을 작성하는 허위, KYRO 필요가 각 개체에 대해 등록 된 클래스가 아닌 경우, 상당한 성능 오버 헤드가 발생할 수 있습니다. true로 설정 추천했다. (JVM 내 친구 중 일부는 여기에 몇 가지 클래스를 등록 오류 클래스를 사용 Class.forName을 복사 추천하는 방법을 모른다 인용 ( "클래스"))
  • spark.rdd.compress
    • 기본값 : 거짓
    • 설명 : 직렬화 데이터를 압축할지 여부 RDD
    • 권장 사항 : 차례 메모리를 줄일 수 있지만, CPU의 시간이 소요 압축 해제를 증가
  • spark.scheduler.mode
    • 기본 값 : FIFO
    • 설명 : 같은 SparkContext 스케줄링 메커니즘 내에서, FIFO, FAIR 포함
    • 권장 사항 : 일반적으로 사용 덜. FIFO, FIFO, 우선 순위 실행, 후자는 제출 무료로 첫 직장을 제공해야합니다. 각 작업이 병행하여 실행될 수 공정한 자원의 공평한 분배를 균일하게 분산 컴퓨팅 자원.
  • spark.streaming.backpressure.enabled
    • 기본값 : 거짓
    • 설명 : 수신 데이터 SparkStream의 속도를 제어하기 위해 백 프레셔 메카니즘을 사용할지 여부.
    • 권장 사항 :, 처리 속도가 느린 경우, 지속적으로 데이터의 백 로그로 이어질 것 스트리밍. 활성화되면, 점화는 수신 된 데이터의 처리 능력을 동적으로 조정을 소유 할 수있다. 백 로그가 존재하는 경우, 사용할 수 있습니다. 조정을하지 않는 것이 좋습니다 세부 사항을 제어하는 ​​여러 매개 변수도 있습니다.
  • spark.streaming.blockInterval
    • 기본 값 : 200 밀리 초
    • 설명 : 일괄 배치 간격 = / blockInterval 당 taske 번호
    • 권장 사항 : 일부 핵심을 사용하지에 큰 blockInterval이 덜 taske,이 이어질 것입니다. 핵심의 양에 따라, 그리고 인한하면이 매개 변수를 낮 춥니 다. (공식은 50ms의 약 blockInterval 최소 권장)
  • spark.streaming.concurrentJobs
    • 기본값 : 1
    • 설명 : 많은 작업 응용 프로그램을 동시에 실행할 수있는 방법 SparkStream. (이 매개 변수는 공식 웹 사이트에서 발견되지 않음)
    • 권장 사항 : 작업의 두 가지 경우 (다시 작업을 실행하는 동안 핵심 더 할당하는 경우, 각 배치 작업 상대적으로 적은 수의 유휴 코어 더 낭비, (아마도 오랜 시간을 처리),이 매개 변수를 증가시킬 수있다 단어 사이의 연관성 없음)
  • spark.driver.extraJavaOptions 与 spark.executor.extraJavaOptions
    • 기본값 : 없음
    • 설명 : JVM을 지정하는 데 사용되는 매개 변수
    • 권장 사항 : 봐 JVM 매개 변수 조정부

JVM 매개 변수 조정

  • 일반적으로 JVM을 강조하지, 개발 문제의 대부분의 경우 비즈니스 로직 문제, 최적화, 최적화, 최적화 다시 ... ^ _ ^ 가난한 코드 품질, 코드에서 첫번째보기의 결과입니다
  • 그런 다음, 운영 환경을 결정, 다시 JVM 매개 변수를 조정
  • 환경으로 감소 기본값은 시스템을 변경하는 것이 런타임을 사용하시기 바랍니다 주 java -XX:+PrintFlagsFinal -version최종 매개 변수 JVM 명령을 볼 수
  • 보기 GC 케이스
    • 보기 GC 각 노드
      • -XX 추가 : PrintGCDetails를 각 노드 인쇄 GC 로그, 당신은 개별적으로 각 노드에서 볼 필요가 그래서. 원사에서 각 노드에 대한 로그를 볼 수있는 웹 UI 인터페이스를 클릭 할 수 있습니다.
    • 전체 애플리케이션 처리량을 볼 스파크?
      • 스파크는 각 응용 프로그램이 바로 여기 그것을보고, 표시하는 UI를. 10 % 이상에 대한 GC 경우, 응용 프로그램이 최적화 필요 상태!
  • GC의에 선택 (자바 8)
    • 배치, 높은 처리량? -XX으로 : + UseParallelGC
    • 스트리밍, 당신은 높은 데이터 일관성을 가질 필요가? + UseConcMarkSweepGC 또는 G1 : -XX 함께
    • 비정상적? 선거 ParallelGC
    • 배치는 G1을 사용하고자 할 때? 당신은 시도하지,하지만 ParallelGC 좋은 처리량 (자바 8) 수
  • 병렬 가비지 수집기 파라미터 (ParallelGC)
    • 처리량 우선 순위 기준
    • -XX은 : + UseParallelGC는 젊은 세대의 사용 ParallelGC을 설정, 기존의는 SerialGC 기본.
    • -XX : 이전 설정도 ParallelOldGC를 사용 + UseParallelOldGC 년이의 JAVA1.6를 지원하기 시작했다가 (내 시스템이 기본적으로 설정되어, 당신은 필요하지 않음)
    • -XX : ParallelGCThreads = 8 개은 스레드 병렬 가비지 컬렉션 8 대체로 동일한 CPU 코어의 개수 배치
    • -XX : MaxGCPauseMillis = 100 배치 신세대 ParallelGC 하나의 회복은 100 밀리 초까지 걸린다. 이 값보다 더 걸리는 경우, JVM이 자동으로 값을 수용하기 위해 메모리 크기의 젊은 세대를 조정합니다.
    • -XX 퍼센트 GCTimeRatio = N 배치 된 가비지 콜렉션 프로그램 실행 시간이 99 %이었던 시간, 즉 99 %의 처리율을 나타내는. 화학식 1 / (1 + N), N = 99 기본적
    • -XX은 : + UseAdaptiveSizePolicy 적응 전략을 수 있습니다. JVM이 자동으로 GCTimeRatio의 값을 적용하기 위해, 젊은 세대와 에덴 District 지역 생존자의 크기의 비율을 조정합니다. 당신이 설정하는 것이 권장됩니다.
  • 동시 가비지 컬렉터 파라미터 (ConcMarkSweepGC)
    • 응답 시간 우선 순위 기준
    • -XX : + UseConcMarkSweepGC 년 ConcMarkSweepGC, 젊은 세대 사용 ParNewGC 기본값을 사용하여 이전 설정.
    • -XX : + UseParNewGC는 젊은 ParNewGC를 대신하여 설정할 수 있습니다. JDK5 CMS보다 더 사용하는 경우, 젊은 세대는 기본 ParNewGC을 사용합니다.
    • -XX : + UseCMSCompactAtFullCollection 열려 압축 마무리 (기본), 제거하는 마무리 압축 메모리 단편화의 문제 (CMS 스위프 알고리즘을 사용하기 때문에 표시의 압축되지 않도록 개별적으로 열고, 조직)
    • -XX : CMSFullGCsBeforeCompaction = 2가 메모리의 압축 마무리 시작 회 FullGc (디폴트 0 번)을 설정 한 후.
    • -XX는 : CMSInitiatingOccupancyFraction 오래된 년 70 % 동시 가비지 수집을 시작했다 사용 70 설정 메모리 =
  • 일반적인 메모리 조정 매개 변수
    • 일반적인 비율
            young    | old
      eden | s0 | s1 | tenured
      ------------------------
             1       |  2
      8    | 1  | 1  | 
      
    • -Xmx4G는 4G에 최대 JVM 힙 메모리를 설정
    • -Xms4G 초기 JVM 힙 메모리는 일반적으로 (피 메모리를 재 할당한다) 수와 동일한 많은 -Xmx 설정 4G이다 설정된
    • -Xmn1G는 젊은 세대의 메모리 크기는 1G이다 설정합니다. 오래된 젊은 세대, 따라서 젊은 세대와 GC 상황에 따라 균형을 유지하기 위해 이전 년 사이에 힙 메모리 = + 년. 예를 MinorGC 자세한 내용은, 당신은 젊은 세대를 설정할 수 있습니다, MajorGC 더 조정할 수 테이트의 (즉, 자기 xiaonianqing 세대).
    • -XX : = 512M newSize와는 크게 대개 같은 MaxNewSize 설정 젊은 세대 512M의 초기 크기를 설정한다. (권장하지 않음, 직접 -Xmn)
    • -XX : MaxNewSize = 1024M은 1024M에 대한 젊은 세대의 최대 크기를 설정합니다. (권장하지 않음, 직접 -Xmn)
    • -XX : MetaspaceSize = 128M 메타 정보 영역 (영구 세대) 256M의 초기 크기를 제공하고, 일반적으로 큰 MaxMetaspaceSize 동일하게 설정. (이전에는 Java8 -XX라고도 : PermSize)를
    • -XX : MaxMetaspaceSize = 256M 메타 정보 영역 (영구 세대) 256M의 최대 크기를 제공 하였다. (이전에는 Java8 -XX라고도 :를 MaxPermSize)를
    • -XX : 2 (2 Java8 기본값) : NewRatio = 2가 젊은 세대와 노년의 크기 비율을 설정하려면 1
    • -XX : 젊은 세대 영역과 서바이버 에덴 규모 비율로 배치 SurvivorRatio = 8이 8 : 1 : 1 (enden : survivor0 : survivor1)
    • -Xss256K 256K에 각 스레드 스택 크기 (Java8 기본 1M)에 개인 설정합니다. 더 큰 메모리 풋 프린트 당신은 128K와 같은 울트라 멀티 스레드 낮출 수있는 매개 변수를 활성화해야 더 많은 스레드.
    • -XX : MaxDirectMemory = 100M 배치 최대 힙 메모리 외부
  • 기타 일반적으로 사용되는 매개 변수
    • -XX : PrintGCDetails는 GC 정보를 인쇄
    • -XX : + 타임 스탬프 PrintGCTimeStamps는 GC를 인쇄 할 때
    • -Xloggc : /home/jerry/logs/gc.log는 GC 로그 출력 디렉토리를 설정
    • - XX는 : 이상이 스택 정보를 덤프 때 + HeapDumpOnOutOfMemoryError 메모리 오버 플로우가 발생하면
    • -XX :. HeapDumpPath = / my_java.hprof 지정된 출력 경로 스택 덤프 정보
    • -XX는 : MaxTenuringThreshold입니다 = 8 설정이 젊은 세대 가비지 콜렉션에 객체를받은 후 계속 입력 할 8 살 살아있다. 15의 기본값 (CMS를 사용하여 기본 6 인) (JVM이 4 비트 때문에 값을 나타내는) 최대 값 (15)
    • - XX는 : + PrintFlagsFinal JVM이 최종 변수를 출력 (예를 들면 자바 -XX : + PrintFlagsFinal -version)
    • 이 -XX : + PrintFlagsInitial JVM은 초기 파라미터를 출력 (최종 값의 환경 변화)
发布了128 篇原创文章 · 获赞 45 · 访问量 15万+

추천

출처blog.csdn.net/alionsss/article/details/103838149