Spark 配置

2019年11月13日08:12:51
评论

Spark提供了三种主要本地设置来配置系统:

  • 环境变量 用来加载Spark的workers,可以在你的驱动程序或theconf/spark-env.shscript中设定。
  • Java系统属性 控制内部配置参数,可以通过编程方式设置(通过在创建SparkContext之前调用System.setProperty)或者通过inspark-env.sh中的SPARK_Java_OPTS环境变量。
  • 日志配置 通过log4j.properties来设置。

相关阅读

Spark简介及其在Ubuntu下的安装使用 http://www.linuxidc.com/Linux/2013-08/88606.htm

安装Spark集群(在CentOS上) http://www.linuxidc.com/Linux/2013-08/88599.htm

Hadoop vs Spark性能对比 http://www.linuxidc.com/Linux/2013-08/88597.htm

Spark安装与学习 http://www.linuxidc.com/Linux/2013-08/88596.htm

Spark 并行计算模型 http://www.linuxidc.com/Linux/2012-12/76490.htm

环境变量

Spark决定worker节点上如何初始化JVM,当你在本地运行spark-shell时也是这样,通过运行Spark安装目录下的conf/spark-env.sh脚本即可启动spark-shell。该脚本在Git库中默认不存在,但你可以通过复制conf/spark-env.sh.template来创建一个。确保复制后的脚本有执行权限。

在spark-env.sh中,你必需至少设置下面两个变量:

  • SCALA_HOME 指定你的Scala安装位置,或使用SCALA_LIBRARY_PATH指定Scala的jar库位置(如果你以Debian或RPM包方式安装Scala,无法设置SCALA_HOME,但库在一个特定目录里,通常是/usr/share/java,可以通过搜索scala-library.jar获取)。
  • MESOS_NATIVE_LIBRARY 如果你正运行在一个Mesos集群上设置该项。

另外,这里有4个另外的用于控制执行的变量。这些变量需要在运行Job的驱动程序的上下文设置,而不是在spark-env.sh,因为这些变量将会被自动传递给workers。在每一个job里设置这些变量可以使得不同的job对这些变量有不同的配置。

  • SPARK_JAVA_OPTS, 添加JVM选项。这包含了你用-D传递的一些系统属性。
  • SPARK_CLASSPATH, 向Spark的classpath添加元素
  • SPARK_LIBRARY_PATH, 添加本地库的搜索路径
  • SPARK_MEM, 设置每一个节点使用的内存大小。这应该和JVM的-Xmx选项类似的形式,比如300m或者1g。需要注意为了推行spark.executor.memorysystem属性,这个选项很快将不被推荐使用,所以我们推荐你使用在代码中使用spark.executor.memorysystem。

注意,如果在spark-env.sh文件中设置这些变量,他们将会被用户程序中设置的值所覆盖。如果你愿意,你可以选择只有在用户程序中没有设置的情况下在spark-env.sh中如下设置他们:

if [ -z "$SPARK_JAVA_OPTS" ] ; then
  SPARK_JAVA_OPTS="-verbose:gc"
fi

系统属性

为了设置Spark的系统属性,你需要给JVM传递一个-D标志的参数 (比如,java -Dspark.cores.max=5 MyProgram) 或者是在你创建Spark上下文的时候调用System.setProperty()方法,就像下面这样:

System.setProperty("spark.cores.max", "5")
val sc = new SparkContext(...)

大多数的可配置系统会在内部设置一个比较合理的默认值。但是,至少下面的5个属性你应该自己去设置的:

属性名称 默认值 含义
spark.executor.memory 512m 每个处理器可以使用的内存大小,跟JVM的内存表示的字符串格式是一样的(比如: '512m','2g')
spark.serializer spark.JavaSerializer 一个类名,用于序列化网络传输或者以序列化形式缓存起来的各种对象。默认情况下Java的序列化机制可以序列化任何实现了Serializable接口的对象,但是速度是很慢的,因此当你在意运行速度的时候我们建议你使用spark.KryoSerializer 并且配置 Kryo serialization。可以是任何 spark.Serializer的子类。
spark.kryo.registrator (none) 如果你使用的是Kryo序列化,就要为Kryo设置这个类去注册你自定义的类。这个类需要继承spark.KryoRegistrator。 可以参考 调优指南 获取更多的信息。
spark.local.dir /tmp 设置Spark的暂存目录,包括映射输出文件盒需要存储在磁盘上的RDDs。这个磁盘目录在你的系统上面访问速度越快越好。可以用逗号隔开来设置多个目录。
spark.cores.max (infinite) 当运行在一个独立部署集群上或者是一个粗粒度共享模式的Mesos集群上的时候,最多可以请求多少个CPU核心。默认是所有的都能用。

