2016-10-28 8 views
2

AWS EMR에서 Spark Streaming 작업을 실행합니다. 이 작업은 10 시간에서 14 시간 사이에 안정적으로 실행되며 stderr, stdout 또는 Cloudwatch 로그에서 식별 가능한 오류없이 중단됩니다. 이 충돌 후 작업을 다시 시작하려고하면 " '메모리를 할당 할 수 없습니다'(errno = 12)"(full message)로 즉시 실패합니다.얀 힙 사용량 증가 시간

Cloudwatch 메트릭과 Ganglia를 사용한 조사에서 driver.jvm.heap.used이 꾸준히 증가하고 있음을 보여줍니다.

위의 두 가지 관찰을 통해 Spark의 장기 실행 구성 요소 (즉, 작업 수준 이상)가 메모리를 올바르게 사용하지 못하고 있다고 생각하게되었습니다. 이는 hadoop-yarn-resourcemanager를 다시 시작하면 (here에 따라) 힙 사용이 "새로운 클러스터"수준으로 떨어지게 됨으로써 지원됩니다.

내 가정에 실제로 맞으면 - 원사가 점점 더 많은 메모리를 소비하게되는 원인은 무엇입니까? (그렇지 않을 경우 - 그 위조 수있는 방법?)

  • 내가 here에서 볼이 true로 spark.streaming.unpersist 디폴트 (I 그냥 어떤이 있는지 여부를 확인 어쨌든 내 작업의 마지막에 수동 rdd.unpersist()를 추가하려고했습니다 있지만, 효과) -
  • Here에 대한 의견에 따르면 spark.yarn.am.extraJavaOptions에 대한 의견은 원사 클라이언트 모드 (우리가있는 곳)에서 실행 중일 때은 최대 원사 응용 프로그램 관리자 힙 메모리를 설정한다고 제안합니다. 용법. 이 값은 작업에서 무시되지 않으므로 (기본값은 512m이어야 함) Cloudwatch와 Ganglia 모두 드라이버 힙 사용량을 기가 바이트 단위로 명확하게 보여줍니다.
+1

당신은 우연히 상태 스트리밍을하고 있습니까? 메모리가 유지되는 상태가 신중하게 관리되지 않으면 메모리 사용이 계속 증가 할 수 있습니다. 나는 우리가 EMR에서도 스트리밍 작업을하고 있다고 말할 수 있으며, 메모리 문제없이 실행되므로 일반적인 문제는 아닌 것으로 생각됩니다. –

답변

1

기본 SparkUI 값 here은 Google 시스템에서 처리 할 수있는 것보다 훨씬 큽니다. 기본값의 1/20로 설정 한 후 시스템은 24 시간 동안 안정적으로 실행되었으며 그 시간 동안 힙 사용이 증가하지 않았습니다.

는 명확하게하기 위해, 편집 된 값을했다 :

* spark.ui.retainedJobs=50 
* spark.ui.retainedStages=50 
* spark.ui.retainedTasks=500 
* spark.worker.ui.retainedExecutors=50 
* spark.worker.ui.retainedDrivers=50 
* spark.sql.ui.retainedExecutions=50 
* spark.streaming.ui.retainedBatches=50 
+0

자세한 내용을 추가 할 수 있습니까? –

+0

물론 - 세부 사항은 무엇입니까? – scubbo

+0

수정 한 구성 옵션 목록이 제 자리에 있다고 생각합니다. 그것은 교활한 문제처럼 보이고 다른 사람들은 시행 착오 대신 청결한 가이드의 도움을받을 수 있습니다 :) 감사합니다! –