spark启动配置整理

spark:为大规模数据处理而设计的快速通用的计算引擎

特点:

  • 速度快: 比hadoop快
  • 易用性: 多种高级运算符
  • 通用型: 有大量的库
  • 支持多资源管理器

spark更快的原因

        1、mapreduce基于磁盘进行数据处理,有更高的可靠性,减少了内存占用也降低了性能;    

             spark在内存中进行计算,牺牲内存提高了运行速度

        2、mapreduce在shuffle操作时,每一次都要写入磁盘中;       

             spark不强制写入,可以将需要反复使用的数据缓存在内存中,减少了去磁盘中反复读写的时间

        3、mapreduce是细粒度资源申请,每提交一个项目时,每一个task执行自己申请释放资源,执行完毕后,自己释放资源,task执行慢,application也就较慢;    

             spark是粗粒度资源申请,application提交时就会把所有的资源申请下来,申请不下就等待直至申请到再执行,当最后一个task执行后才会释放资源(也是不能充分利用集群的原因)

spark启动配置项含义

配置项相关概念
export SPARK_MAJOR_VERSION=2 spark版本选择
/opt/spark24/bin/spark-sql --master yarn-client \   

 spark提交模式的选择:

  • yarn-client:本地启动的进程,本地可查看日志,便于调试
  • yarn-cluster:在yarn的节点代理上启动的进程,本地看不到日志,不便于调试

--driver-memory 1G \主要用来存储一些DAG图信息,任务调动,资源划分等信息,还有一些CollectAsList等算子生成的数据也会放到Dirver memory中,如果进行大数据量的collect计算时需要调大driver的内存,避免内存溢出
--executor-memory 2G \设置每一个executor进程的内存,executor的内存大小影响spark计算的性能
--executor-cores 2 \设置一个executor中core的数量,一个core一次只能执行一个task
--num-executors 50 \

设置当前作业的executor进程个数,这个参数和executor-memory共同影响着计算速度

(初始运行根据当前设置申请资源,若开启动态分配,启动后进行动态分配)

--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=为driver端定义的log4j配置文件,log4j用来管理日志
--conf spark.sql.hive.caseSensitiveInferenceMode=NEVER_INFER \据目前了解,spark本身具有一个特性,在对表第一次进行分区查询时,并不只是扫描该分区下的文件,而是对表的所有分区进行计算,当表内存在大量的分区时,会耗时十分严重,浪费资源。在版本2.2.0以后,该参数默认设置为全局扫描,所以谨慎起见,需要对此参数进行设定。
--conf spark.sql.auto.repartition=true \开启自动分配分区资源,spark不同阶段分区不同,使用此配置可优化计算后分区数,避免分区数过大导致单个分区数据量过少,每个task运算分区数据时间过,从而导致task频繁调度消耗过多时间
--conf spark.sql.autoBroadcastJoinThreshold=104857600 \

数据做join过程中,两个表的大小差异过大容易产生数据倾斜,BroadcastJoin计算方式通过将小于设定值的表通过其他节点计算,不走shuffle,避免数据倾斜

所以当前设定值为104857600(1024*1024*100,100M),当表小于100M时,自动走BroadcastJoin

--conf spark.shuffle.service.enabled=true \辅助服务。通过开启该服务来抓取shuffle数据,提供到其他Executor上进行处理,避免Executor既要运行task又要提供shuffle数据。提升计算性能
--conf "spark.sql.hive.metastore.try.direct.sql=true" \未知
--conf spark.dynamicAllocation.executorIdleTimeout=10m\设置动态移除executor的时间,在executor没有缓存数据的情况下,空闲时间超过10分钟被移除(需要设置,避免计算后在后台长期不退出,并长期占用资源)
--conf spark.dynamicAllocation.enabled=true \是否开启动态配置,根据计算量级动态调整executor的数量

--conf spark.dynamicAllocation.minExecutors=1 \

--conf spark.dynamicAllocation.maxExecutors=200 \

动态分配最小executor个数(经过测试,若设置了移除executor的时间,该设置就是自动释放后的executor个数)

动态分配最大executor个数(不可以设置太大,避免计算量较大时系统动态分配,占据全部资源)

--conf spark.port.maxRetries=150 \Spark任务都会绑定一个端口来显示WebUI,如果被占用会进行+1端口重试,当前设定最多重试150次
--conf spark.ui.showConsoleProgress=true \任务执行的进度条显示
--conf spark.hadoop.hive.exec.dynamic.partition=true \是否开启动态分区(在分区数量过大,且分区名不明确的条件下使用)
--conf spark.hadoop.exec.dynamic.partition.mode=nonstrict \开启动态分区后,是否严格要求至少需要一个静态分区。strict:至少需要一个静态分区;nonstrict:不需要静态分区
--conf spark.sql.shuffle.partitions=10000 \如果设置多个executor,但未指定分区数,导致多数executor空闲。该设置是shuffle在mapper端写出的partition个数,提高shuffle并行度

--conf spark.sql.adaptive.enabled=true \

--conf spark.sql.adaptive.shuffle.targetPostShuffleInputSize=134217728 \

该参数是用于开启spark的自适应执行,后面的targetPostShuffleInputSize是用于控制之后的shuffle 阶段的平均输入数据大小,防止产生过多的task。

134217728=1024*1024*128

--conf spark.executor.memoryOverhead=512M 
\--conf spark.yarn.executor.memoryOverhead=512 \

堆外内存量级设置,主要用于JVM自身,字符串, NIO Buffer等开销。不足时可通过调整参数解决
--queue qa执行队列选择
项目中遇到的
spark.memory.fraction
用于执行和存储的部分(堆空间-300MB)。值越低,溢出和缓存数据逐出的频率就越高。此配置的目的是为稀疏的,异常大的记录留出用于内部元数据,用户数据结构和大小估计不精确的内存。建议将其保留为默认值。
默认值:0.6 (Spark 1.6 默认为 0.75,Spark 2.0+ 默认为 0.6)

spark.yarn.executor.memoryOverhead

executor执行的时候,用的内存可能会超过executor-memoy,所以会为executor额外预留一部分内存。spark.yarn.executor.memoryOverhead代表了这部分内存。这个参数如果没有设置,会有一个自动计算公式(位于ClientArguments.scala中),公式max(executor-memoy*0.1,384m)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值