《Spark篇》------ Spark基础

news2024/11/15 15:24:44

目录

一、Spark简介

1.1、Spark是什么

1.2、Spark的特点

1.3、Spark生态系统

1.4、Spark Core的组件

1.5、Spark的安装流程

1.5.1、基础环境,安装Linux系统、Java环境和Hadoop环境

1.5.2、下载Spark文件并解压缩

1.5.3、编辑profile

1.5.4、Spark-shell运行

二、Spark集群搭建

2.1、Spark部署模式

2.2、为什么选择Spark On YARN

2.3、Spark On YARN模式

2.4、启动Spark

三、Scala基础语法与方法函数

3.1、Scala变量定义及循环等基础语法

3.1.1、变量定义

 3.1.2、If循环

 3.1.3、For循环

 3.1.4、Do while循环

3.2、集合的可变与不可变

3.2.1、不可变集合的基本语法

 3.2.2、可变集合的基本语法

3.3、数组的可变和不可变

3.3.1、不可变数组基本语法

3.3.2、可变数组的基本语法

3.4、列表的可变和不可变

3.4.1、不可变List基本语法

3.4.2、可变List基本语法

3.5、元组

3.6、映射(Map)的可变和不可变

3.6.1、不可变Map基本语法

3.6.2、可变Map基本语法

四、面向对象

4.1、什么是面向对象

4.2、什么是类

4.3、什么是对象

4.4、类和对象的基本结构

4.5、构造器

4.6、样例类和样例对象

五、Spark RDD编程

5.1、RDD转换操作

5.2、RDD行动操作

5.3、RDD分区

5.4、RDD缓存(持久化)

5.5、RDD键值对的操作和读写方法

5.6、实验

六、Spark SQL

6.1、什么是DataFrame

6.2、DataFrame、DataSet和RDD之间的转换

6.2.1、从RDD到DataFrame

6.2.2、从DataFrame到RDD


一、Spark简介

1.1、Spark是什么

Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎

1.2、Spark的特点

1、运行速度快:支持在内存中对数据进行迭代计算

2、易用性好:支持Scala、Java、Python等语言的编写,语法简洁

3、通用性强:Spark生态圈包含丰富组件

4、随处运行:Spark具有很强的适应性,可以访问不同的数据源

1.3、Spark生态系统

Spark生态圈以Spark Core为核心,从HDFS、Amazon S3和HBase等读取数据,以MESOS、YARN和自身携带的Standalone为资源管理器调度Job完成应用程序的计算。应用程序来自于不同的组件,如Spark Shell/Spark Submit的批处理、Spark Streaming实时处理应用、SparkSQL查询、MLlib机器学习、GraphX图处理等等。

1.4、Spark Core的组件

Spark Core是Spark框架最核心的部分,实现了Spark的基本功能,包括任务调度、内存管理、错误恢复与存储系统交互模块。

1)提供了有向无环图(DAG)的分布式并行计算框架,并提供了Cache机制来支持多次迭代计算或者数据共享,大大减少了迭代计算之间读取数据的开销。

2)Spark中引入的RDD是分布在多个计算节点上的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可根据“血统”进行重建,保证高容错性。

3)移动计算而非移动数据,RDD Partition可以就近读取分布式文件系统中的数据块到各个节点内存中进行计算

1.5、Spark的安装流程

1.5.1、基础环境,安装Linux系统、Java环境和Hadoop环境

1.5.2、下载Spark文件并解压缩

tar -zxvf spark-3.0.3-bin-hadoop2.7.tgz

1.5.3、编辑profile

vim /etc/profile

追加spark配置内容,注意不是覆盖

export SPARK_HOME=/home/spark/spark-3.0.3-bin-hadoop2.7
export PATH=$PATH:${SPARK_HOME}/bin

最后要刷新配置

source /etc/profile

1.5.4、Spark-shell运行

启动Spark Shell成功后在输出信息的末尾可以看到“Scala>”的命令提示符号

使用命令“ :quit” 退出Spark Shell,也可以使用“ Ctrl + D”组合键,退出Spark Shell


