1.Spark基本入门

1.Spark框架概述

Apache Spark时用于大规模数据处理的统一分析引擎

Spark相对于Hadoop有着巨大的优势,但Spark并不能完全替代Hadoop

  • 在计算层面,Spark相较于MR有着巨大的性能优势,但至今仍有许多计算工具基于MR框架,比如Hive
  • Spark仅做计算,而Hadoop生态圈不仅有计算(MR)也有存储(HDFS)和资源调度(YARN),HDFS和YARN仍是许多大数据体系的核心架构

Spark特点

  • 速度快:Spark支持内存计算,并用过有向无环图执行引擎支持无环数据流,所以官方宣称在内存中运算速度要比Hadoop的MR快100倍,在硬盘中快10倍。Spark处理数据时,可以将中间处理结果存储到内存中;Spark提供了非常丰富的算子(API),可以做到复杂任务的一个Spark程序中完成。
  • 易于使用:Spark支持包括java、scala、python、R和SQL语言在内的多种语言
  • 通用性强:在Spark的基础上,Spark提供了包括Spark SQL、Spark Streaming、MLib及Graphx在内的多个工具库,可以在一个应用中无缝地使用这些工具库
  • 运行方式多:Spark支持多种运行方式,包括Hadoop和Mesos上也支持Standalone的独立运行模式,同时也可以运行在云K8s(Spark2.3开始)上

Spark框架模块(了解)
整个Spark框架模块包括:Spark Core、Spark SQL、Spark Streaming、Spark GraphxX、Spark MLlib,后四项的能力都是建立在Spark Core上的

Spark以RDD为数据抽象,提供Python、Java、Scala、R语言的API,可以编程进行海量离线数据批处理计算
SparkSQL提供结构化数据的处理模块。SparkSQL支持以SQL语言对数据进行处理,SparkSQL本身针对离线计算场景。同时基于SparkSQL,spark提供了StructuredStreaming模块,可以在SparkSQL为基础,进行数据的流式计算
SparkStreaming:提供数据的流式计算
MLlib:进行及其学习计算,内置大量的机器学习库和API
GraphX:进行图计算,提供大量的图计算API,方便用以分布式计算模式进行图计算

Spark的运行模式(了解)
Spark提供多种运行模式,包括:本地模式(单机)、Standalone模式(集群)、Hadoop YARN模式(集群)、K8s模式(容器集群)、云服务模式(运行在云平台上)

Spark的架构角色(理解)
Spark运行角色
Spark中由4个角色组成整个Spark的运行环境
Master角色,管理整个集群的资源,类比于YARN的ResouceManager
Worker角色,管理单个服务器的资源,类比于YARN的NodeManger
Driver角色,管理单个Spark任务在运行的时候的工作,类比于YARN的ApplicationMaster
Executor角色,单个任务运行的时候的一堆工作者,类比于YARN容器运行的TASK

从2个层面划分:
资源管理层面:
管理者:Spark是Master角色
工作中:Spark是Worker角色
从任务执行层面:
某任务管理者:Spark是Driver角色
某任务执行者:Spark是Executor角色

注:正常情况下Executor是干活的角色,不过在特殊场景下(local模式)Driver可以即管理又干活

2.Spark运行环境

2.1 Local

基本原理
本质:启动一个JVM Process进程(一个进程里面有多个线程),执行任务Task
Local模式可以限制模拟Spark集群环境的线程数量,即Local[N]或Local[]
其中N代表使用N个线程,不指定默认为1;Local[
]代表按照cpu的Cores设置线程数

角色分部:
资源管理:
Master:Local进程本身
Worker:Local进程本身
执行时:
Driver:Local进程本身(可以算做一种特殊的Executor)
Executor:不存在

注:由于时间关系,不进行环境搭建

2.2 Standalone

Standalone模式是Spark自带的一种集群模式,不同于本地模式启动多个进程来模拟集群的环境,Standalone模式是真实地在多个及其之间搭建Spark集群的环境没完全可以利用该模式搭建多机器集群,用于实际的大数据处理。

StandAlone是完整的Spark运行环境,其中:
Master角色以Master进程存在,Worker角色以Worker进程存在
Driver角色在运行时存在于Master进程内,Executor运行于Worker进程内

2.3 Spark程序运行层次结构

监控页面有不同的端口,不如4040,8080,18080

4040是一个运行的Application在运行的过程中临时绑定的端口,用以查看当前任务的状态,4040被占会顺延到4041,4042等;4040是一个临时端口,当程序运行完成后,4040会被注销