除了上体的5个外,下面还列举了一些属性,在某些情况下你可能需要自己去配置下。

属性名 默认值 含义
spark.mesos.coarse false 如果设置为了"true",将以粗粒度共享模式运行在Mesos集群上, 这时候Spark会在每台机器上面获得一个长期运行的Mesos任务,而不是对每个Spark任务都要产生一个Mesos任务。对于很多短查询,这个可能会有些许的延迟,但是会大大提高Spark工作时的资源利用率。
spark.default.parallelism 8 在用户没有指定时,用于分布式随机操作(groupByKey,reduceByKey等等)的默认的任务数。
spark.storage.memoryFraction 0.66 Spark用于缓存的内存大小所占用的Java堆的比率。这个不应该大于JVM中老年代所分配的内存大小,默认情况下老年代大小是堆大小的2/3,但是你可以通过配置你的老年代的大小,然后再去增加这个比率。
spark.ui.port (random) 你的应用程序控制面板端口号,控制面板中可以显示每个RDD的内存使用情况。
spark.shuffle.compress true 是否压缩映射输出文件,通常设置为true是个不错的选择。
spark.broadcast.compress true 广播变量在发送之前是否先要被压缩,通常设置为true是个不错的选择。
spark.rdd.compress false 是否要压缩序列化的RDD分区(比如,StorageLevel.MEMORY_ONLY_SER)。在消耗一点额外的CPU时间的代价下,可以极大的提高减少空间的使用。
spark.reducer.maxMbInFlight 48 同时获取每一个分解任务的时候,映射输出文件的最大的尺寸(以兆为单位)。由于对每个输出都需要我们去创建一个缓冲区去接受它,这个属性值代表了对每个分解任务所使用的内存的一个上限值,因此除非你机器内存很大,最好还是配置一下这个值。
spark.closure.serializer spark.JavaSerializer 用于闭包的序列化类。通常Java是可以胜任的,除非在你的驱动程序中分布式函数(比如map函数)引用了大量的对象。
spark.kryoserializer.buffer.mb 32 Kryo中运行的对象的最大尺寸(Kryo库需要创建一个不小于最大的单个序列化对象的缓存区)。如果在Kryo中出现"buffer limit exceeded"异常,你就需要去增加这个值了。注意,对每个worker而言,一个核心就会有一个缓冲。
spark.broadcast.factory spark.broadcast.HttpBroadcastFactory 使用哪一个广播实现
spark.locality.wait 3000 在发布一个本地数据任务时候,放弃并发布到一个非本地数据的地方前,需要等待的时间。如果你的很多任务都是长时间运行的任务,并且看到了很多的脏数据的话,你就该增加这个值了。但是一般情况下缺省值就可以很好的工作了。
spark.worker.timeout 60 如果超过这个时间,独立部署master还没有收到worker的心跳回复,那么就认为这个worker已经丢失了。
spark.akka.frameSize 10 在控制面板通信(序列化任务和任务结果)的时候消息尺寸的最大值,单位是MB。如果你需要给驱动器发回大尺寸的结果(比如使用在一个大的数据集上面使用collect()方法),那么你就该增加这个值了。
spark.akka.threads 4 用于通信的actor线程数量。如果驱动器有很多CPU核心,那么在大集群上可以增大这个值。
spark.akka.timeout 20 Spark节点之间通信的超时时间,以秒为单位
spark.driver.host (local hostname) 驱动器监听主机名或者IP地址.
spark.driver.port (random) 驱动器监听端口号
spark.cleaner.ttl (disable) Spark记忆任何元数据(stages生成,任务生成等等)的时间(秒)。周期性清除保证在这个时间之前的元数据会被遗忘。当长时间几小时,几天的运行Spark的时候设置这个是很有用的。注意:任何内存中的RDD只要过了这个时间就会被清除掉。
spark.streaming.blockInterval 200 从网络中批量接受对象时的持续时间。

日志配置

企鹅博客
  • 本文由 发表于 2019年11月13日08:12:51
  • 转载请务必保留本文链接:https://www.qieseo.com/159490.html

发表评论