大型数据集缓存到Spark内存中时,“超出了GC开销限制”(通过sparklyr和RStudio)

叛逆的猴子

我对尝试使用的大数据技术非常陌生,但是到目前为止,已经设法在RStudio中设置sparklyr以连接到独立的Spark集群。数据存储在Cassandra中,我可以成功地将大型数据集带入Spark内存(缓存)以对其进行进一步分析。

但是,最近,即使群集应具有足够的资源(60个内核,200GB RAM)来处理其大小的数据集,也很难将一个特别大的数据集引入Spark内存。

我认为,通过限制数据被缓存到的利益,我可以克服这个问题(使用我以前的查询答案代码短短选择列在这里),但事实并非如此。发生的情况是,本地计算机上的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

我更改了connect配置以增加心跳间隔(spark.executor.heartbeatInterval: '180s'),并了解了如何通过更改yarn群集(使用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'

更新:和我完整的当前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. 有谁对在这种情况下该做什么有任何想法?
  2. 我可以更改配置设置来解决此问题吗?
  3. 或者,是否可以使用RStudio / sparklyr作为驱动程序批量导入cassandra数据?
  4. 还是可替代地,是否有一种方法可以在将数据带入缓存时对其进行修改/过滤/编辑,以使结果表更小(类似于使用SQL查询,但使用更复杂的dplyr语法)?
叛逆的猴子

好的,我终于设法完成了这项工作!

我最初尝试使用@ user6910411的建议来减小cassandra输入拆分的大小,但这以相同的方式失败了。在尝试了其他方法之后,今天我尝试朝相反方向更改该设置:

spark.cassandra.input.split.size_in_mb: 254 

通过增加拆分大小,可以减少火花任务,从而减少开销,并减少对GC的调用。有效!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java Spark中收集数据集时超出了OutOfMemoryError GC开销限制

Spark:在Scala中与ListBuffer一起使用cogroup时出现内存问题(超出了GC开销限制)

Java Spark-java.lang.OutOfMemoryError:超出了GC开销限制-大数据集

jmeter中超出了gc内存开销

超出了GC开销限制,但有足够的内存

子主题“内存不足”和“超出了GC开销限制”

构建Android源时超出了GC开销限制

将大量数据写入excel:超出了GC开销限制

82秒内提取数据库中的一行,java.lang.OutOfMemoryError:对于大型数据库,超出了GC开销限制

Android Studio中超出了GC开销限制

java.lang.OutOfMemoryError:在maven中运行findbugs时超出了GC开销限制

Clojure错误-超出了GC开销限制

Android Studio:超出了GC开销限制

PySpark超出了GC开销限制

crashlyticsGenerateSymbolsRelease-超出了GC开销限制

“ OutOfMemoryError:超出了GC开销限制”:使用Java解析大型json文件

为什么我在jsp中不断收到“超出了GC开销限制,有时甚至是堆大小”的错误?

为什么Spark失败并出现java.lang.OutOfMemoryError:超出了GC开销限制?

在Scala项目上-运行sbt test命令时超出了错误GC开销限制

Android Robolectric:OutOfMemoryError-创建ArrayList时超出了GC开销限制

尝试读取700k +的数据,并且发生错误“超出了GC开销限制”

Spring Boot和Java java.lang.OutOfMemoryError:超出了GC开销限制

Tomcat java.lang.OutOfMemoryError:超出了GC开销限制

java.lang.OutOfMemoryError:超出了GC开销限制

Pyspark:java.lang.OutOfMemoryError:超出了GC开销限制

如何重现Java OutOfMemoryError-超出了GC开销限制

错误java.lang.OutOfMemoryError:超出了GC开销限制

无法执行dex:超出了GC开销限制->库

Jmeter java.lang.OutOfMemoryError:超出了GC开销限制

TOP 榜单

热门标签

归档