67, 성능 튜닝

데이터 수신 병렬 튜닝

(1 ) 
시각 (예 카프카 수로 등) 네트워크를 통해 데이터를 수신하고, 데이터는 역 직렬화 스파크 메모리에 저장된다. 수신 시스템 데이터 병목 현상을 호출하면, 수신 된 병렬 데이터를 고려한다. 
각각의 입력은 수신기가 데이터 스트림을 수신하는 작업자 실행자에 d 스트림 수신기를 시작할 것이다. d 스트림 복수 작성하여 입력 할 수 있으며, 구성은 수신 
된 데이터 스트림들을 수신하는 효과를 달성하기 위해 서로 다른 데이터 파티션 데이터 소스. 예를 들어, 두 d 스트림 카프카 항목을 수신하는 입력은 각각 각각 수신 개의 입력 d 스트림으로 분할되는 
항목의 데이터. 이것은, 두 개의 수신기를 생성하여, 이에 의해 스루풋을 향상 병렬 데이터를 수신하는 단계를 포함한다. d 스트림 복수 조합하여 연산자 d 스트림을 형성하는 중합 반응을 위해 사용될 수있다. 이어서 
중합 후의 d 스트림에 대한 하나의 후속 변환 오퍼레이터 조작. 

INT 스트림 수 = 5. ; 
목록 <JavaPairDStream <문자열, 문자열 >> kafkaStreams = 새로운 새로운 ArrayList를 <JavaPairDStream <문자열, 문자열 >> (스트림 수)
 에 대한 ( INT I = 0; 나는 스트림 수를 <; 내가 ++ ) {
  kafkaStreams.add (KafkaUtils.createStream (...)); 
} 
JavaPairDStream unifiedStream = streamingContext.union <문자열, 문자열> (. kafkaStreams.get (0) kafkaStreams.subList (1 , kafkaStreams.size ())); 
unifiedStream. 출력 (); 


( 2 ) 
상기 데이터 수신 동조 병렬 수신기 입력 d 스트림 이상을 만들 수있을뿐만 아니라 조정 및 블록 구간으로 간주 될 수있다. 매개 변수에 의해, spark.streaming.blockInterval, 당신은 블록 간격을 설정할 수 있습니다, 
기본값은 200 밀리 초입니다. 수신기는 대부분의 경우,이 BlockManager 스파크에 수신 된 데이터를 저장하기 전에, 블록의 데이터로 절단한다. 각 배치의 블록의 개수는, 그 결정 상태 
RDD이 배치에 대응하는 파티션의 번호 및 작업 수를 변환 동작의 구현을위한 RDD 생성 할 때. 수에 대응하는 각 태스크 배치 약, 즉 추정 간격 배치 / 차단 간격.

예를 들어, 배치 간격이 10 작업을 만듭니다 2 초, 200 밀리에 블록 간격이다,라고. 이 작업은 각 컴퓨터의 CPU 코어의 수보다 낮은 각 배치, 너무 소량 생각한다면, 그것은 배치 작업의 수를 보여줍니다 
모든 CPU 자원을 충분히 활용 할 수 없기 때문에, 충분하지 않습니다. 배치의 숫자 블록을 높이기 위해 다음 블록의 간격을 줄일 수 있습니다. 적은이 값보다 경우, 최소 권장 블록 간격은 50ms로입니다 
시동 시간의 많은 수의 후 작업, 성능 오버 헤드 지점이 될 수 있습니다. 


( 3 ) 
의 병렬 방식을 수신하는 것에 더하여, 상기 해제하는 방법을 명시 적으로 입력 된 데이터 스트림을 재 - 분할하는 두 개의 데이터, 즉이 전해진다. inputStream.repartition (사용 <파티션의 수> )에 있습니다. 
이 기계의 지정된 후 추가 조치에 분산 수신 BATCH를 할 수 있습니다.


둘째, 작업 조정 시작

모든 두 번째 작업의 시작이 너무 많은 경우, 예를 들어, (50)는 시작에 따라, 다음 상대적으로 클 것이다 노동자 노드의 성능 오버 헤드 실행 프로그램을 작업하기 위해 보내, 그것은 어려운이 시간은 기본 밀리 초 지연 달성하기 위해. 
이 오버 헤드 성능을 줄이기 위해 다음 절차를 사용합니다

 . 1 , 작업의 순서 : 작업을 직렬화를 사용 Kryo 직렬화 메커니즘, 작업이되어 각 노드 집행 인 노동자에게 작업을 보낼 수있는 시간을 줄여 크기가 감소 될 수 있습니다.
2 , 실행 모드 : 독립 실행 형 모드에서 스파크 실행, 당신은 더 적은 작업 시작 시간을 달성 할 수있다. 

상기 실시 예는 100 밀리 초마다 배치하는 처리 시간을 단축 할 수있다. 이에 밀리 초에 이르기까지 두 번째 수준.


셋째, 데이터 처리 평행도 조정