二、Spark集群搭建

2.1、Spark部署模式

1)单机模式:Local模式:Spark单机运行

2)伪分布式模式:Standalone模式:使用Spark自带的简单集群管理器

3)分布式模式:Spark On YARN模式:使用YARN作为集群管理器

                           Spark On Mesos模式:使用Mesos作为集群管理器

2.2、为什么选择Spark On YARN

Spark On YARN模式的搭建比较简单,仅需要在YARN集群上的一个节点上安装Spark即可,该节点可作为提交Spark应用程序到YARN集群的客户端。

2.3、Spark On YARN模式

Spark On YARN模式有client和cluster两种模式,主要区别在于:Driver 程序的运行节点不同

client:Driver程序运行在客户端,适用于交互、调试、希望立即看到运行的输出结果。

cluster:Driver程序运行在由RM(ResourceManager)启动的AM(AplicationMaster)上,适用于生产环境。        

2.4、启动Spark

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
/home/spark/spark-3.0.3-bin-hadoop2.7/examples/jars/spark-examples_2.12-3.0.3.jar

三、Scala基础语法与方法函数

3.1、Scala变量定义及循环等基础语法

3.1.1、变量定义

 3.1.2、If循环

 3.1.3、For循环

 3.1.4、Do while循环

 

3.2、集合的可变与不可变

可变集合:可以在适当的地方被更新或扩展。这意味着可以修改,移除一个集合的元素,简单来说,就是这个集合本身可以动态变化

不可变集合:相比之下,永远不会改变。不过仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。简单来说,就是这个集合本身不能动态变化。

3.2.1、不可变集合的基本语法

var/val 变量名 = Set[类型]()
var/val 变量名 = Set(元素1, 元素2, 元素3,..)

 3.2.2、可变集合的基本语法

可变集指的是元素,长度都可变,它的创建方式和不可变集的创建方法一致,不过需要先导入可变集合类

3.3、数组的可变和不可变

3.3.1、不可变数组基本语法

var/val 变量名 = new Array[元素类型](数组长度)
var/val 变量名 = Array(元素1,元素2,...)

3.3.2、可变数组的基本语法

var/val 变量名 = new ArrayBuffer[元素类型](数组长度)
var/val 变量名 = ArrayBuffer(元素1,元素2,...)

3.4、列表的可变和不可变

列表的元素、长度是不可变的

3.4.1、不可变List基本语法

val/var 变量名 = List(元素1,元素2,元素3,...)

3.4.2、可变List基本语法

val/var 变量名 = ListBuffer[数据类型]()
val/var 变量名 = ListBuffer(元素1,元素2,元素3,..)

3.5、元组

val/var 元组名 = (元素 1, 元素 2, 元素 3....)
val/var 元组名 = 元素 1 -> 元素 2

3.6、映射(Map)的可变和不可变

3.6.1、不可变Map基本语法

val/var map = Map(键->值, 键->值, 键->值...)
val/var map = Map((键, 值), (键, 值), (键, 值), (键, 值)...)

3.6.2、可变Map基本语法

定义语法与不可变 Map 一致, 不过需要先手动导包: import scala.collection.mutable.Map

四、面向对象

4.1、什么是面向对象

面向对象是一种编程思想,它是基于面向过程的,是以对象即类的实例为基础完成编程

4.2、什么是类

类是属性和行为的集合体,是一个抽象的概念

4.3、什么是对象

对象是类的具体实例

4.4、类和对象的基本结构

创建类语法:class 类名 {属性和行为} 注意:如果类是空的、没有任何成员可省略{}

创建对象语法:val 对象名 = new 类()

4.5、构造器

当创建对象的时候,会自动调用类的构造器。之前使用的都是默认构造器。除了定义主构造器外,还可以根据需要来定义辅助构造器。把除了主构造器之外的构造器称为辅助构造器

分类:1、主构造器。2、辅助构造器

4.6、样例类和样例对象

样例类:在Scala中,样例类是一种特殊类,一般是用于保存数据的,在并发编程以及Spark、Flink这些框架中都会经常使用它。

