Spark源码-SparkConf(scala)


这个类的目的是配置用户运行时的一些配置,因为是伴生类和伴生对象,所以分为2部分讲解。

SparkConf Class

这个类有几个属性:

  1. settings = new ConcurrentHashMap[String, String]() 一个线程安全的hashMap 用来保存配置key-value
  2. private lazy val reader: ConfigReader 一个configReader读取器
    这个里面涉及到了SparkConfigProvider这个类的说明参见文章下面
  3. loadDefaults: Boolean 用来flag是否从SystemProperties加载properties

这个类的构造方法:

  1. def this() = this(true) 转移到第2个构造方法去,默认SystemProperties加载properties
  2. class SparkConf(loadDefaults: Boolean) 执行这个构造方法时,会执行这个类的 loadFromSystemProperties(false) 方法,会把system properties 以 spark.* 开头的值遍历加入到 这个类的settings属性;如果传入参数为false的话,会加载已经打印提示用户可能这些配置已经被DeprecationWarning和可能已经被某些参数替换了(被压制的 deprecatedConfigs 列表是SparkConf object 的一个属性,configsWithAlternatives 也一样)
    最新这个key-value config 被put 到 这个类的settings属性中了

SparkConf object

ConfigProvider

ConfigProvider是一个trait,目的在于提供一个统一的get configuration values 的接口。

//返回的是一个 Option[String]类型的值
def get(key: String): Option[String]

一共有4个实现类:

  1. EnvProvider
  2. SystemProvider
  3. MapProvider
  4. SparkConfigProvider

EnvProvider

private[spark] class EnvProvider extends ConfigProvider {
//sys.env 返回的是不会被修改的当前系统环境
  override def get(key: String): Option[String] = sys.env.get(key)

}

SystemProvider

private[spark] class SystemProvider extends ConfigProvider {
//sys.props返回的是系统的属性,以下内容一定是存在的
//java.version         Java version number
//java.vendor          Java vendor specific string
//java.vendor.url      Java vendor URL
//java.home            Java installation directory
//java.class.version   Java class version number
//java.class.path      Java classpath
//os.name              Operating System Name
//os.arch              Operating System Architecture
//os.version           Operating System Version
//file.separator       File separator ("/" on Unix)
//path.separator       Path separator (":" on Unix)
//line.separator       Line separator ("\n" on Unix)
//user.name            User account name
//user.home            User home directory
//user.dir             User's current working directory
  override def get(key: String): Option[String] = sys.props.get(key)

}

MapProvider

import java.util.{Map => JMap}
//可以看到它的构造方法中需要一个java的map,在获取java map 的内容时候,只是用scala 的 option 做了一层包装。
private[spark] class MapProvider(conf: JMap[String, String]) extends ConfigProvider {

  override def get(key: String): Option[String] = Option(conf.get(key))

}

SparkConfigProvider

import java.util.{Map => JMap}
//可以看到它的构造方法中也需要一个java的map,在获取java map 的内容时候,只允许获取以 spark. 开头的key的值,否则返回None。
//当获取以 spark. 开头的key的值,且在这个java map 中没有值的时候,将会继续从SparkConf.getDeprecatedConfig (已经过时的配置)中获取 值。
private[spark] class SparkConfigProvider(conf: JMap[String, String]) extends ConfigProvider {

  override def get(key: String): Option[String] = {
    if (key.startsWith("spark.")) {
      Option(conf.get(key)).orElse(SparkConf.getDeprecatedConfig(key, conf))
    } else {
      None
    }
  }

}

ConfigReader class object

ConfigReader 这个类用来读取config entries。

ConfigReader object

这个伴生对象里面只是有一个模式常量:

private val REF_RE = "\\$\\{(?:(\\w+?):)?(\\S+?)\\}".r

ConfigReader class

属性:

  1. bindings = new HashMap[String, ConfigProvider]() 保存 env,system 等的ConfigProvider
  2. conf 构造方法传进来的 ConfigProvider

构造方法:

