Spark参数配置
来源:互联网 发布:mac os sierra dmg u盘 编辑:程序博客网 时间:2024/05/20 21:44
下面是整理的Spark中的一些配置参数,官方文档请参考Spark Configuration。
Spark提供三个位置用来配置系统:
- Spark属性:控制大部分的应用程序参数,可以用SparkConf对象或者Java系统属性设置
- 环境变量:可以通过每个节点的
conf/spark-env.sh
脚本设置。例如IP地址、端口等信息 - 日志配置:可以通过log4j.properties配置
Spark属性
Spark属性控制大部分的应用程序设置,并且为每个应用程序分别配置它。这些属性可以直接在SparkConf上配置,然后传递给SparkContext
。SparkConf
允许你配置一些通用的属性(如master URL、应用程序名称等等)以及通过set()
方法设置的任意键值对。例如,我们可以用如下方式创建一个拥有两个线程的应用程序。
val conf = new SparkConf() .setMaster("local[2]") .setAppName("CountingSheep") .set("spark.executor.memory", "1g")val sc = new SparkContext(conf)
动态加载Spark属性
在一些情况下,你可能想在SparkConf
中避免硬编码确定的配置。例如,你想用不同的master或者不同的内存数运行相同的应用程序。Spark允许你简单地创建一个空conf。
val sc = new SparkContext(new SparkConf())
然后你在运行时设置变量:
./bin/spark-submit --name "My app" --master local[4] --conf spark.shuffle.spill=false --conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" myApp.jar
Spark shell和spark-submit
工具支持两种方式动态加载配置。第一种方式是命令行选项,例如--master
,如上面shell显示的那样。spark-submit
可以接受任何Spark属性,用--conf
参数表示。但是那些参与Spark应用程序启动的属性要用特定的参数表示。运行./bin/spark-submit --help
将会显示选项的整个列表。
bin/spark-submit
也会从conf/spark-defaults.conf
中读取配置选项,这个配置文件中,每一行都包含一对以空格
或者等号
分开的键和值。例如:
spark.master spark://5.6.7.8:7077spark.executor.memory 512mspark.eventLog.enabled truespark.serializer org.apache.spark.serializer.KryoSerializer
任何标签指定的值或者在配置文件中的值将会传递给应用程序,并且通过SparkConf
合并这些值。在SparkConf
上设置的属性具有最高的优先级,其次是传递给spark-submit
或者spark-shell
的属性值,最后是spark-defaults.conf
文件中的属性值。
优先级顺序:
SparkConf > CLI > spark-defaults.conf
查看Spark属性
在http://<driver>:4040
上的应用程序Web UI在Environment
标签中列出了所有的Spark属性。这对你确保设置的属性的正确性是很有用的。
注意:只有通过spark-defaults.conf, SparkConf以及命令行直接指定的值才会显示
。对于其它的配置属性,你可以认为程序用到了默认的值。
可用的属性
控制内部设置的大部分属性都有合理的默认值,一些最通用的选项设置如下:
应用程序属性
spark.driver.memory
和JVM中对象的内存消耗)。spark.driver.memory512mdriver进程使用的内存数spark.executor.memory512m每个executor进程使用的内存数。和JVM内存串拥有相同的格式(如512m,2g)spark.extraListeners(none)注册监听器,需要实现SparkListenerspark.local.dir/tmpSpark中暂存空间的使用目录。在Spark1.0以及更高的版本中,这个属性被SPARK_LOCAL_DIRS(Standalone, Mesos)和LOCAL_DIRS(YARN)环境变量覆盖。spark.logConffalse当SparkContext启动时,将有效的SparkConf记录为INFO。spark.master(none)集群管理器连接的地方运行环境
在这个选项中设置Spark属性或者堆大小是不合法的
。Spark属性需要用--driver-class-path
设置。spark.driver.extraLibraryPath(none)指定启动driver的JVM时用到的库路径spark.driver.userClassPathFirstfalse(实验性)当在driver中加载类时,是否用户添加的jar比Spark自己的jar优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。spark.executor.extraClassPath(none)附加到executors的classpath的额外的classpath实体。这个设置存在的主要目的是Spark与旧版本的向后兼容问题。用户一般不用设置这个选项spark.executor.extraJavaOptions(none)传递给executors的JVM选项字符串。例如GC设置或者其它日志设置。注意,在这个选项中设置Spark属性或者堆大小是不合法的
。Spark属性需要用SparkConf对象或者spark-submit
脚本用到的spark-defaults.conf
文件设置。堆内存可以通过spark.executor.memory
设置spark.executor.extraLibraryPath(none)指定启动executor的JVM时用到的库路径spark.executor.logs.rolling.maxRetainedFiles(none)设置被系统保留的最近滚动日志文件的数量。更老的日志文件将被删除。默认没有开启。spark.executor.logs.rolling.size.maxBytes(none)executor日志的最大滚动大小。默认情况下没有开启。值设置为字节spark.executor.logs.rolling.strategy(none)设置executor日志的滚动(rolling)策略。默认情况下没有开启。可以配置为time
和size
。对于time
,用spark.executor.logs.rolling.time.interval
设置滚动间隔;对于size
,用spark.executor.logs.rolling.size.maxBytes
设置最大的滚动大小spark.executor.logs.rolling.time.intervaldailyexecutor日志滚动的时间间隔。默认情况下没有开启。合法的值是daily
, hourly
, minutely
以及任意的秒。spark.files.userClassPathFirstfalse(实验性)当在Executors中加载类时,是否用户添加的jar比Spark自己的jar优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。spark.python.worker.memory512m在聚合期间,每个python worker进程使用的内存数。在聚合期间,如果内存超过了这个限制,它将会将数据塞进磁盘中spark.python.profilefalse在Python worker中开启profiling。通过sc.show_profiles()
展示分析结果。或者在driver退出前展示分析结果。可以通过sc.dump_profiles(path)
将结果dump到磁盘中。如果一些分析结果已经手动展示,那么在driver退出前,它们再不会自动展示spark.python.profile.dump(none)driver退出前保存分析结果的dump文件的目录。每个RDD都会分别dump一个文件。可以通过ptats.Stats()
加载这些文件。如果指定了这个属性,分析结果不会自动展示spark.python.worker.reusetrue是否重用python worker。如果是,它将使用固定数量的Python workers,而不需要为每个任务fork()
一个Python进程。如果有一个非常大的广播,这个设置将非常有用。因为,广播不需要为每个任务从JVM到Python worker传递一次spark.executorEnv.[EnvironmentVariableName](none)通过EnvironmentVariableName
添加指定的环境变量到executor进程。用户可以指定多个EnvironmentVariableName
,设置多个环境变量spark.mesos.executor.homedriver side SPARK_HOME设置安装在Mesos的executor上的Spark的目录。默认情况下,executors将使用driver的Spark本地(home)目录,这个目录对它们不可见。注意,如果没有通过 spark.executor.uri
指定Spark的二进制包,这个设置才起作用spark.mesos.executor.memoryOverheadexecutor memory * 0.07, 最小384m这个值是spark.executor.memory
的补充。它用来计算mesos任务的总内存。另外,有一个7%的硬编码设置。最后的值将选择spark.mesos.executor.memoryOverhead
或者spark.executor.memory
的7%二者之间的大者Shuffle行为
netty
和nio
。基于netty的块传递在具有相同的效率情况下更简单spark.shuffle.compresstrue是否压缩map操作的输出文件。一般情况下,这是一个好的选择。spark.shuffle.consolidateFilesfalse如果设置为”true”,在shuffle期间,合并的中间文件将会被创建。创建更少的文件可以提供文件系统的shuffle的效率。这些shuffle都伴随着大量递归任务。当用ext4和dfs文件系统时,推荐设置为”true”。在ext3中,因为文件系统的限制,这个选项可能机器(大于8核)降低效率spark.shuffle.file.buffer.kb32每个shuffle文件输出流内存内缓存的大小,单位是kb。这个缓存减少了创建只中间shuffle文件中磁盘搜索和系统访问的数量spark.shuffle.io.maxRetries3Netty only,自动重试次数spark.shuffle.io.numConnectionsPerPeer1Netty onlyspark.shuffle.io.preferDirectBufstrueNetty onlyspark.shuffle.io.retryWait5Netty onlyspark.shuffle.managersort它的实现用于shuffle数据。有两种可用的实现:sort
和hash
。基于sort的shuffle有更高的内存使用率spark.shuffle.memoryFraction0.2如果spark.shuffle.spill
为true,shuffle中聚合和合并组操作使用的java堆内存占总内存的比重。在任何时候,shuffles使用的所有内存内maps的集合大小都受这个限制的约束。超过这个限制,spilling数据将会保存到磁盘上。如果spilling太过频繁,考虑增大这个值spark.shuffle.sort.bypassMergeThreshold200(Advanced) In the sort-based shuffle manager, avoid merge-sorting data if there is no map-side aggregation and there are at most this many reduce partitionsspark.shuffle.spilltrue如果设置为”true”,通过将多出的数据写入磁盘来限制内存数。通过spark.shuffle.memoryFraction
来指定spilling的阈值spark.shuffle.spill.compresstrue在shuffle时,是否将spilling的数据压缩。压缩算法通过spark.io.compression.codec
指定。Spark UI
spark.eventLog.enabled
为truespark.eventLog.dirfile:///tmp/spark-eventsSpark事件日志记录的基本目录。在这个基本目录下,Spark为每个应用程序创建一个子目录。各个应用程序记录日志到直到的目录。用户可能想设置这为统一的地点,像HDFS一样,所以历史文件可以通过历史服务器读取spark.eventLog.enabledfalse是否记录Spark的事件日志。这在应用程序完成后,重新构造web UI是有用的spark.ui.killEnabledtrue运行在web UI中杀死stage和相应的jobspark.ui.port4040你的应用程序dashboard的端口。显示内存和工作量数据spark.ui.retainedJobs1000在垃圾回收之前,Spark UI和状态API记住的job数spark.ui.retainedStages1000在垃圾回收之前,Spark UI和状态API记住的stage数压缩和序列化
spark.kryo.classesToRegister
会更简单。它应该设置一个继承自KryoRegistrator的类spark.kryoserializer.buffer.max.mb64Kryo序列化缓存允许的最大值。这个值必须大于你尝试序列化的对象spark.kryoserializer.buffer.mb0.064Kyro序列化缓存的大小。这样worker上的每个核都有一个缓存。如果有需要,缓存会涨到spark.kryoserializer.buffer.max.mb
设置的值那么大。spark.rdd.compresstrue是否压缩序列化的RDD分区。在花费一些额外的CPU时间的同时节省大量的空间spark.serializerorg.apache.spark.serializer.JavaSerializer序列化对象使用的类。默认的Java序列化类可以序列化任何可序列化的java对象但是它很慢。所有我们建议用org.apache.spark.serializer.KryoSerializerspark.serializer.objectStreamReset100当用org.apache.spark.serializer.JavaSerializer
序列化时,序列化器通过缓存对象防止写多余的数据,然而这会造成这些对象的垃圾回收停止。通过请求’reset’,你从序列化器中flush这些信息并允许收集老的数据。为了关闭这个周期性的reset,你可以将值设为-1。默认情况下,每一百个对象reset一次运行时行为
max(executor的core,2)
如果用户不设置,系统使用集群中运行shuffle操作的默认任务数(groupByKey、 reduceByKey等)spark.executor.heartbeatInterval10000executor 向 the driver 汇报心跳的时间间隔,单位毫秒spark.files.fetchTimeout60driver 程序获取通过SparkContext.addFile()
添加的文件时的超时时间,单位秒spark.files.useFetchCachetrue获取文件时是否使用本地缓存spark.files.overwritefalse调用SparkContext.addFile()
时候是否覆盖文件spark.hadoop.cloneConffalse每个task是否克隆一份hadoop的配置文件spark.hadoop.validateOutputSpecstrue是否校验输出spark.storage.memoryFraction0.6Spark内存缓存的堆大小占用总内存比例,该值不能大于老年代内存大小,默认值为0.6,但是,如果你手动设置老年代大小,你可以增加该值spark.storage.memoryMapThreshold2097152内存块大小spark.storage.unrollFraction0.2Fraction of spark.storage.memoryFraction to use for unrolling blocks in memory.spark.tachyonStore.baseDirSystem.getProperty(“java.io.tmpdir”)Tachyon File System临时目录spark.tachyonStore.urltachyon://localhost:19998Tachyon File System URL网络
spark.akka.heartbeat.interval
and spark.akka.failure-detector.threshold
if you need to.spark.akka.failure-detector.threshold300.0This is set to a larger value to disable failure detector that comes inbuilt akka. It can be enabled again, if you plan to use this feature (Not recommended). This maps to akka’s akka.remote.transport-failure-detector.threshold
. Tune this in combination of spark.akka.heartbeat.pauses
and spark.akka.heartbeat.interval
if you need to.spark.akka.heartbeat.interval1000This is set to a larger value to disable failure detector that comes inbuilt akka. It can be enabled again, if you plan to use this feature (Not recommended). A larger interval value in seconds reduces network overhead and a smaller value ( ~ 1 s) might be more informative for akka’s failure detector. Tune this in combination of spark.akka.heartbeat.pauses
and spark.akka.failure-detector.threshold
if you need to. Only positive use case for using failure detector can be, a sensistive failure detector can help evict rogue executors really quick. However this is usually not the case as gc pauses and network lags are expected in a real Spark cluster. Apart from that enabling this leads to a lot of exchanges of heart beats between nodes leading to flooding the network with those.调度相关属性
Dynamic Allocation
安全
spark.authenticate.secret
spark.authenticate.secretNone设置Spark两个组件之间的密匙验证。如果不是运行在YARN上,但是需要验证,这个选项必须设置spark.core.connection.auth.wait.timeout30连接时等待验证的实际。单位为秒spark.core.connection.ack.wait.timeout60连接等待回答的时间。单位为秒。为了避免不希望的超时,你可以设置更大的值spark.ui.filtersNone应用到Spark web UI的用于过滤类名的逗号分隔的列表。过滤器必须是标准的javax servlet Filter。通过设置java系统属性也可以指定每个过滤器的参数。spark.<class name of filter>.params='param1=value1,param2=value2'
。例如-Dspark.ui.filters=com.test.filter1
、-Dspark.com.test.filter1.params='param1=foo,param2=testing'
spark.acls.enablefalse是否开启Spark acls。如果开启了,它检查用户是否有权限去查看或修改job。UI利用使用过滤器验证和设置用户spark.ui.view.aclsempty逗号分隔的用户列表,列表中的用户有查看Spark web UI的权限。默认情况下,只有启动Spark job的用户有查看权限spark.modify.aclsempty逗号分隔的用户列表,列表中的用户有修改Spark job的权限。默认情况下,只有启动Spark job的用户有修改权限spark.admin.aclsempty逗号分隔的用户或者管理员列表,列表中的用户或管理员有查看和修改所有Spark job的权限。如果你运行在一个共享集群,有一组管理员或开发者帮助debug,这个选项有用加密
Spark Streaming
集群管理
Spark On YARN
spark.driver.memory
变量spark.driver.cores1claster模式时,driver使用的cpu核数,这时候driver运行在am中,其实也就是am和核数;client模式时,使用spark.yarn.am.cores
变量spark.yarn.am.cores1client 模式时,am的cpu核数spark.yarn.am.waitTime100000启动时等待时间spark.yarn.submit.file.replication3应用程序上传到HDFS的文件的副本数spark.yarn.preserve.staging.filesFalse若为true,在job结束后,将stage相关的文件保留而不是删除spark.yarn.scheduler.heartbeat.interval-ms5000Spark AppMaster发送心跳信息给YARN RM的时间间隔spark.yarn.max.executor.failures2倍于executor数,最小值3导致应用程序宣告失败的最大executor失败次数spark.yarn.applicationMaster.waitTries10RM等待Spark AppMaster启动重试次数,也就是SparkContext初始化次数。超过这个数值,启动失败spark.yarn.historyServer.address Spark history server的地址(不要加 http://
)。这个地址会在Spark应用程序完成后提交给YARN RM,然后RM将信息从RM UI写到history server UI上。spark.yarn.dist.archives(none) spark.yarn.dist.files(none) spark.executor.instances2executor实例个数spark.yarn.executor.memoryOverheadexecutorMemory * 0.07, with minimum of 384executor的堆内存大小设置spark.yarn.driver.memoryOverheaddriverMemory * 0.07, with minimum of 384driver的堆内存大小设置spark.yarn.am.memoryOverheadAM memory * 0.07, with minimum of 384am的堆内存大小设置,在client模式时设置spark.yarn.queuedefault使用yarn的队列spark.yarn.jar(none) spark.yarn.access.namenodes(none) spark.yarn.appMasterEnv.[EnvironmentVariableName](none)设置am的环境变量spark.yarn.containerLauncherMaxThreads25am启动executor的最大线程数spark.yarn.am.extraJavaOptions(none) spark.yarn.maxAppAttemptsyarn.resourcemanager.am.max-attempts in YARNam重试次数Spark on Mesos
使用较少,参考Running Spark on Mesos。
Spark Standalone Mode
参考Spark Standalone Mode。
Spark History Server
当你运行Spark Standalone Mode或者Spark on Mesos模式时,你可以通过Spark History Server来查看job运行情况。
Spark History Server的环境变量:
Spark History Server的属性:
spark.ui.view.acls
指定的用户可以查看应用程序信息;如果禁用,不做任何检查。环境变量
通过环境变量配置确定的Spark设置。环境变量从Spark安装目录下的conf/spark-env.sh
脚本读取(或者windows的conf/spark-env.cmd
)。在独立的或者Mesos模式下,这个文件可以给机器确定的信息,如主机名。当运行本地应用程序或者提交脚本时,它也起作用。
注意,当Spark安装时,conf/spark-env.sh
默认是不存在的。你可以复制conf/spark-env.sh.template
创建它。
可以在spark-env.sh
中设置如下变量:
除了以上这些,Spark standalone cluster scripts也可以设置一些选项。例如每台机器使用的核数以及最大内存。
因为spark-env.sh
是shell脚本,其中的一些可以以编程方式设置。例如,你可以通过特定的网络接口计算SPARK_LOCAL_IP
。
配置日志
Spark用log4j logging。你可以通过在conf目录下添加log4j.properties
文件来配置。一种方法是复制log4j.properties.template
文件。
- spark-05-spark 配置参数
- Spark配置参数
- Spark配置参数
- Spark参数有效配置
- Spark配置参数详解
- Spark配置参数
- spark参数配置
- Spark配置参数
- Spark参数配置
- Spark配置参数
- Spark参数配置
- Spark配置参数说明
- Spark配置参数详解
- spark jvm参数配置
- Spark参数配置
- spark参数配置调优
- Spark性能相关参数配置
- Spark中配置Parquet参数
- Qt之加密算法
- navicat premuim 12 链接 oracle 报错 28547
- arm-linux-gcc交叉编译器的安装与配置
- oracle启动(linux sunos aix HP-UX)
- 用构造方法构建对象时使用new关键字和不使用new关键字的差别
- Spark参数配置
- 程序即大脑的思考过程
- 4大技术巨头16年的传奇史
- sql执行顺序及性能优化
- JavaSE系列学习1.3-JavaSecurity(JCA)和密码学
- 【云周刊】第145期:2017天猫双11总交易额1682亿,背后阿里绝密50+技术揭秘!
- 类型特征萃取
- vuex在vue项目中的使用
- Springboot+proguard+maven 混淆