样例对象:在Scala中,用case修饰的单例对象就叫样例对象,而且它没有主构造器


五、Spark RDD编程

5.1、RDD转换操作

filter(func):筛选出满足函数func的元素,并返回一个新的数据集

map(func):将每个元素传递到函数func中,并将结果返回为一个新的数据集

flatMap(func):与map()相似,但每个输入元素都可以映射到0或多个输出结果

groupByKey():应用于(K,V)键值对的数据集时,返回一个新的(K,Iterable)形式的数据集

reduceByKey(func):应用于(K,V)键值对的数据集时,返回一个新的(K,V)形式的数据集,其中每个值是每个key传递到函数func中进行聚合后的结果

5.2、RDD行动操作

count():返回数据集中的元素个数

collect():以数组的形式返回数据集中的所有元素

first():返回数据集中的第一个元素

take(n):以数组的形式返回数据集中的前n个元素

reduce(func):通过函数func(输入两个参数并返回一个值)聚合数据集中的元素

foreach(func):将数据集中的每个元素传递到函数func中运行

  

5.3、RDD分区

RDD是弹性分布式数据集,通常RDD很大,会被分成很多个分区,分别保存在不同节点上

5.4、RDD缓存(持久化)

在Spark中,RDD采用惰性求值的机制,每次遇到行动操作,都会从头开始执行计算。每次调用行动操作,都会触发一次从头开始的计算。这对于迭代计算而言,代价很大,迭代计算经常需要多次重复使用同一组数据。

缓存的意义:第二次动作操作时,只需要去使用第一次动作操作时缓存起来的值,避免重复计算

5.5、RDD键值对的操作和读写方法

1)键值对RDD的创建

val pairRDD = lines.flatMap(line => line.split("")).map(word => (word, 1))
pairRDD.foreach(println)

2)从文件中读取数据创建RDD

val textFile = sc.textFile(".....")

5.6、实验

1、有一个本地文件word.txt,里面包含了很多行文本,每行文本由多个单词构成,单词之间用空格分隔。可以使用如下语句进行词频统计(即统计每个单词出现的次数)

2、根据key值的最后一位数字,写到不同的文件

package com.qst.rdd

import org.apache.spark.{Partitioner, SparkConf, SparkContext}

//自定义分区类,需要继承org.apache.spark.Partitioner类
class MyPartitioner(numParts: Int) extends Partitioner {

  //覆盖分区数
  override def numPartitions: Int = numParts

  //覆盖分区号获取函数
  override def getPartition(key: Any): Int = {
    key.toString.toInt % 10
  }
}

object MyPartitioner {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("persistDemo")
    val sc = new SparkContext(conf)
    // 模拟5个分区的数据
    val data = sc.parallelize(1 to 10, 5)
    // 将每个元素转化为 (元素, 1) 的形式
    data.map((_, 1))
      // MyPartitioner的构造函数需要传入分区数,这里传入的是10,将原本的5个分区转变为10个分区
      .partitionBy(new MyPartitioner(10))
      // 对集合中的每个元组取第一个元素进行映射操作,返回一个包含映射结果的新集合。
      // 也就是只保留元素,去除分区前加的1
      .map(_._1)
      // 使用saveAsTextFile方法将结果保存到HDFS中。
      // Spark 会自动将数据写到多个文件中,每个文件对应一个分区。
      .saveAsTextFile("hdfs://192.168.74.80:9000/output6")
    sc.stop()
  }
}

六、Spark SQL

6.1、什么是DataFrame

与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema

6.2、DataFrame、DataSet和RDD之间的转换

6.2.1、从RDD到DataFrame

