我對我嘗試使用的大數據技術非常陌生,但至今設法在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"
所以我的問題是:
- 沒有人有什麼d任何想法o在這種情況下?
是 - 是否有配置設置我可以更改以幫助解決此問題?
- 另外,有沒有辦法導入與rstudio/sparklyr作爲驅動程序批處理 cassandra數據?
- 或者再一次,有沒有辦法在數據進入緩存時進行緩衝/過濾/編輯,以便生成的表更小(類似於使用SQL查詢,但使用更復雜的dplyr語法)?
您是否嘗試過增加spark.executor.memory?同時嘗試增加執行程序的數量 – dumitru
是的 - 我將執行程序內存提高到每個節點64GB(總共384GB RAM),併發生相同的情況。也嘗試了將執行者加倍(對6個節點上的12個執行者)並且遇到同樣的問題。 – renegademonkey
「奇怪的是,即使當我僅選擇1行進行緩存時,也會發生這種情況」,這表明下推式謂詞可能無法正確應用。你的數據集有多大,大約有多少(cassandra)分區?你能發佈你的整個配置文件嗎? –