계산의 단계에서 사용 동시 작업의 수는 충분하지 않은 경우, 클러스터 자원이 충분히 활용되지 않습니다. 운영, 감소 분산을 위해 예를 들어, 
같은 reduceByKey 및 reduceByKeyAndWindow을 기본 병렬 작업의 수입니다. 스파크 기본 .parallelism 매개 변수를 결정했다. 당신은 작업처럼 reduceByKey 수 있습니다 
전체 불꽃을 조정할 수 있습니다, 수동 작업의 병렬 처리 수준을 지정하려면, 두 번째 매개 변수를 전달합니다. 기본 .parallelism 매개 변수를.


넷째, 데이터 직렬화 조정

(1 ) 
직렬화 된 데이터를 생성 오버 헤드가 최적화 된 시퀀스의 포맷에 의해 감소 될 수있다. 플로우 컴퓨팅 시나리오에서, 두 가지 유형의 데이터는 직렬화 될 필요가있다. 

1 , 입력 데이터 : 영구 메모리에 저장되어 기본적으로 입력 데이터가 수신 될 때, 실행 프로그램 레벨에 사용된다 StorageLevel.MEMORY_AND_DISK_SER_2이다. 이 것을 의미 
데이터 GC 오버 헤드 바이트를 줄이기 위해 직렬화 및 실패 FT 실행기에 복사한다. 따라서, 데이터는 제 1 메모리에 저장되고, 그 다음 디스크 경우에 메모리가 유출 할 
필요한 모든 데이터를 저장할 계산 스트리밍. 여기 직렬화 데이터 --Receiver 직렬화 상당한 성능 오버는 네트워크로부터 수신되어야하고 다음 시퀀스 데이터 점화 시퀀스 포맷을 사용. 

2 , 플로우 계산 지속성 RDD 생성 동작 : 메모리에 유지할 수 있으며, 지속적인 동작 산출 RDD 스트림을 생성. 데이터는 이후 예를 들어, 디폴트는 영구 메모리에 조작 창 데이터 것 
이후 여러 창으로 사용되고, 복수 회 처리 될 수있다. 그러나, 기본 점화 코어 퍼시스턴스 레벨 달리 StorageLevel.MEMORY_ONLY는 기본적 RDD 스트리밍 컴퓨팅 작업 영구 생성 
수준 StorageLevel.MEMORY_ONLY_SER이며, 기본값은 오버 헤드 GC를 감소시키는 것이다. 


( 2 ) 
위의 시나리오에서, 서열 라이브러리의 사용 Kryo의 CPU 및 메모리 성능 오버 헤드를 줄일 수있다. Kryo를 사용하는 경우, 우리는 사용자 정의 클래스 등록을 고려합니다 
및 해당 참조 (spark.kryo.referenceTracking)에 대한 추적을 사용할 수 없습니다.

이러한 응용 프로그램을 스트리밍 데이터의 양을 유지하기 위해 필요로 특별한 시나리오에서는 비 영구적 방식으로 많은하지, 아마 직렬화 된 데이터함으로써 감소 직렬화 및 CPU 오버 헤드의 탈 직렬화입니다 
그들은 너무 비싸 GC의 오버 헤드가되지 않습니다. 당신이 배치 간격의 몇 초, 그리고 작업 창을 사용하지 않는 경우 예를 들어, 당신은 명시 적으로 지속성 수준이 지속되면 장애인에게 제공 고려하실 수 있습니다 
데이터를 직렬화합니다. 이것은 직렬화 및 CPU의 성능 오버 헤드의 탈 직렬화를 줄이기 위해, 그리고 GC 오버 헤드가 너무 많이 부담하지 않습니다 사용할 수 있습니다.


다섯, 배치 간격 조정 (중요)

당신이 안정 될 수 있습니다 스파크 스트리밍 애플리케이션 클러스터에서 실행하려는 경우, 가능한 한 빨리 수신 된 데이터를 처리해야합니다. 즉, 배치는 생성 한 후, 가능한 한 신속하게 처리해야한다. 
애플리케이션의 경우, 이것은이 점화 UI상의 배치 처리 시간을 관찰함으로써 설정 될 수 있으며, 문제가되지 않는다. 배치 프로세싱 시간은 시간 간격 배치보다 작아야한다. 

클러스터 리소스의 고정 조건 하에서 흐름, 배치 간격 막대한 영향의 특성에 기초하여 계산, 응용 프로그램 데이터 수신 속도가있을 것, 유지할 수있다. 예를 들면, 단어 수의 예에서, 특정 대한 
데이터 수신률 애플리케이션 서비스가 500ms마다 대신에, 2 초마다 한번 인쇄 단어 개수 보장 될 수있다. 따라서, 배치 간격은 데이터 수신 속도는 생산 환경에서 유지하도록 기대 될 수 있도록 설정 될 필요가있다. 

