我在使用计算引擎的Google Dataproc上有一个Spark集群。集群有1个具有4个核心和16GB RAM的主节点和5个具有8个核心和32GB RAM的工作节点。
当运行SparkConf().getAll()
时,我得到这样的结果:
[('spark.eventLog.enabled', 'true'),
('spark.dynamicAllocation.minExecutors', '1'),
('spark.driver.maxResultSize', '2048m'),
('spark.executor.memory', '12859m'),
('spark.yarn.am.memory', '640m'),
('spark.executor.cores', '4'),
('spark.eventLog.dir',
'gs://dataproc-temp-europe-west1-907569830041-jsgvqmyn/0255e376-31c9-4b52-8e63-a4fe6188eba3/spark-job-history'),
('spark.executor.instances', '2'),
('spark.yarn.unmanagedAM.enabled', 'true'),
('spark.submit.deployMode', 'client'),
('spark.extraListeners',
'com.google.cloud.spark.performance.DataprocMetricsListener'),
('spark.driver.memory', '4096m'),
('spark.sql.cbo.joinReorder.enabled', 'true'),
('spark.sql.autoBroadcastJoinThreshold', '96m'),
('spark.shuffle.service.enabled', 'true'),
('spark.metrics.namespace',
'app_name:${spark.app.name}.app_id:${spark.app.id}'),
('spark.scheduler.mode', 'FAIR'),
('spark.yarn.historyServer.address', 'congenial-sturdy-bassoon-m:18080'),
('spark.sql.adaptive.enabled', 'true'),
('spark.yarn.jars', 'local:/usr/lib/spark/jars/*'),
('spark.scheduler.minRegisteredResourcesRatio', '0.0'),
('spark.hadoop.hive.execution.engine', 'mr'),
('spark.app.name', 'PySparkShell'),
('spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version', '2'),
('spark.dynamicAllocation.maxExecutors', '10000'),
('spark.ui.proxyBase', '/proxy/application_1663842742689_0013'),
('spark.master', 'yarn'),
('spark.ui.port', '0'),
('spark.sql.catalogImplementation', 'hive'),
('spark.rpc.message.maxSize', '512'),
('spark.executorEnv.OPENBLAS_NUM_THREADS', '1'),
('spark.submit.pyFiles', ''),
('spark.yarn.isPython', 'true'),
('spark.dynamicAllocation.enabled', 'true'),
('spark.ui.showConsoleProgress', 'true'),
('spark.history.fs.logDirectory',
'gs://dataproc-temp-europe-west1-907569830041-jsgvqmyn/0255e376-31c9-4b52-8e63-a4fe6188eba3/spark-job-history'),
('spark.sql.cbo.enabled', 'true')]
我不明白为什么当我有32g
PER WORKER时,参数spark.executor.memory
被设置为12859m
,spark.executor.cores
也是如此,当我的每个工人都有8
核心时,参数设置为4
。
使用很少的资源是正常的吗?还是应该在启动sparkSession时进行设置?我现在使用的代码是:
spark = SparkSession
.builder
.appName('my_app')
.getOrCreate()
我读过一些关于yarn.nodemanager.resource.memory-mb
的文章,但我不确定它是否适用于PySpark集群。
提前感谢您对的帮助
编辑:为了添加更多的上下文,我正在尝试从谷歌云存储中读取10M以上的Json文件,无论我尝试什么,我都会从JVM中出现OOM错误,有没有我可以专门设置的东西来解决这种问题?
理想情况下,您可以在一个执行器中使用高达75%到80%的资源。假设你有一个8核和16GB RAM的执行器,你可以使用大约6核和12GB RAM来执行spark(剩下的资源用于其他操作,如VM或pod的操作系统、内存分配等(。
本文档详细介绍了如何为spark确定遗嘱执行人的大小-https://spoddutur.github.io/spark-notes/distribution_of_executors_cores_and_memory_for_spark_application.html#:~:text=离开%201%20core%20per%20node,(%20%3D%2500%2F5%20%3D%3030
你可以在你的spark配置---num-executors, --executor-cores and --executor-memory
中使用这些参数,你可以玩你的spark作业,看看哪个配置和基础设施适合你的用例。