2017-03-06 16 views
7

我對我嘗試使用的大數據技術非常陌生,但至今設法在RStudio中設置了sparklyr連接到獨立的Spark羣集。數據存儲在Cassandra中,我可以成功地將大型數據集放入Spark內存(緩存)中,以便對其進行進一步的分析。儘管集羣應該擁有足夠多的資源(60核心,200GB RAM)來處理其大小的數據集,但是,最近我在將一個特別大的數據集引入Spark內存方面遇到了很多麻煩。將大型數據集緩存到火花存儲器中的「超出GC開銷限制」(通過sparklyr&RStudio)

我認爲,通過限制數據被緩存到一些選擇的感興趣的列中,我可以解決這個問題(使用我以前的查詢here的答案代碼),但事實並非如此。會發生什麼情況是我的本地計算機上的jar進程會逐漸接管所有本地RAM和CPU資源,並且整個進程會凍結,並且集羣執行程序不斷丟失並重新添加。奇怪的是,這種情況發生時,即使我只選擇1行進行緩存(這應該使該數據集比其他數據集小得多,因爲我沒有問題緩存到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'),並且已經看到了如何增加memoryOverhead通過(使用spark.yarn.executor.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:

在我的配置文件,我已經通過將每個以下設置一個以(其中沒有工作過),時間嘗試和我的全電流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任何想法o在這種情況下?
  2. 是否有配置設置我可以更改以幫助解決此問題?
  3. 另外,有沒有辦法導入與rstudio/sparklyr作爲驅動程序批處理 cassandra數據?
  4. 或者再一次,有沒有辦法在數據進入緩存時進行緩衝/過濾/編輯,以便生成的表更小(類似於使用SQL查詢,但使用更復雜的dplyr語法)?
+0

您是否嘗試過增加spark.executor.memory?同時嘗試增加執行程序的數量 – dumitru

+0

是的 - 我將執行程序內存提高到每個節點64GB(總共384GB RAM),併發生相同的情況。也嘗試了將執行者加倍(對6個節點上的12個執行者)並且遇到同樣的問題。 – renegademonkey

+0

「奇怪的是,即使當我僅選擇1行進行緩存時,也會發生這種情況」,這表明下推式謂詞可能無法正確應用。你的數據集有多大,大約有多少(cassandra)分區?你能發佈你的整個配置文件嗎? –

回答

1

好的,我終於成功地完成了這項工作!

我最初嘗試@ user6910411的建議來減少cassandra輸入分割大小,但是這種方式失敗了。與其他很多事情打轉轉之後,今天我試圖改變在相反方向設置:

spark.cassandra.input.split.size_in_mb: 254 

通過增加分割尺寸,有較少的火花任務,從而減少開銷和到GC更少的調用。有效!

相關問題