Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在使用Google CloudDataproc时,是否仍有必要微调spark配置参数?_Apache Spark_Google Cloud Dataproc - Fatal编程技术网

Apache spark 在使用Google CloudDataproc时,是否仍有必要微调spark配置参数?

Apache spark 在使用Google CloudDataproc时,是否仍有必要微调spark配置参数?,apache-spark,google-cloud-dataproc,Apache Spark,Google Cloud Dataproc,详细说明: 通常,在编写spark作业时,需要为不同的spark配置指定特定值,以便以最佳方式使用群集资源。我们可以在初始化SparkSession时以编程方式执行此操作: SparkSession.builder .appNameSPARK\u APP\u NAME.configspark.executor.memory,1G 我想知道的是:在使用CloudDataProc时,我们还必须这样做吗?事实上,在创建Dataproc集群时,会初始化一个名为cluster.properies的属性文件

详细说明:

通常,在编写spark作业时,需要为不同的spark配置指定特定值,以便以最佳方式使用群集资源。我们可以在初始化SparkSession时以编程方式执行此操作:

SparkSession.builder .appNameSPARK\u APP\u NAME.configspark.executor.memory,1G

我想知道的是:在使用CloudDataProc时,我们还必须这样做吗?事实上,在创建Dataproc集群时,会初始化一个名为cluster.properies的属性文件,该文件包含的值如下:spark\:spark.executor.memory=2688m。因此,我想知道Dataproc是否会自动以最佳方式填充这些值w.r.t.群集资源,在这种情况下,我们不必手动/编程地优化spark配置


Dataproc确实提供了基于机器类型的智能默认值,甚至自定义机器类型和集群形状,旨在成为一个最佳的一刀切设置,平衡每个JVM更多线程的效率和每个JVM共享资源池的限制;大致上,机器被划分为每台机器可以容纳2个执行器,并且每个执行器都有一半的线程,因此您可能会期望2个执行器,每个执行器都能够在n1-standard-8上并行运行4个任务

请记住,Thread是已知的,因此在Dataproc上运行big Spark作业时,您可能只看到两个Thread vCore被占用,但您可以通过查看Spark AppMaster页面、在worker上运行ps或查看Dataproc云控制台页面上的CPU使用情况来验证是否确实使用了所有Core

但是,这些类型的设置从来都不是100%最优的,Dataproc还不能根据您运行的实际工作负载或历史工作负载自动预测设置。因此,对于在该集群上运行的所有工作负载,任何纯粹基于集群形状的设置都不能100%最优

长话短说,在Dataproc上,在大多数情况下,您不必担心显式优化,除非您真的试图挤出每一盎司的效率,但同时,如果需要,您可以随时使用自己的属性在集群创建或作业提交时覆盖Dataproc的设置。需要考虑的几点:

如果你有一个CPU重的内存工作负载,考虑使用HypCPU机器类型和DATAPROC会自动让每个执行器分配更少的内存。 如果内存容量较大,请考虑HeMMEM类型 如果您的输入不可拆分和/或像.csv.gz文件那样被高度压缩,那么您可能更容易遇到内存问题,因为通常的并行计算不知道输入数据是否会超出预期。在这些情况下,您可能需要覆盖执行器内存以使其更大 如果您正在使用子流程或本机库,如从辅助任务调用ffmpeg,则任务将消耗纱线/火花知识之外的物理内存;在这些情况下,您可能也需要调整内存限制,方法是减少每个执行器的内核数或增加执行器内存开销。 如果您有一些非常受IO限制的东西或其他异步函数上的块,比如从任务中调用缓慢的外部web端点,那么您可能会受益于为每个执行器启动内核;然后Spark运行的任务比CPU多,但如果任务只是等待IO,这将有助于提高效率。
Dataproc确实提供了基于机器类型的智能默认值,甚至自定义机器类型和集群形状,旨在成为一个最佳的一刀切设置,平衡每个JVM更多线程的效率和每个JVM共享资源池的限制;大致上,机器被划分为每台机器可以容纳2个执行器,并且每个执行器都有一半的线程,因此您可能会期望2个执行器,每个执行器都能够在n1-standard-8上并行运行4个任务

请记住,Thread是已知的,因此在Dataproc上运行big Spark作业时,您可能只看到两个Thread vCore被占用,但您可以通过查看Spark AppMaster页面、在worker上运行ps或查看Dataproc云控制台页面上的CPU使用情况来验证是否确实使用了所有Core

但是,这些类型的设置从来都不是100%最优的,Dataproc还不能根据您运行的实际工作负载或历史工作负载自动预测设置。因此,对于在该集群上运行的所有工作负载,任何纯粹基于集群形状的设置都不能100%最优

长话短说,在Dataproc上,在大多数情况下,你不必担心显式优化,除非你真的想挤出每一盎司的效率,但与此同时,你可以随时用自己的pro覆盖Dataproc的设置 如果需要,可在集群创建或作业提交时提交属性。需要考虑的几点:

