scala

Spark Broadcast源代码分析

蹲街弑〆低调 提交于 2020-08-08 12:45:49
1. Broadcast 简介 Broadcast广播变量是只读变量,它会将数据缓存在每个节点上,而不是每个Task去获取它的复制副本。这样可以降低计算过程中的网络开销。 broadcast的基本使用包括创建和读取。 创建 scala > val broadcastVar = sc . broadcast ( Array ( 1 , 2 , 3 ) ) broadcastVar : org . apache . spark . broadcast . Broadcast [ Array [ Int ] ] = Broadcast ( 0 ) 读取 scala > broadcastVar . value res0 : Array [ Int ] = Array ( 1 , 2 , 3 ) 2. BroadcastManager的初始化 BroadcastManager是用来管理Broadcast ,该实例对象是在SparkEnv.scala的create方法时候创建的。 private def create ( conf : SparkConf , executorId : String , bindAddress : String , advertiseAddress : String , port : Option [ Int ] , isLocal : Boolean ,

Spark文档阅读之二:Programming Guides

我与影子孤独终老i 提交于 2020-08-08 12:11:43
Quick Start: https://spark.apache.org/docs/latest/quick-start.html 在Spark 2.0之前,Spark的编程接口为RDD (Resilient Distributed Dataset)。而在2.0之后,RDDs被Dataset替代。Dataset很像RDD,但是有更多优化。RDD仍然支持,不过强烈建议切换到Dataset,以获得更好的性能。 RDD文档: https://spark.apache.org/docs/latest/rdd-programming-guide.html Dataset文档: https://spark.apache.org/docs/latest/sql-programming-guide.html 一、最简单的Spark Shell交互分析 scala> val textFile = spark.read.textFile( " README.md " ) # 构建一个Dataset textFile: org.apache.spark.sql.Dataset[String] = [value: string ] scala > textFile.count() # Dataset的简单计算 res0: Long = 104 scala > val linesWithSpark =

Lambda表达式用法大比较: Scala和Java 8

廉价感情. 提交于 2020-08-08 11:15:52
最近几年Lambda表达式风靡于编程界. 很多现代编程语言都把它作为函数式编程的基本组成部分. 基于JVM的编程语言如Scala,Groovy还有Clojure把它们作为关键部分集成在语言中.现在Java8也加入了它们的行列. 有趣的是,对于JVM来说,Lambda表达式是完全不可见的,并没有匿名函数和Lamada表达式的概念,它只知道字节码是严格面向对象规范的.它取决于语言的作者和它的编译器在规范限制内创造出更新,更高级的语言元素. 我们第一次接触它是在我们要给Takipi添加Scala支持的时候, 我们不得不深入研究Scala的编译器.伴随着JAVA8的来临,我认为探究Scala和java编译器是如何实现Lambda表达式是非常有趣的事情.结果也是相当出人意料. 接下来,我展示一个简单的Lambda表达式,用于将字符串集合转化成字符串自身长度的集合。 Java的写法 – 1List names = Arrays.asList("1", "2", "3"); 2Stream lengths = names.stream().map(name -> name.length()); Scala的写法 – 1.val names = List("1", "2", "3") 2.val lengths = names.map(name =>name.length) 表面上看起来非常简单

Apache Spark 自定义优化规则:Custom Optimizer Rule

我只是一个虾纸丫 提交于 2020-08-08 11:07:44
在 《Apache Spark 自定义优化规则:Custom Strategy》 文章中我们介绍了如何自定义策略,策略是用在逻辑计划转换到物理计划阶段。而本文将介绍如何自定义逻辑计划优化规则,主要用于优化逻辑计划,和前文不一样的地方是,逻辑优化规则只是等价变换逻辑计划,也就是 Logic Plan -> Login Plan,这个是在应用策略前进行的。 如果想及时了解 Spark 、Hadoop或者HBase相关的文章,欢迎关注微信公众号: iteblog_hadoop 假设我们有以下计算逻辑: val df = spark.range(10).toDF("counts") val iteblogDF = df.selectExpr("1 * counts ") println(iteblogDF.queryExecution.optimizedPlan.numberedTreeString) 我们有一张表,里面只有名为 counts 的一列,我们对表的每行都乘以 1,现在我们使用 iteblogDF.queryExecution.optimizedPlan.numberedTreeString 来看下上面表达式的优化之后的逻辑计划: 00 Project [(1 * id#0L) AS (1 * counts)#4L] 01 +- Range (0, 10, step=1,

Spark Cache源代码分析

邮差的信 提交于 2020-08-08 10:34:37
1. spark cache原理 Task运行的时候是要去获取Parent的RDD对应的Partition的数据的,即它会调用RDD的iterator方法把对应的Partition的数据集给遍历出来,具体流程如下图: 从图中可以看出,spark cache的本质就是将RDD的数据存储在了BlockManager上,下次重新使用的时候直接从BlockManager获取即可,免去了从“头”计算的开销。 2.cache 源代码分析 首先还是从RDD.scala的iterator方法开始,如果storageLevel不等于None,则调用getOrCompute,如果storageLevel等于None,则调用computeOrReadCheckpoint从头开始计算或者从checkpoint读取。 final def iterator ( split : Partition , context : TaskContext ) : Iterator [ T ] = { // storageLevel不等于NONE,说明RDD已经cache if ( storageLevel != StorageLevel . NONE ) { getOrCompute ( split , context ) } else { // 进行rdd partition的计算或者从checkpoint读取数据

Retrieve value from Some in scala

为君一笑 提交于 2020-08-08 08:42:06
问题 I am trying to retrieve case object used for creating enum from string Taking reference from Extracting field from Some in Scala sealed trait Mapping {def code: Int;def desc: Symbol} object types { case object TypeA extends Mapping { val code = 0; val desc = 'A } case object TypeB extends Mapping { val code = 1; val desc = 'B } val values=List(TypeA,TypeB) def getType(desc: Symbol) = values.find(_.desc == desc) } The below code makes me able to retrive value back from Some(TypeA) var s=types

为什么静态变量被认为是邪恶的?

半腔热情 提交于 2020-08-08 05:14:25
问题: I am a Java programmer who is new to the corporate world. 我是一位Java程序员,对公司领域来说是新手。 Recently I've developed an application using Groovy and Java. 最近,我已经使用 Groovy 和Java开发了一个应用程序。 All through the code I wrote used quite a good number of statics. 我编写的所有代码都使用了大量的静态变量。 I was asked by the senior technical lot to cut down on the number of statics used. 高级技术人员要求我减少使用的静电数量。 I've googled about the same, and I find that many programmers are fairly against using static variables. 我已经在谷歌上搜索了相同的内容,并且发现许多程序员都反对使用静态变量。 I find static variables more convenient to use. 我发现静态变量更易于使用。 And I presume that they are

Structural equality affected by location of case class definition after deserialisation

拟墨画扇 提交于 2020-08-07 06:00:02
问题 Why is structural equality comparison affected, after deserialisation to case class instance, by the location of case class definition being inside or outside another class. For example, the assertion in the following snippet package example import org.json4s.DefaultFormats import org.json4s.native.JsonMethods.parse class Foo { case class Person(name: String) def bar = { implicit val formats = DefaultFormats val expected = Person(name = "picard") val actual = parse("""{"name": "picard"}""")

Structural equality affected by location of case class definition after deserialisation

杀马特。学长 韩版系。学妹 提交于 2020-08-07 05:59:52
问题 Why is structural equality comparison affected, after deserialisation to case class instance, by the location of case class definition being inside or outside another class. For example, the assertion in the following snippet package example import org.json4s.DefaultFormats import org.json4s.native.JsonMethods.parse class Foo { case class Person(name: String) def bar = { implicit val formats = DefaultFormats val expected = Person(name = "picard") val actual = parse("""{"name": "picard"}""")

Structural equality affected by location of case class definition after deserialisation

ぐ巨炮叔叔 提交于 2020-08-07 05:59:28
问题 Why is structural equality comparison affected, after deserialisation to case class instance, by the location of case class definition being inside or outside another class. For example, the assertion in the following snippet package example import org.json4s.DefaultFormats import org.json4s.native.JsonMethods.parse class Foo { case class Person(name: String) def bar = { implicit val formats = DefaultFormats val expected = Person(name = "picard") val actual = parse("""{"name": "picard"}""")