spark常⽤提交任务的基本的参数配置
#!/bin/bash
#队列名 根据yarn的队列提交realtime_queue=root#提交的任务名
my_job_name=\"OrderQZ\"
spark-shell --master yarn --deploy-mode client \\--queue $realtime_queue \\
#总的executors数 根据数据量与⾃⼰的集群资源来分配--num-executors 35 \\#每个executor的核数--executor-cores 5 \\#每个executor的内存--executor-memory 19G \\#diver 端jvm⽇志配置
--conf spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j-yarn.properties \\--conf spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-yarn.properties \\#序列化
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \\
#数据本地化;⼀般会默认3s,重试5次的去分配,⼀旦超时失败,将会选择⼀个⽐上⼀个本地级别差的级别再⼀次分配,如果发⽣了数据传输,那么task⾸先通过blockmanager获取数据,如果本地没有数据,则通过getRemote⽅法从数据所在节点的blo--conf spark.locality.wait=5 \\#失败重试次数
--conf spark.task.maxFailures=8 \\# 是否开启在webui杀死进程
--conf spark.ui.killEnabled=false \\
#SparkContext 启动时记录有效 SparkConf信息--conf spark.logConf=true \\
#driver的堆外内存 内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(⽽不是虚拟机),这样做的结果就是能够在⼀定程度上减少垃圾回收对应⽤程序造成的影响。使⽤未公开的Unsafe和NIO包下ByteBuffer来创建堆外内存--conf spark.yarn.driver.memoryOverhead=512 \\--conf spark.yarn.executor.memoryOverhead=5480
#提交申请的最⼤尝试次数, ⼩于等于YARN配置中的全局最⼤尝试次数。--conf spark.yarn.maxAppAttempts=4 \\
#定义AM故障跟踪的有效时间间隔。如果AM⾄少在定义的时间间隔内运⾏,则AM故障计数将被重置。如果未配置,此功能未启⽤。--conf spark.yarn.am.attemptFailuresValidityInterval=1h \\
--conf spark.yarn.executor.failuresValidityInterval=1h \\#动态资源分配
--conf spark.shuffle.service.enabled=true \\
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \\#推测执⾏
--conf spark.speculation=true \\
--conf spark.speculation.quantile=0.9 \\#shffule task数⽬
--conf spark.sql.shuffle.partitions=178 \\
#,当它设置为true时,Spark SQL会把每条查询的语句在运⾏时编译为java的⼆进制代码。这有什么作⽤呢?它可以提⾼⼤型查询的性能,但是如果进⾏⼩规模的查询的时候反⽽会变慢,就是说直接⽤查询反⽽⽐将它编译成为java的⼆进制代码快。--conf spark.sql.codegen=true \\
#默认值为false 它的作⽤是⾃动对内存中的列式存储进⾏压缩--conf spark.sql.inMemoryColumnarStorage.compressed=true \\
# join实现主要有3种,即BroadcastHashJoinExec、ShuffledHashJoinExec和SortMergeJoinExec,优先级为#1 如果canBroadcast,则BroadcastHashJoinExec;
#2 如果spark.sql.join.preferSortMergeJoin=false,则ShuffledHashJoinExec;#3 否则为SortMergeJoinExec;
--conf spark.sql.join.preferSortMergeJoin=true \\
# Spark底层shuffle的传输⽅式是使⽤netty传输,netty在进⾏⽹络传输的过程会申请堆外内存(netty是零拷贝),所以使⽤了堆外内存。--conf spark.reducer.maxSizeInFlight=96M/**
spark.reducer.maxSizeInFlight默认值:48m
参数说明:该参数⽤于设置shuffle read task的buffer缓冲⼤⼩,⽽这个buffer缓冲决定了每次能够拉取多少数据。
调优建议:如果作业可⽤的内存资源较为充⾜的话,可以适当增加这个参数的⼤⼩(⽐如96m),从⽽减少拉取数据的次数,也就可以减少⽹络传输的次数,进⽽提升性能。在实践中发现,合理调节该参数,性能会有1%~5%的提升。错误:reduce oom
reduce task去map拉数据,reduce ⼀边拉数据⼀边聚合 reduce段有⼀块聚合内存(executor memory * 0.2)解决办法:1、增加reduce 聚合的内存的⽐例 设置spark.shuffle.memoryFraction2、 增加executor memory的⼤⼩ --executor-memory 5G
3、减少reduce task每次拉取的数据量 设置spark.reducer.maxSizeInFlight 24m*/