全力使用PySpark

sczxawaw  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(148)

我在Google Dataproc上有一个使用Compute Engine的Spark集群。该集群有1个主节点,具有4个核心和16 GB RAM,以及5个工作节点,每个节点具有8个核心和32 GB 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时,参数spark.executor.memory被设置为12859m;同样,当我的每个工作线程都有8内核时,参数spark.executor.cores被设置为4
使用很少的资源是正常的吗?还是应该在启动sparkSession时设置?我现在使用的代码是:

spark = SparkSession \
    .builder \
    .appName('my_app') \
    .getOrCreate()

我读过一些关于yarn.nodemanager.resource.memory-mb的东西,但我不确定它是否适用于PySpark集群。
提前感谢您的帮助
编辑:为了添加更多的上下文,我试图从Google云存储中读取10 M + Json文件,无论我尝试什么,我最终都会从JVM中出现OOM错误,有没有什么东西可以专门设置来解决这种问题?

rn0zuynd

rn0zuynd1#

理想情况下,您可以在单个执行器中使用高达75%到80%的资源。假设您有一个8核和16 GB RAM的执行器-您可以使用大约6核和12 GB RAM用于Spark(将剩余资源用于其他操作,如VM或Pod的操作系统、内存分配等)。
此文档详细介绍了如何调整spark的执行程序大小- https://spoddutur.github.io/spark-notes/spark应用程序的执行程序核心和内存分布。html#:~:text=离开每个节点,)%20%3D%20150%2F5%20%3D%2030
你可以在你的spark config---num-executors, --executor-cores and --executor-memory中使用这些参数,你可以尝试一下你的spark job,看看哪种配置和基础架构适合你的用例。

相关问题