//这里的ConfigProvider 是一个trait,一共有4个实现类
//这个构造方法 初始化 自己属性的conf:ConfigProvider
class ConfigReader(conf: ConfigProvider){
	//属性bindings 缓存 构造时的 null -> ConfigProvider,env -> EnvProvider,system -> SystemProvider
	//避免不同环境的conf 覆盖
	bind(null, conf)
  	bindEnv(new EnvProvider())
  	bindSystem(new SystemProvider())
}

//这个构造方法可以传进来一个java map,在内部会转化为ConfigProvider trait的一个实现类 MapProvider,再转移到上面的构造方法中去了
def this(conf: JMap[String, String]) = this(new MapProvider(conf))

这个类的substitute方法是一个比较复杂的,目的在于如果 在 属性conf 中通过key查到的值是特殊的,比如${env.java} 这种形式的 值,这个方法则会自己解析这个value,继续从EnvProvider、SystemProvider获取真实的值。

### 回答1: Spark Streaming是Apache Spark的一个子模块,提供实时数据流处理的功能。它支持多种编程语言,其包括Scala。因此,您可以使用Scala语言来编写Spark Streaming应用程序。 ### 回答2: Spark Streaming是Spark项目的一个组件,它可以让我们对于实时数据进行流式处理,同时还支持批处理。使用Spark Streaming可以对实时数据进行分析、处理和存储,为实时分析提供了一个良好的解决方案。 在使用Spark Streaming时,我们可以使用Scala作为编程语言来编写应用程序。Scala是一门基于JVM的编程语言,它具有面向对象和函数式编程的特点,同时也具有静态类型检查和类型推断等特性,因此它非常适合将Spark Streaming与其他Scala库进行结合使用。 在使用Scala编写Spark Streaming应用程序时,我们通常需要使用一些Scala的头歌,这些头歌可以帮助我们更加方便地使用Spark Streaming的API,并且提高代码的可读性和可维护性。下面介绍几个常用的Scala头歌: 1. import org.apache.spark.SparkConf 这个头歌用来创建SparkConf对象,这个对象代表着Spark应用程序的配置信息,包括了应用程序的名称、运行模式、运行的Master节点等等。 2. import org.apache.spark.streaming.{Seconds, StreamingContext} 这个头歌用来创建StreamingContext对象,这个对象代表着Spark Streaming应用程序的上下文环境,通过这个对象我们可以定义输入流、转换流和输出流的处理逻辑。 3. import org.apache.spark.streaming.kafka.KafkaUtils 这个头歌用来与Apache Kafka集成,使用这个头歌可以很方便地将实时数据从Kafka读取到Spark Streaming进行分析和处理。 4. import org.apache.spark.streaming.dstream.DStream 这个头歌代表着Spark Streaming的一个流,我们可以对这个流进行各种操作,例如map、filter、reduce等等,从而实现对实时数据的处理和分析。 除了以上几个Scala头歌之外,还有很多其他的头歌可以用来增强Spark Streaming的功能,例如org.apache.spark.streaming.flume、org.apache.spark.streaming.twitter等等,使用这些头歌可以相应地处理来自不同来源的实时数据。 ### 回答3: Spark Streaming 是 Spark 非常强大的组件之一,它允许你使用类似数据流的方式来处理实时数据。Spark Streaming 采用了类似于微批处理的方式,将连续不断的数据流切割成一个个微批处理来运行,从而实现了实时数据处理。 ScalaSpark 开发语言最为常见的一种,它是一种面向对象和函数式编程的混合语言,拥有简洁的语法、强大的类型系统和函数式编程的一些关键特性。 在 Spark Streaming 框架Scala 可以帮助开发者更快速地编写代码,并且 Scala 编写的代码也具有非常好的可读性和可维护性。Scala 还带来了更加强大的函数式编程特性,如高阶函数、匿名函数和模式匹配等,这些特性在处理实时数据流时非常实用。 同时,Scala 也支持面向对象编程,因此可以轻松地使用面向对象编程的设计模式来编写 Spark Streaming 的代码。比如,可以使用 Scala 的 case class 对输入数据进行模式匹配、使用函数式编程的 map 和 filter 操作对数据流进行转换。 总的来说,ScalaSpark Streaming 开发一首非常好的头歌,Scala 的优秀特性可以帮助我们更快速地开发高性能、可维护和可扩展的实时数据处理应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值