如果你有一个CPU重的内存工作负载,考虑使用HypCPU机器类型和DATAPROC会自动让每个执行器分配更少的内存。 如果内存容量较大,请考虑HeMMEM类型 如果您的输入不可拆分和/或像.csv.gz文件那样被高度压缩,那么您可能更容易遇到内存问题,因为通常的并行计算不知道输入数据是否会超出预期。在这些情况下,您可能需要覆盖执行器内存以使其更大 如果您正在使用子流程或本机库,如从辅助任务调用ffmpeg,则任务将消耗纱线/火花知识之外的物理内存;在这些情况下,您可能也需要调整内存限制,方法是减少每个执行器的内核数或增加执行器内存开销。 如果您有一些非常受IO限制的东西或其他异步函数上的块,比如从任务中调用缓慢的外部web端点,那么您可能会受益于为每个执行器启动内核;然后Spark运行的任务比CPU多,但如果任务只是等待IO,这将有助于提高效率。
答案是肯定的。这取决于spark应用程序的行为、运行的虚拟机数量以及使用的虚拟机类型。下面是我的tunning参数示例

default_parallelism=512

PROPERTIES="\
spark:spark.executor.cores=2,\
spark:spark.executor.memory=8g,\
spark:spark.executor.memoryOverhead=2g,\
spark:spark.driver.memory=6g,\
spark:spark.driver.maxResultSize=6g,\
spark:spark.kryoserializer.buffer=128m,\
spark:spark.kryoserializer.buffer.max=1024m,\
spark:spark.serializer=org.apache.spark.serializer.KryoSerializer,\
spark:spark.default.parallelism=${default_parallelism},\
spark:spark.rdd.compress=true,\
spark:spark.network.timeout=3600s,\
spark:spark.rpc.message.maxSize=256,\
spark:spark.io.compression.codec=snappy,\
spark:spark.shuffle.service.enabled=true,\
spark:spark.sql.shuffle.partitions=256,\
spark:spark.sql.files.ignoreCorruptFiles=true,\
yarn:yarn.nodemanager.resource.cpu-vcores=8,\
yarn:yarn.scheduler.minimum-allocation-vcores=2,\
yarn:yarn.scheduler.maximum-allocation-vcores=4,\
yarn:yarn.nodemanager.vmem-check-enabled=false,\
capacity-scheduler:yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
  "

gcloud dataproc clusters create ${GCS_CLUSTER} \
       --scopes cloud-platform \
       --image pyspark-with-conda-v2-365 \
       --bucket  spark-data \
       --zone  asia-east1-b  \
       --master-boot-disk-size  500GB \
       --master-machine-type n1-highmem-2 \
       --num-masters  1 \ 
        --num-workers  2 \
       --worker-machine-type n1-standard-8 \
       --num-preemptible-workers 2 \
       --preemptible-worker-boot-disk-size 500GB \
       --properties ${PROPERTIES} 

答案是肯定的。这取决于spark应用程序的行为、运行的虚拟机数量以及使用的虚拟机类型。下面是我的tunning参数示例

default_parallelism=512

PROPERTIES="\
spark:spark.executor.cores=2,\
spark:spark.executor.memory=8g,\
spark:spark.executor.memoryOverhead=2g,\
spark:spark.driver.memory=6g,\
spark:spark.driver.maxResultSize=6g,\
spark:spark.kryoserializer.buffer=128m,\
spark:spark.kryoserializer.buffer.max=1024m,\
spark:spark.serializer=org.apache.spark.serializer.KryoSerializer,\
spark:spark.default.parallelism=${default_parallelism},\
spark:spark.rdd.compress=true,\
spark:spark.network.timeout=3600s,\
spark:spark.rpc.message.maxSize=256,\
spark:spark.io.compression.codec=snappy,\
spark:spark.shuffle.service.enabled=true,\
spark:spark.sql.shuffle.partitions=256,\
spark:spark.sql.files.ignoreCorruptFiles=true,\
yarn:yarn.nodemanager.resource.cpu-vcores=8,\
yarn:yarn.scheduler.minimum-allocation-vcores=2,\
yarn:yarn.scheduler.maximum-allocation-vcores=4,\
yarn:yarn.nodemanager.vmem-check-enabled=false,\
capacity-scheduler:yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
  "

gcloud dataproc clusters create ${GCS_CLUSTER} \
       --scopes cloud-platform \
       --image pyspark-with-conda-v2-365 \
       --bucket  spark-data \
       --zone  asia-east1-b  \
       --master-boot-disk-size  500GB \
       --master-machine-type n1-highmem-2 \
       --num-masters  1 \ 
        --num-workers  2 \
       --worker-machine-type n1-standard-8 \
       --num-preemptible-workers 2 \
       --preemptible-worker-boot-disk-size 500GB \
       --properties ${PROPERTIES} 

我想给图像1.4-ubuntu18。我应该用什么替换此-image pyspark-with-conda-v2-365\是的,我只使用我的自定义图像我想将图像设置为1.4-ubuntu18。我应该用什么替换此-image pyspark-with-conda-v2-365\是的,我只使用我的自定义映像