8080:默认是StandAlone下,Master角色在WEB端口,用以查看当前Master的状态

18080:默认是历史服务器的端口,由于每个程序运行完成后,4040端口就被注销了,在以后想要看某个程序运行状态就可以通过历史服务器查看,历史服务器长期稳定运行,可供随时查看被记录的运行程序。

2.4 StandAlone HA

Spark Standalone集群是Master-Slaves加噶偶的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master单点故障(SPOF)的问题

Spark解决单点故障的两个方案:
1.基于文件系统的单点恢复——只能用于开发或测试环境
2.基于zookeeper的Standby Masters——可以用于生产环境

StandAlone HA的原理
基于Zookeeper做状态的维护,开启多个Master进程,一个作为活跃,其他的作为备份,当活跃进程宕机,备份Master进行接管

跳过环境搭建

2.5 Spark on YARN

对于企业来说,在已经有YARN集群的亲体下在单独准备Spark StandAlone集群对资源的利用率就不高,在企业中,多数场景会将Spark运行在YARN集群中

对于Spark on YARN,无需部署Spark集群,只要找到一台服务器,充当Spark的客户端,即可提交任务到YARN集群中运行

Spark on YARN的本质
Master角色由YARN的ResourceManager担任
Worker角色由YARN的NodeManager担任
Driver角色运行在YARN容器内部或提交任务的客户端进程中
Executor运行在YARN提供的容器内部

Spark on YARN需要啥
1.需要Yarn集群
2.需要Spark客户端工具,比如spark-submit,可以将Spark程序提交到YARN中
3.需要被提交的代码程序

部署模式DeployMode
Spark on YARN是有两种运行模式,一种是Cluster模式另一种是Client模式
这两种模式的区别就是Driver运行的位置:Cluster模式中Driver运行在YARN容器内部和ApplicationMaster在同一容器内;Client模式中Driver运行在客户端进程中,比如Driver运行在spark-submit程序的进程中

Client模式:学习测试使用,输出结果会在客户端显示
Cluster模式:生产环境中使用该模式

3.PySpark

3.1 框架 vs 类库

类库:别人写好的代码,导入就可以使用,比如Pandas
框架:可以独立运行,并提供变成结构一的一种软件产品,Spark就是一个独立的框架

pandas用于小规模数据集的处理
spark用于大规模数据集的处理

3.2 什么是PySpark

bin/pyspark只是一个应用程序,提供python解释器执行环境来运行Spark任务
而PySpark值得是Python的运行类库,可以在Python代码中:import pyspark
PySpark是Spark官方提供的一个Pyhon类库,内置了完全的Spark API,可以通过PySpark类库来编写Spark应用程序,并将其调教到Spark集群中运行

安装PySpark

pip install pyspark
或
conda install pyspark

3.3 应用入口:SparkContext

Spark Application程序入口为:SparkContext,在任何一个应用首先需要构建SparkContext对象

conf = SparkConf().setAppName(appName).setMaster(master)
sc = SparkContext(conf=conf)

测试

from pyspark import SparkConf, SparkContext
import os
os.environ["PYSPARK_PYTHON"] = r"D:\anaconda\envs\spark\Lib\site-packages\pyspark\python.exe"

if __name__ == '__main__':
    # 如果要拷给到服务器中运行,则删除.setMaster("local[*]")
    conf = SparkConf().setMaster("local[*]").setAppName("WordCountHelloWorld")
    # 通过SparkConf对象构建SparkContext对象
    sc = SparkContext(conf = conf)

    # 需求:wordcount单词计数,读取HDFS上的words.txt文件对其内部的单词统计出现的数量
    # 读取文件
    file_rrd = sc.textFile("hdfs://node1:8020/input/words.txt")

    # 将单词进行切割,得到一个存储全部单侧的集合对象
    words_rdd = file_rrd.flatMap(lambda line: line.split(" "))

    # 将单词转换为元组对象,key是单词,value是数字1
    words_with_one_rdd = words_rdd.map(lambda x: (x, 1))

    # 将元组的value 按key来分组,对所有的value执行聚合操作(相加)
    result_rdd = words_with_one_rdd.reduceByKey(lambda a, b: a + b)

    # 通过collect方法收集RDD的数据打印输出结果
    print(result_rdd.collect())

Python on Spark执行原理
PySpark总之是在不破坏Spark已有的运行时架构,在Spark架构外包装一层Python API,借助Py5j实现Python和Java的交换,进而实现通过Python编写Spark应用程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值