
Scala/Spark应用剖析与开发优化
文章平均质量分 91
scala基础语法,scala开发应用,spark开发应用,开发优化使用等,从基础入门到企业开发应用,一站式系统化学习。
涤生大数据
在职阿里,美团,京东,字节大数据技术专家,擅长大数据开发,集群架构/运维,爱好python数据分析/爬虫,
加 v: dsflink 可免费转行评估,职业规划,校招规划,大数据进阶指导,简历把脉
欢迎一起交流
展开
-
Spark实战中的坑,你踩过几个?技术专家深度解析!
在这篇文章中,以大数据从业近十年的工作经验来看,我尽可能收集到一些常见的错误和问题以及我们可以实施的解决方案和优化。原创 2025-03-25 19:19:29 · 816 阅读 · 0 评论 -
SparkSQL面试到这些内容,你能一次说清楚吗?(上)
今天带各位梳理一下很多SparkSQL在使用中模棱两可得的事情,今天一文带大家全部理清楚。涤生出品,内容很干,不管是在面试还是在实际的工作中,能够理清以下问题,你就是最靓的仔。原创 2025-03-13 14:31:27 · 668 阅读 · 0 评论 -
深入理解Spark BlockManager:定义、原理与实践
Spark是一个开源的大数据处理框架,其主要特点是高性能、易用性以及可扩展性。在Spark中,BlockManager是其核心组件之一,原创 2024-02-08 07:45:00 · 2374 阅读 · 0 评论 -
spark系列18:sparksql操作hive表的使用
1.SparkSQL 整合 Hive导读 开启Hive的MetaStore独立进程 整合SparkSQL和Hive的MetaStore 和一个文件格式不同,Hive是一个外部的数据存储和查询引擎, 所以如果Spark要访问Hive的话, 就需要先整合Hive整合什么 ?如果要讨论SparkSQL如何和Hive进行整合, 首要考虑的事应该是Hive有什么, 有什么就整合什么就可以 MetaStore, 元数据存储 Spar...原创 2021-03-18 21:42:43 · 9672 阅读 · 0 评论 -
spark系列17: DataFrameReader读取json/parquet等格式文件详解
1.DataFrameReader是什么?目标 理解DataFrameReader的整体结构和组成 SparkSQL的一个非常重要的目标就是完善数据读取, 所以SparkSQL中增加了一个新的框架, 专门用于读取外部数据源, 叫做DataFrameReaderimport org.apache.spark.sql.SparkSessionimport org.apache.spark.sql.DataFrameReaderval spark: SparkSession...原创 2021-03-18 19:57:03 · 4212 阅读 · 1 评论 -
spark系列16:DataSet和DataFrame使用详解
1.Dataset 的特点目标 理解Dataset是什么 理解Dataset的特性 Dataset是什么?val spark: SparkSession = new sql.SparkSession.Builder() .appName("hello") .master("local[6]") .getOrCreate()import spark.implicits._val dataset: Dataset[People] = spark.cre...原创 2021-03-18 19:49:35 · 2184 阅读 · 1 评论 -
spark系列15:catalyst使用介绍与演示
1.Catalyst 优化器目标 理解SparkSQL和以RDD为代表的SparkCore最大的区别 理解优化器的运行原理和作用 1. RDD 和 SparkSQL 运行时的区别RDD的运行流程大致运行步骤先将RDD解析为由Stage组成的DAG, 后将Stage转为Task直接运行问题任务会按照代码所示运行, 依赖开发者的优化, 开发者的会在很大程度上影响运行效率解决办法创建一个组件, 帮助开发者修改和优化代码, 但是...原创 2021-03-18 19:46:27 · 1434 阅读 · 1 评论 -
spark系列14:sparksql入门与介绍使用
1. SparkSQL 是什么目标对于一件事的理解, 应该分为两个大部分, 第一, 它是什么, 第二, 它解决了什么问题 理解为什么会有SparkSQL 理解SparkSQL所解决的问题, 以及它的使命 1.1. SparkSQL 的出现契机目标理解SparkSQL是什么主线 历史前提 发展过程 重要性 数据分析的方式数据分析的方式大致上可以划分为SQL和 命令式两种命令式在前面的RDD部分, 非常明显可以感...原创 2021-03-18 11:32:43 · 711 阅读 · 0 评论 -
spark系列13:闭包,累加器,广播变量
1. RDD 的分布式共享变量、闭包目标 理解闭包以及 Spark 分布式运行代码的根本原理 理解累加变量的使用场景 理解广播的使用场景 什么是闭包闭包是一个必须要理解, 但是又不太好理解的知识点, 先看一个小例子@Testdef test(): Unit = { val areaFunction = closure() val area = areaFunction(2) println(area)}def closure(): Int =&原创 2021-03-18 11:08:29 · 770 阅读 · 0 评论 -
spark系列12:RDD,stage,job,shuffle物理执行过程
1. 物理执行图生成 物理图的意义 如何划分 Task 如何划分 Stage 物理图的作用是什么?问题一: 物理图的意义是什么?物理图解决的其实就是RDD流程生成以后, 如何计算和运行的问题, 也就是如何把 RDD 放在集群中执行的问题问题二: 如果要确定如何运行的问题, 则需要先确定集群中有什么组件 首先集群中物理元件就是一台一台的机器 其次这些机器上跑的守护进程有两种:Master,Worker 每个守护进程其实就代表了一台...原创 2021-03-17 18:21:47 · 878 阅读 · 0 评论 -
spark系列11:RDD之间的依赖关系,窄依赖和宽依赖
1.RDD 之间的依赖关系导读 讨论什么是 RDD 之间的依赖关系 继而讨论 RDD 分区之间的关系 最后确定 RDD 之间的依赖关系分类 完善案例的逻辑关系图 什么是RDD之间的依赖关系? 什么是关系(依赖关系) ? 从算子视角上来看,splitRDD通过map算子得到了tupleRDD, 所以splitRDD和tupleRDD之间的关系是map 但是仅仅这样说, 会不够全面, 从细节上来看,RDD只是数据和关于数据...原创 2021-03-17 16:28:54 · 1649 阅读 · 1 评论 -
spark系列10:spark底层运行原理,执行计划
1.Spark 底层逻辑导读 从部署图了解Spark部署了什么, 有什么组件运行在集群中 通过对WordCount案例的解剖, 来理解执行逻辑计划的生成 通过对逻辑执行计划的细化, 理解如何生成物理计划 如无特殊说明, 以下部分均针对于Spark Standalone进行介绍 部署情况在Spark部分的底层执行逻辑开始之前, 还是要先认识一下Spark的部署情况, 根据部署情况, 从而理解如何调度.针对于上图, ...原创 2021-03-17 15:25:12 · 996 阅读 · 0 评论 -
spark系列9:RDD的缓存和checkpoint机制
1缓存概要 缓存的意义 缓存相关的 API 缓存级别以及最佳实践 1.1. 缓存的意义使用缓存的原因 - 多次使用 RDD需求: 在日志文件中找到访问次数最少的 IP 和访问次数最多的 IPval conf = new SparkConf().setMaster("local[6]").setAppName("debug_string")val sc = new SparkContext(conf)val interimRDD = sc.textFile原创 2021-03-17 11:56:12 · 736 阅读 · 0 评论 -
spark系列8:RDD的分区和shuffle使用介绍
1.RDD 的 Shuffle 和分区目标 RDD 的分区操作 Shuffle 的原理 分区的作用RDD 使用分区来分布式并行处理数据, 并且要做到尽量少的在不同的 Executor 之间使用网络交换数据, 所以当使用 RDD 读取数据的时候, 会尽量的在物理上靠近数据源, 比如说在读取 Cassandra 或者 HDFS 中数据的时候, 会尽量的保持 RDD 的分区和数据源的分区数, 分区模式等一一对应分区和 Shuffle 的关系分区的主要作用是用来实现并行计算, 本原创 2021-03-17 11:25:54 · 1078 阅读 · 0 评论 -
spark系列7:RDD对不同数据类型的支持与演示
1.RDD 对不同类型数据的支持目标 理解 RDD 对 Key-Value 类型的数据是有专门支持的 理解 RDD 对数字类型也有专门的支持 一般情况下 RDD 要处理的数据有三类 字符串 键值对 数字型 RDD 的算子设计对这三类不同的数据分别都有支持 对于以字符串为代表的基本数据类型是比较基础的一些的操作, 诸如 map, flatMap, filter 等基础的算子 对于键值对类型的数据, 有额外的支持, 诸如 reduceByKe原创 2021-03-16 20:59:19 · 1202 阅读 · 0 评论 -
spark系列6:常用RDD介绍与演示
0. RDD 的算子目标 理解 RDD 的算子分类, 以及其特性 理解常见算子的使用 分类RDD 中的算子从功能上分为两大类 Transformation(转换) 它会在一个已经存在的 RDD 上创建一个新的 RDD, 将旧的 RDD 的数据转换为另外一种形式后放入新的 RDD Action(动作) 执行各个分区的计算任务, 将的到的结果返回到 Driver 中 RDD 中可以存放各种类型的数据, 那么对于不同类型的数据, RDD 又可以分为三类 针对基原创 2021-03-16 19:42:53 · 732 阅读 · 0 评论 -
spark系列5:深入了解RDD
1. 深入 RDD目标 深入理解 RDD 的内在逻辑, 以及 RDD 的内部属性(RDD 由什么组成) 1.1. 案例需求 给定一个网站的访问记录, 俗称 Access log 计算其中出现的独立 IP, 以及其访问的次数 val config = new SparkConf().setAppName("ip_ana").setMaster("local[6]")val sc = new SparkContext(config)val result = sc.t原创 2021-03-15 18:07:52 · 556 阅读 · 0 评论 -
spark系列4:RDD介绍与使用
4. RDD 入门目标上面通过一个 WordCount 案例, 演示了 Spark 大致的编程模型和运行方式, 接下来针对 Spark 的编程模型做更详细的扩展 理解 WordCount 的代码 从执行角度上理解, 数据之间如何流转 从原理角度理解, 各个算子之间如何配合 粗略理解 Spark 中的编程模型 RDD 理解 Spark 中 RDD 的各个算子 object WordCounts { def main(args: Ar原创 2021-03-15 17:01:05 · 659 阅读 · 0 评论 -
spark系列3:spark入门编程与介绍
3. Spark 入门目标 通过理解 Spark 小案例, 来理解 Spark 应用 理解编写 Spark 程序的两种常见方式 spark-shell spark-submit Spark 官方提供了两种方式编写代码, 都比较重要, 分别如下 spark-shell Spark shell 是 Spark 提供的一个基于 Scala 语言的交互式解释器, 类似于 Scala 提供的交互式解释器, Spark shell 也可以直接在 Shell原创 2021-03-15 11:42:00 · 830 阅读 · 0 评论 -
spark系列2:spark集群的配置与使用
2. Spark 集群搭建目标 从 Spark 的集群架构开始, 理解分布式环境, 以及 Spark 的运行原理 理解 Spark 的集群搭建, 包括高可用的搭建方式 2.1. Spark 集群结构目标 通过应用运行流程, 理解分布式调度的基础概念 Spark 如何将程序运行在一个集群中? Spark 自身是没有集群管理工具的, 但是如果想要管理数以千计台机器的集群, 没有一个集群管理工具还不太现实, 所以 Spark 可以借助外部..原创 2021-03-15 09:38:40 · 1596 阅读 · 0 评论 -
spark系列1:spark的前世今生
1.1. Spark是什么目标 了解 Spark 的历史和产生原因, 从而浅显的理解 Spark 的作用 Spark的历史 2009 年由加州大学伯克利分校 AMPLab 开创 2010 年通过BSD许可协议开源发布 2013 年捐赠给Apache软件基金会并切换开源协议到切换许可协议至 Apache2.0 2014 年 2 月,Spark 成为 Apache 的顶级项目 2014 年 11 月, Spark的母公司Databricks团队使用Sp原创 2021-03-15 09:17:39 · 915 阅读 · 0 评论 -
Scala系列23:Actor创建,Actor发送,接受消息等详解与案例演示
0.Actor介绍scala的Actor并发编程模型可以用来开发比Java线程效率更高的并发程序。我们学习scala Actor的目的主要是为后续学习Akka做准备。0.1 Java并发编程的问题在Java并发编程中,每个对象都有一个逻辑监视器(monitor),可以用来控制对象的多线程访问。我们添加sychronized关键字来标记,需要进行同步加锁访问。这样,通过加锁的机制来确保同一时间只有一个线程访问共享数据。但这种方式存在资源争夺、以及死锁问题,程序越大问题越麻烦。线程死锁0原创 2021-01-23 10:10:13 · 754 阅读 · 0 评论 -
Scala系列22:Scala泛型,非变,协变,逆变等使用详解
0.泛型scala和Java一样,类和特质、方法都可以支持泛型。我们在学习集合的时候,一般都会涉及到泛型。所以泛型,简单点理解就是定义(类,方法等)不指定具体数据类型,而在使用时才传入具体使用类型,这样的好处就是支持多类型的复用。0.1定义一个泛型方法在scala中,使用方括号[]来定义类型参数。语法格式def 方法名[泛型名称](..) = { //...}示例说明用一个方法来获取任意类型数组的中间的元素 不考虑泛型直接实现(基于Array[Int]实现) 加原创 2020-09-08 22:02:20 · 2073 阅读 · 0 评论 -
Scala系列21:Scala提取器的使用
0.提取器(Extractor)我们之前已经使用过scala中非常强大的模式匹配功能了,通过模式匹配,我们可以快速匹配样例类中的成员变量。例如:// 1. 创建两个样例类case class Person(name:String, age:Int)case class Order(id:String)def main(args: Array[String]): Unit = { // 2. 创建样例类对象,并赋值为Any类型 val zhangsan:Any = Perso原创 2020-09-08 21:14:17 · 681 阅读 · 0 评论 -
Scala系列20:Scala中异常捕获与抛出异常
0.异常处理来看看下面一段代码 def main(args: Array[String]): Unit = { val i = 10 / 0 println("你好!") }Exception in thread "main" java.lang.ArithmeticException: / by zero at ForDemo$.main(ForDemo.scala:3) at ForDemo.main(ForDemo.scala)执行程序,可以看到原创 2020-09-08 14:35:22 · 5659 阅读 · 0 评论 -
Scala系列19:Option类型,隐函数以及正则表达式的使用详解
0. Option类型使用Option类型,可以用来有效避免空引用(null)异常。也就是说,将来我们返回某些数据时,可以返回一个Option类型来替代。scala中,Option类型来表示可选值。这种类型的数据有两种形式: Some(x):表示实际的值 None:表示没有值 使用getOrElse方法,当值为None是可以指定一个默认值 0.1示例演示示例1定义一个两个数相除的方法,使用Option类型来封装结果 然后使用模式匹配来打印...原创 2020-09-07 15:31:52 · 759 阅读 · 0 评论 -
Scala系列18: 模式匹配之简单匹配,匹配类型,守卫,匹配样例类,匹配集合等详解
0.模式匹配scala中有一个非常强大的模式匹配机制,可以应用在很多场景:switch语句 类型查询 使用模式匹配快速获取数据1.简单模式匹配在Java中,有switch关键字,可以简化if条件判断语句。在scala中,可以使用match表达式替代。1.1 语法格式变量 match { case "常量1" => 表达式1 case "常量2" => 表达式2 case "常量3" => 表达式3 case _ => 表达式原创 2020-09-07 14:40:57 · 1494 阅读 · 0 评论 -
Scala系列17:样例类,样例对象以及样例方法使用详解
0.样例类 样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),在后续要学习并发编程和spark、flink这些框架也都会经常使用它。0.1定义样例类语法语法格式 在[]里的参数是可选的case class 样例类名([var/val] 成员变量名1:类型1, 成员变量名2:类型2, 成员变量名3:类型3)如果要实现某个成员变量可以被修改,可以添加var 默认为val,可以省略0.2示例 | 定义一个样例类参考代码/**示例...原创 2020-09-05 18:53:48 · 7151 阅读 · 1 评论 -
Scala系列16:trait实战,trait实现调用链模式
1.业务需求我们如果要开发一个支付功能,往往需要执行一系列的验证才能完成支付。例如:进行支付签名校验 数据合法性校验 ...如果将来因为第三方接口支付的调整,需要增加更多的校验规则,此时如何不修改之前的校验代码,来实现扩展呢?2.业务逻辑剖析2.1责任链模式2.2trait调用链【尖叫提示】 类多继承traint方法的调用顺序和构造器的调用顺序是不一致的。 类继承了多个trait后,可以依次调用多个trait中的同一个方法,只要让多个trait中的同一个方法在最...原创 2020-09-05 17:08:24 · 1267 阅读 · 0 评论 -
Scala系列15:抽象,匿名内部类,特质,模板等使用详解与演示
0. 抽象类和Java语言一样,scala中也可以定义抽象类0.1 定义如果类的某个成员在当前类中的定义是不包含完整的,它就是一个抽象类不完整定义有两种情况:方法没有方法体(抽象方法) 变量没有初始化(抽象字段)定义抽象类和Java一样,在类前面加上abstract关键字// 定义抽象类abstract class 抽象类名 { // 定义抽象字段 val 抽象字段名:类型 // 定义抽象方法 def 方法名(参数:参数类型,参数:参数类型...):返回类型原创 2020-09-05 16:43:00 · 1672 阅读 · 0 评论 -
Scala系列14:scala继承,重写,super,类型推断等使用详解
0.Scala继承scala语言是支持面向对象编程的,我们也可以使用scala来实现继承,通过继承来减少重复代码。0.1定义语法scala和Java一样,使用extends关键字来实现继承 可以在子类中定义父类中没有的字段和方法,或者重写父类的方法 类和单例对象都可以从某个父类继承语法class/object 子类 extends 父类 { ..}Copy示例0.2示例 | 类继承 定义一个Person类,再定义一个Student类,继承自Person类原创 2020-09-04 20:10:57 · 1639 阅读 · 0 评论 -
Scala系列13:scala单例对象,main方法,伴生对象,apply方法等使用详解
0.单例对象scala中没有Java中的静态成员,我们想要定义类似于Java的static变量、static方法,就要使用到scala中的单例对象——object.0.1定义单例对象单例对象表示全局仅有一个对象(类似于Java static概念)在scala中定义单例对象和定义类很像,就是把class换成object 在object中定义的成员变量类似于Java的静态变量 可以使用object对象.成员变量或者对象 成员变量等方式直接引用成员变量0.1.1示例示例说明定义一个D原创 2020-09-04 15:20:29 · 1674 阅读 · 0 评论 -
Scala系列12:Scala主构造器与辅助构造器使用详解与演示
0.类的构造器 跟Java一样,当我们创建类对象的时候,会自动调用类的构造器。之前我们创建类对象没有显示调用构造器,那是因为之前使用的都是默认构造器,此外,Scala中构造器分为主构造器和辅助构造器。我们接下来要学习如何自定义构造器。 同样,跟Java/C++一样,Scala可以有任意多的构造器,在Scala里,有一个主构造器和任意多的辅助构造器。1.主构造器我们学习过,Java的构造器,有构造列表和构造代码块class Person { // 成...原创 2020-09-03 19:07:47 · 1634 阅读 · 0 评论 -
Scala系列11:Scala类与对象,成员方法与变量,修饰符等详解
0.类和对象scala是支持面向对象的,也有类和对象的概念。我们依然可以基于scala语言来开发面向对象的应用程序。0.1创建类和对象用法使用class来定义一个类 使用new来创建对象示例创建一个Person类,并创建它的对象步骤创建一个scala项目,并创建一个Object 添加main方法 创建类和对象实现在IDEA中创建项目,并创建一个Object(main方法必须放在Object中) 添加main方法 创建一个Person类object _01Cl原创 2020-09-03 17:08:38 · 4277 阅读 · 0 评论 -
Scala系列10:函数式编程groupBy与排序sorted详解
0.Scala函数式编程我们将来使用Spark/Flink的大量业务代码都会使用到函数式编程。下面这些事开发中常用的函数式编程。注意这些函数都是操作 Scala 集合的,一般会进行两类操作:转换操作(transformation )和行动操作(actions)(有些人喜欢叫他为聚合操作)。第一种操作类型将集合转换为另一个集合,第二种操作类型返回某些类型的值。遍历( foreach ) 映射( map ) 映射扁平化( flatmap ) 过滤( filter ) 是否存在( exists )原创 2020-09-02 19:09:51 · 2459 阅读 · 1 评论 -
Scala系列9:聚合操作reduce,filter,reduceLeft,reduceRight,fold的使用详解
0.Scala函数式编程我们将来使用Spark/Flink的大量业务代码都会使用到函数式编程。下面这些事开发中常用的函数式编程。注意这些函数都是操作 Scala 集合的,一般会进行两类操作:转换操作(transformation )和行动操作(actions)(有些人喜欢叫他为聚合操作)。第一种操作类型将集合转换为另一个集合,第二种操作类型返回某些类型的值。遍历( foreach ) 映射( map ) 映射扁平化( flatmap ) 过滤( filter ) 是否存在( exists )原创 2020-09-02 16:25:49 · 4719 阅读 · 1 评论 -
Scala系列8:函数式编程之map,flatten,flatmap的使用详解
0.Scala函数式编程我们将来使用Spark/Flink的大量业务代码都会使用到函数式编程。下面这些事开发中常用的函数式编程。注意这些函数都是操作 Scala 集合的,一般会进行两类操作:转换操作(transformation )和行动操作(actions)(有些人喜欢叫他为聚合操作)。第一种操作类型将集合转换为另一个集合,第二种操作类型返回某些类型的值。遍历( foreach ) 映射( map ) 映射扁平化( flatmap ) 过滤( filter ) 是否存在( exists )原创 2020-09-02 14:49:53 · 9790 阅读 · 1 评论 -
Scala系列7:函数式编程之foreach,forall的使用详解
0.Scala函数式编程我们将来使用Spark/Flink的大量业务代码都会使用到函数式编程。下面这些事开发中常用的函数式编程。遍历( foreach ) 映射( map ) 映射扁平化( flatmap ) 过滤( filter ) 是否存在( exists ) 排序( sorted 、 sortBy 、 sortWith ) 分组( groupBy ) 聚合计算( reduce ) 折叠( fold )1. foreach的使用详解【1.1语法结构】foreach(f原创 2020-09-02 11:23:03 · 9912 阅读 · 1 评论 -
Scala系列6:Scala中Array,BufferArray,元组,list,set,map等集合使用详解
Scala中集合类的序列有:数组,元组,列表,Set集,Map映射,其中数组,列表,Set,Map又分为可变和不可变两种。下面就此详细展开介绍使用。0.数组的使用详解scala中数组的概念是和Java类似,可以用数组来存放一组数据。scala中,有两种数组,一种是定长数组,另一种是变长数组。0.1 定长数组定长数组指的是数组的长度是不允许改变的。通过指定长度定义数组,语法格式如下:val/var 变量名 = new Array[元素类型](数组长度) //方式1:通过指定...原创 2020-09-01 17:09:25 · 2343 阅读 · 0 评论 -
Scala系列5:轻松搞定Scala中方法与函数的区别与使用
0.方法介绍一个类可以有自己的方法, scala中的方法和Java方法类似。 但scala与Java定义方法的语法是不一样的, 而且scala支持多种调用方式。1.定义方法2.方法参数 *默认参数 *带名参数 *变长参数3.方法返回值类型推断4.方法调用方式 *后缀调用法 *中缀调用法 *花括号调用法 *无括号调用法 0.1.定义方法定义方法的语法格式:原创 2020-09-01 10:59:48 · 1220 阅读 · 0 评论