object SparkSQLDemo03 {
// 样例类
case class Person(id: Int, name: String, age: Int)
def main(args: Array[String]): Unit = {
// 准备工作:创建 SparkSession
val spark = SparkSession.builder().appName(this.getClass.getName).master("local[*]").getOrCreate()
val sc = spark.sparkContext
sc.setLogLevel("WARN")
// 1. 通过样例类进行转换
val linesRDD = sc.textFile("file/person.txt")
// 1.1. RDD[String] 变为 RDD[Person]
课程内容页
val personRDD: RDD[Person] = linesRDD.map(x => {
val arr = x.split(",")
Person(arr(0).toInt, arr(1), arr(2).toInt)
})
import spark.implicits._ // 隐式转换
// 1.2. RDD+样例类 => DataFrame
val personDF: DataFrame = personRDD.toDF()
val personDS: Dataset[Person] = personRDD.toDS()
personDF.show()
personDS.show()
// 关闭
spark.stop()
}
}

 6.2.2、从DataFrame到RDD

val rdd = pDF.rdd
println(rdd)
println(rdd.collect())
// 关闭
spark.stop()
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序 WEUI 隐藏导航栏使用自定义导航栏时Toptips在顶部显示

使用weui的toptips时候&#xff0c;我们的导航栏使用了自定义&#xff0c;高度根据系统来定的&#xff0c;然后使用form表单验证提示弹窗时&#xff0c;会在最上面被遮挡了。 需要使用weui ext-class 来实现穿透修改样式。 ext-class的top使用继承父元素的top即可 <mp-top…

将数组起始地址定向到SRAM2及错误L6220E的排查

今天有个程序要定义两个大数组&#xff0c;一个32k&#xff0c;一个16k。直接编译的话发现通不过&#xff0c;大概是提示空间不够。因为两个数组就占了48k&#xff0c;可是我的STM32L431CB有64k的RAM&#xff0c;怎么会不够呢&#xff1f;查了资料发现这个芯片的SRAM分为两块&a…

银河麒麟kylin v10 apt deb包问题记录

银河麒麟kylin v10 apt deb包问题记录 https://www.kylinos.cn/support/document/48.html 该补丁支持银河麒麟桌面操作系统V10 2101、V10 0402、V10 0416版本升级到银河麒麟桌面操作系统V10 2107。 下载链接如下 &#xff08;1&#xff09;官网下载链接&#xff1a; AMD64…

Python期末大作业——获取北上广深历史天气并做数据可视化

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 知识点: 动态数据抓包 requests发送请求 结构化非结构化数据解析 一、开发环境: 所使用软件工具&#xff1a; python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 需安装第三方模块&#xff1a; requests…

Spring AOP 快速入门

文章目录 一. 什么是Spring AOP二. 为什么要学习Spring AOP三. 学习 Spring AOP3.1 AOP 的组成3.1.1 切面 (Aspect)3.1.2 切点 (Pointcut)3.1.3 通知 (advice)3.1.4 连接点(Joinpoint) 3.2 实现 Spring AOP1. 添加 Spring Boot 的 AOP 框架2. 创建切面3. 创建切点4. 创建通知5.…

vue3自定义指令——元素平滑移动

vue提供一个用户可以高度自定义的指令入口directives 利用这个入口我们实现一个常见的元素平滑移动的自定义指令 ‘sl’ 首先我们结合指令创建一个多元素的界面&#xff1a; 这个场景我们在很多网站&#xff0c;商城都有见过&#xff0c;特别对于移动端的清单类界面 我们的终极…

Linux如何找回root密码

Linux如何找回root密码 首先&#xff0c;启动系统&#xff0c;进入开机界面&#xff0c;在界面中按“e”进入编辑界面。如图 进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以““Linux16”开头内容所在的行数”&#xff0c;在行的最后面输入&…

【几分醉意赠书活动 - 03期】 | 《Python系列丛书》

个人主页&#xff1a; 几分醉意的CSDN博客主页_传送门 个人主页&#xff1a; 陈老板的CSDN博客主页_传送门 赠书活动 | 第三期 本期好书推荐&#xff1a;《Python系列丛书》 粉丝福利&#xff1a;书籍赠送&#xff1a;共计送出30本 参与方式&#xff1a;关注公众号&#xff1a;…

IP-GUARD是否支持对打了水印的文档去除水印?

