2017-03-06 3 views
7

저는 Big Data 기술에 익숙하지 않습니다.하지만 지금까지 RStudio에서 스파크 릴을 설정할 수있었습니다 독립 실행 형 Spark 클러스터에 연결합니다. 데이터는 Cassandra에 저장되며, 큰 데이터 세트를 Spark 메모리 (캐시)에 가져 와서 더 많은 분석을 수행 할 수 있습니다.큰 데이터 세트의 캐시에서 sparkly & RStudio를 통해 "GC 오버 헤드 한도 초과"

그러나 클러스터는 크기가 큰 데이터 세트를 처리하기에 충분한 리소스 (60 코어, 200GB RAM) 이상을 가지고 있어야하지만 최근에는 특히 큰 데이터 세트를 스파크 메모리에 가져 오는 데 많은 어려움을 겪고 있습니다.

데이터를 제한하여 몇 가지 관심있는 열만 선택하면 문제가 해결 될 수 있다고 생각했지만 (이전 쿼리 here의 응답 코드 사용), 그렇지 않습니다. 로컬 컴퓨터의 jar 프로세스가 모든 로컬 RAM 및 CPU 리소스를 차지하도록 처리하고 전체 프로세스가 멈추고 클러스터 실행자는 계속 떨어지고 다시 추가됩니다. 이상하게도, 캐싱을 위해 단 하나의 행을 선택할 때조차도 (이것은 데이터 세트를 Spark 메모리에 캐싱하는 데 아무런 문제가없는 다른 데이터 세트보다 훨씬 작게 만들어야합니다).

나는 로그를 통해 모양을 했어,이 과정에서 초기에 유일한 정보 오류/경고 것 같다 :

17/03/06 11:40:27 ERROR TaskSchedulerImpl: Ignoring update with state FINISHED for TID 33813 because its task set is gone (this is likely the result of receiving duplicate task finished status updates) or its executor has been marked as failed. 
17/03/06 11:40:27 INFO DAGScheduler: Resubmitted ShuffleMapTask(0, 8167), so marking it as still running 
... 
17/03/06 11:46:59 WARN TaskSetManager: Lost task 3927.3 in stage 0.0 (TID 54882, 213.248.241.186, executor 100): ExecutorLostFailure (executor 100 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 167626 ms 
17/03/06 11:46:59 INFO DAGScheduler: Resubmitted ShuffleMapTask(0, 3863), so marking it as still running 
17/03/06 11:46:59 WARN TaskSetManager: Lost task 4300.3 in stage 0.0 (TID 54667, 213.248.241.186, executor 100): ExecutorLostFailure (executor 100 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 167626 ms 
17/03/06 11:46:59 INFO DAGScheduler: Resubmitted ShuffleMapTask(0, 14069), so marking it as still running 

그리고 20 분 후 정도 전체 작업이 충돌합니다 :

java.lang.OutOfMemoryError: GC overhead limit exceeded 

나는 하트 비트 간격 (spark.executor.heartbeatInterval: '180s')를 증가 내 연결 설정을 변경했습니다, 그리고하지만 독립형 클러스터 (spark.yarn.executor.memoryOverhead 사용) 실 클러스터에서 설정을 변경하여 memoryOverhead을 높이는 방법을 보았다.

spark.memory.fraction: 0.3 
spark.executor.extraJavaOptions: '-Xmx24g' 
spark.driver.memory: "64G" 
spark.driver.extraJavaOptions: '-XX:MaxHeapSize=1024m' 
spark.driver.extraJavaOptions: '-XX:+UseG1GC' 

UPDATE : 내 config 파일에서

, 내가 (일한 어느 것도) 시간에 다음 설정 중 하나를 각각 추가하여 실험을 다음과 같이 내 전체 현재 yml 설정 파일입니다 :

default: 
# local settings 
    sparklyr.sanitize.column.names: TRUE 
    sparklyr.cores.local: 3 
    sparklyr.shell.driver-memory: "8G" 

# remote core/memory settings 
    spark.executor.memory: "32G" 
    spark.executor.cores: 5 
    spark.executor.heartbeatInterval: '180s' 
    spark.ext.h2o.nthreads: 10 
    spark.cores.max: 30 
    spark.memory.storageFraction: 0.6 
    spark.memory.fraction: 0.3 
    spark.network.timeout: 300 
    spark.driver.extraJavaOptions: '-XX:+UseG1GC' 

# other configs for spark 
    spark.serializer: org.apache.spark.serializer.KryoSerializer 
    spark.executor.extraClassPath: /var/lib/cassandra/jar/guava-18.0.jar 

# cassandra settings 
    spark.cassandra.connection.host: <cassandra_ip> 
    spark.cassandra.auth.username: <cassandra_login> 
    spark.cassandra.auth.password: <cassandra_pass> 
    spark.cassandra.connection.keep_alive_ms: 60000 

# spark packages to load 
    sparklyr.defaultPackages: 
    - "com.datastax.spark:spark-cassandra-connector_2.11:2.0.0-M1" 
    - "com.databricks:spark-csv_2.11:1.3.0" 
    - "com.datastax.cassandra:cassandra-driver-core:3.0.2" 
    - "com.amazonaws:aws-java-sdk-pom:1.10.34" 

그래서 제 질문은 다음과 같습니다

  1. 사람이 무엇을 D에 대한 아이디어가 있습니까 이 경우에?
    Are
  2. 이 문제를 해결하기 위해 변경할 수있는 구성 설정이 있습니까?
  3. 또는 드라이버로 RStudio/sparklyr를 사용하여 배치에서 cassandra 데이터를 가져 오는 방법이 있습니까?
  4. 또는 데이터를 캐시에 가져올 때 데이터를 munge/filter/edit하여 결과 테이블이 더 작아집니다 (SQL 쿼리를 사용하는 것과 비슷하지만 더 복잡한 dplyr 구문을 사용하는 것과 비슷합니다)?
+0

spark.executor.memory를 늘리려고 했습니까? 또한 집행자의 수를 늘려보십시오. – dumitru

+0

예 - 실행 프로그램 메모리를 노드 당 64GB로 올렸습니다 (총 384GB RAM). 같은 일이 발생합니다. 또한 집행자를 두 배로 늘려 (6 명의 노드에서 12 명의 집행자에게) 시도하고 동일한 문제를 겪고 있습니다. – renegademonkey

+0

"캐시가 1 행만 선택 되어도 이상하게 발생합니다."이는 푸시 다운 조건자가 올바르게 적용되지 않았을 수 있음을 나타냅니다. 데이터 세트의 크기는 얼마나되며 얼마나 많은 (cassandra) 파티션이 있습니까? 전체 구성 파일을 게시 할 수 있습니까? –

답변

1

그래, 마침내이 작업을 할 수있었습니다!

나는 캐산드라 입력 분할 크기를 줄이기 위해 처음에는 @ user6910411을 제안했지만이 방법은 실패했습니다.다른 것들의 많은 주위를 연주 한 후, 오늘은 반대 방향으로 해당 설정을 변경 시도 :

spark.cassandra.input.split.size_in_mb: 254 

분할 크기를 증가함으로써, GC에 적은 수의 호출이 적은 스파크 작업이었다, 따라서 적은 오버 헤드. 그것은 효과가있다!

관련 문제