응용 프로그램에 대한 올바른 배치 크기를 계산하는 더 좋은 방법은, 예를 들어, 배치 매우 보수적 간격입니다. 5 ~ 테스트 데이터를 수신하는 속도가 느린 속도로 10 초. 응용 프로그램이 데이터 속도와 유지 여부를 확인하려면, 
각 배치의 시간 지연 처리를 확인 할 수 있으며, 처리 시간은 배치 간격과 기본적으로 일치하는 경우, 다음 응용 프로그램은 안정적이다. 배치 스케줄링 지연이 계속 증가 할 경우 그렇지 않으면, 그것은 응용 프로그램이 따라갈 수 없음을 의미 
불안정이 속도. 그래서 당신은 안정적인 구성을 갖고 싶어, 당신은 데이터 처리 속도를 향상, 또는 배치 간격을 높이기 위해 시도 할 수 있습니다. 인한 임시 데이터 성장에 성장이 일시적으로 지연, 기억 
이 오래 지연은 짧은 시간에 복구 할 수있는, 합리적이다.


여섯째, 메모리 조정

(1 ) 
메모리 사용 및 애플리케이션 스파크 GC 행동, 튜닝 스파크 코어의 최적화, 그것에 대해 이야기하고있다. 여기에 스파크 스트리밍 응용 프로그램과 관련된 조정 매개 변수에 대해 이야기합니다. 

스파크 스트리밍 어플리케이션 메모리 클러스터 리소스는, 변환을 사용 동작의 타입에 의해 결정되는 필요로한다. 당신은 윈도우 연산자 10 분 창 길이를 사용하려는 경우 예를 들어, 
다음 클러스터는 10 분 이내에 데이터를 보유하기에 충분한 메모리가 있어야합니다. 당신이 많은 키의 상태를 유지하기 위해 updateStateByKey 사용하려는 경우, 메모리 자원이 충분해야합니다. 반대로, 
간단한지도 수행하려는 경우 -filter- 저장 작업을, 당신은 매우 작은 메모리를 사용합니다. 

일반적으로 수신기에 의해 수신 된 데이터가 저장 StorageLevel.MEMORY_AND_DISK_SER_2 퍼시스턴스 레벨을 사용하므로, 데이터가 디스크에 오버플로 메모리에 저장 될 수 없다. 
디스크에 기록 오버 플로우, 그것은 응용 프로그램의 성능이 저하됩니다. 따라서, 보통은 응용 프로그램에 필요한 충분한 메모리 자원을 제공하는 것이 좋습니다. 메모리 및 평가의 현장에서 테스트 소량 것이 좋습니다. 



( 2 ) 
상기 튜닝 메모리 가비지 수집기의 또 다른 태양. 당신이 낮은 지연 시간을 얻으려면, 응용 프로그램을 스트리밍, 확실히 긴 지연을하고 싶지 않아요 위해 JVM 가비지 콜렉션 때문에 발생합니다. : 메모리 사용 및 오버 헤드 GC를 줄일 수있는 많은 매개 변수가

 하나  "데이터 직렬화 조정"절에서 언급 한 것처럼, 특정 작업의 중간 입력 데이터 RDD 생산, 기본 지속성 :, 지속성 d 스트림 그것은 바이트로 연재됩니다. 메모리 오버 헤드를 감소 GC 아닌 직렬 방식과 비교.
더 메모리 사용량 및 GC 오버 헤드를 줄일 수 Kryo 직렬화 메커니즘을 사용하여이. 상기 메모리 사용량을 줄이기 위해, 데이터가 압축 될 수있다 (기본적 거짓) spark.rdd.compress 파라미터에 의해 제어된다. 

오래된 데이터를 정리 : 기본적으로 모든 입력 데이터 및 동작 d 스트림 변환 지속 RDD에 의해 생성이 자동으로 삭제됩니다. 데이터를 정리하는 경우 점화 스트리밍 결정하게 
변형 조작의 종류에 따라. 시간이 경과 한 후 예를 들어, 10 분 이내에 창 길이 창 작업을 사용하고, 스파크 10 분 이내에 데이터를 유지합니다, 그것은 오래된 데이터를 정리합니다. 그러나 일부 특별한 장면에서 
스파크 SQL로 일괄 RDD에 대한 스파크 SQL 쿼리 실행을 사용하여 비동기 열린 스레드에서 사용할 경우 통합 스트리밍 스파크. 그런 다음이 끝날 때까지 긴 기간 스파크 데이터, 스파크 SQL 쿼리를 얻을 필요가있다. 
그것은 streamingContext.remember () 메소드를 사용하여 구현 될 수있다. 

3 CMS 가비지 컬렉터 병렬 마크로 사용 하는 오버 헤드 GC 낮게 유지하도록 권장 스윕 가비지 콜렉션기구. 병렬 GC 처리량을 줄일 수 있지만,이를 사용하는 것이 좋지만 
일괄 처리 시간을 감소시키는 장치 (GC는 처리 중에 오버 헤드를 감소). 당신이 사용하려는 경우, 당신은 드라이버 쪽 끝과 집행을 열 수 있습니다. 스파크에서 --driver - 자바 - -submit은 USING 제공된 옵션; 
spark.executor.extraJavaOptions 파라미터 설정을 사용한다. -XX : + UseConcMarkSweepGC.

추천

출처www.cnblogs.com/weiyiming007/p/11388447.html