是否支持对打了水印的文档去除水印&#xff1f; 支持&#xff0c;从4.64.1005.0版本开始&#xff0c;支持对打了文档水印的文档做去水印的操作&#xff0c;但只是支持去除非图片类型的显式水印。支持右键文件去除、申请去除、自我备案去除三种方式。 例如&#xff1a; 对客户端…

短视频电商平台的流量货币化率

通过对内容社区的流量规模流量货币化率的估算&#xff0c;可以得出对应的商业化即变现能力&#xff0c;如电商GMV&#xff0c;广告收入规模。 货币化率 Take Rate 货币化率&#xff08;Take Rate&#xff0c;TR&#xff09;是电商平台报表指标而非业务指标&#xff0c;是广告收…

一步到位Python Django部署,浅谈Python Django框架

Django是一个使用Python开发的Web应用程序框架&#xff0c;它遵循MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;旨在帮助开发人员更快、更轻松地构建和维护高质量的Web应用程序。Django提供了强大的基础设施和工具&#xff0c;以便于处理复杂的业务逻…

【Eclipse】Eclipse的下载与安装

一.下载 下载地址&#xff1a;https://www.eclipse.org/downloads/packages/ 根据自己电脑的操作系统下载对应的版本 二.安装 解压到你想存放的路径上 设置该路径作为项目/代码存放的默认路径 \

修改knative func build的image

问题描述 基于func create创建的function的source code&#xff0c;并基于build创建出function对应的image。我们需在该image内创建安装iperf3。 解决步骤及遇到的errors 1. 查看本地的image&#xff0c;并运行该image podman images docker run -it -u root -p 10001:22 $…

Stream流 - 取最大对象、最小对象

需求&#xff1a;Dnl 对象包含属性 ygz&#xff08;有功总&#xff09;、wgz&#xff08;无功总&#xff09;&#xff0c;统计 Dnl 对象集合的最大有功总、最小有功总的对象。 集合&#xff1a; 对象1&#xff1a;ygz11.1、wgz22.2 对象2&#xff1a;ygz22.1、wgz66.2 对象3&a…

2023网络安全面试题汇总(附答案)

大家好&#xff0c;我是小V ,本人 17 年就读于一所普通的本科学校&#xff0c;20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全联合实验室。 又到了毕业季&#xff0c;大四的漂亮学姐即将下架&#xff0c;大一的小学妹还在来的路上&…

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

朋友们如果有需要全套《黑客&网络安全入门&进阶学习包》&#xff0c;可以&#x1f447;下方自取&#xff08;如遇问题&#xff0c;可以在评论区留言哦&#xff09;~ &#x1f447;&#x1f447;&#x1f447; 《黑客&网络安全入门&进阶学习包》 &#x1f446;&…

STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)

STM32F407硬件I2C实现MPU6050通讯 文章目录 STM32F407硬件I2C实现MPU6050通讯cubeide设置写操作与读操作函数实现复位&#xff0c;读取温度&#xff0c;角度等函数封装mpu6050.cmpu6050.h代码分析 DMP移植1.修改头文件路径为自己的头文件路径2.修改I2C读写函数为自己mcu平台的读…

6.12黄金何时走出区间震荡?后市如何布局

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周一(6月12日)亚市盘中&#xff0c;现货黄金维持震荡&#xff0c;金价现报1960美元/盎司。本周黄金交易员将迎来美国CPI数据以及美联储利率决议&#xff0c;预计将对…

vue3+ts+vite实现pinia

本篇文章主要从事3部分 单个store下的文件进行使用模块下进行使用(pinia不像vuex那样使用模块化了 直接在store下定义ts文件即可)pinia持久化使用 安装pinia : cnpm install pinia 安装持久化 cnpm install pinia-plugin-persistedstate 1.单文件: index.ts (先不要管user.ts)…

详细讲解!如何模拟后台API调用场景

目录 简介 Postman 迁移至 ApiFox ApiFox 导入 Postman ApiFox 展示 API 调用场景 增加断言验证 API 使用测试执行场景 API 序列 总结 简介 在进行Web性能测试时&#xff0c;我们不仅需要测试前端页面的性能&#xff0c;还需要测试与后台API的交互性能&#xff0c;以及…