分布式的计算Spark

Spark简介

什么是Spark?
Spark是一个用来实现快速而通用的集群计算的平台。扩展了广泛使用的MapReduce计算模型,而且高效地支持更多的计算模式,包括交互式查询和流处理。在处理大规模数据集的时候,速度是非常重要的。
Spark的一个重要特点就是能够在内存中计算,因而更快。即使在磁盘上进行的复杂计算,Spark依然比MapReduce更加高效。

Spark 相比 hadoop历史
– 发展尤为迅速
– Hadoop历史 11年时间
– Spark 6年时间

AMP数据分析栈
在这里插入图片描述

开发Spark的语言
Scala(很好)
Java(很好)
Python(不错)
R

Spark运行模式

  • Local:主要用于开发调试Spark应用程序
  • Standalone:利用Spark自带的资源管理与调度器运行Spark集群,采用Master/Slave结构
  • YARN:集群运行在Yarn资源管理器上,资源管理交给YARN,Spark只负责进行任务调度和计算(最常用)
  • Mesos:将资源管理管理交给Mesos,Spark只负责运行任务调度和计算

RDD及其特点

RDD是什么?
RDD是Spark的核心数据模型,全称为Resillient Distributed Dataset,即弹性分布式数据集。
RDD不存数据,只是计算逻辑。

RDD的五大特性:
1、RDD是由一系列的partition组成的
2、RDD提供的每一个函数实际上是作用在每一个partition上的
3、RDD是有一系列的依赖关系的,依赖于其他的RDD。提供了容错性,提现RDD的弹性。
4、可选项:分区器是作用在KV格式的RDD上的
5、可选项:RDD会提供一系列的最佳的计算位置(计算找数据)

操作RDD

Transformation类算子
transformation操作会针对已有的RDD创建一个新的RDD。transformation具有lazy特性,即transformation不会触发spark程序的执行,它们只是记录了对RDD所做的操作,不会自发的执行。只有执行了一个action,之前的所有transformation才会执行。

常用Transformation:
map :将RDD中的每个元素传人自定义函数,获取一个新的元素,然后用新的元素组成新的RDD。
filter:对RDD中每个元素进行判断,如果返回true则保留,返回false则剔除。
flatMap:与map类似,但是对每个元素都可以返回一个或多个元素。
groupByKey:根据key进行分组,每个key对应一个Iterable。
reduceByKey:对每个key对应的value进行reduce操作。
sortByKey:对每个key对应的value进行排序操作。
join:对两个包含<key,value>对的RDD进行join操作,每个keyjoin上的pair,都会传入自定义函数进行处理。(leftouterJoin、rightouterjoin、fullouterjoin)

Action类算子
action操作主要对RDD进行最后的操作,比如遍历,reduce,保存到文件等,并可以返回结果给Driver程序。action操作执行,会触发一个spark job的运行,从而触发这个action之前所有的transformation的执行,这是action的特性。

常用Action:
reduce:将RDD中的所有元素进行聚合操作。第一个和第二个元素聚合,值与第三个元素聚合,值与第四个元素聚合,以此类推。
collect:将RDD中所有元素获取到本地客户端。
count:获取RDD元素总数。
take(n):获取RDD中前n个元素。
saveAsTextFile:将RDD元素保存到文件中。
countByKey:对每个key对应的值进行count计数。
foreach:遍历RDD中的每个元素。

控制类算子(RDD持久化)
Spark提供的多种持久化级别,主要是为了在CPU和内存消耗之间进行取舍。
cache、persist

RDD持久化级别
RDD持久化级别

RDD算子注意点
1、控制类算子后不能立即紧跟action类算子
2、缓存单元是Partition
3、懒执行,需要action类算子触发执行

Spark任务执行流程

在这里插入图片描述
1、task都是分发到了数据所在的节点上去运行,计算找数据
2、每一个任务的执行结果拉回到了Driver进程中

Driver的作用:
1、分发任务
2、监控任务
3、失败重试
4、可能会拉取结果
5、负责向master申请资源

搭建及测试集群

搭建Spark集群
1.上传spark-1.6.3-bin-hadoop2.6.tgz并解压
2.进入conf目录,将slave.template改名成slave,然后修改里面的内容:

node02
node03
node04

3.将spark-env.sh.template 改名成 spark-env.sh,然后修改里面的内容:

SPARK MASTER IP=node01
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=3
SPARK WORKER MEMORY=2G
SPARK_WORKER_INSTANCES=1
SPARK_WORKER_DIR=/..…

4.将配置好的安装包同步到其它节点上去
5.配置环境变量

export SPARK_HOME=/home/spark-1.6.3/
export PATH=$PATH:$SPARK_HOME/bin

注意要修改sbin/start-all.sh的文件名防止冲突
6.启动集群

./sbin/start-all.sh

7.访问http://node01:8080 进入Spark监控页面
8.提交Application到集群中运行

spark-submit --master spark://node01:7077 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.3-hadoop2.6.0.jar 10

提交Application的方式

  • client
    spark-submit -deploy-mode client -class jarPath args
    适应场景:测试
    特点:Driver进程在客户端节点启动
  • cluster
    spark-submit -deploy-mode cluster
    特点:每次提交Application,都会随机选择一条节点来启动Drive进程
    适应场景:生产环境
    大概运行流程:
    1、客户端启动spark-submit进程
    2、为Driver向master申请资源
    3、master会随机找一台Worke节点来启动Driver进程
    4、Driver会向master为当前的Application申请资源
    5、master接受到请求后,会在资源充足的Worker节点上启动Executor进程
    6、Driver分发task到Executor中执行

Spark任务调度

专业术语解释

Application: 基于Spark的用户程序
Job: 包含很多任务(Task)的并行计算,可以看做和action对应
Task: 被送到某个executor上的工作单元
Stage: ⼀个Job会被拆分很多组任务,每组任务被称为Stage(就像Mapreduce分map task和reduce task一样)

Master: 资源管理的主节点(进程)
Worker: 资源管理的从节点(进程) 或者说管理本机资源的进程
Executor: 在一个worker进程所管理的节点上为某Application执行任务的进程
ThreadPool: 线程池,存在于Executor进程中

窄依赖和宽依赖

窄依赖:父RDD与子RDD,partition之间的关系是一对一,那么父子RDD的依赖关系就称之为窄依赖。这种依赖关系不会有shuffle。

宽依赖:父RDD与子RDD,partition之间的关系是一对多,这种依赖关系就是宽依赖,一般来说,宽依赖都会导致shuffle

Stage切割规则
DAG有向无环图
DAG有向无环图
根据宽窄依赖将一个个job划分成stage,stage与stage之间是宽依赖,stage内部是窄依赖。

Stage的计算模式
一个stage(RDD之间都是窄依赖)内进行pipeline操作。

MapReduce的计算模式:1+1=2 2+1=3
Spark的计算模式是1+1+1=3

Spark任务调度
Spark任务调度

1、根据RDD的宽窄依赖关系,将DAG有向无环图切割成一个个的stage,将切割出来的stage封装另外一个对象TaskSet,然后将一个个taskSet给TaskScheduler。
2、TaskScheduler拿到taskSet以后,会遍历这个集合,拿到每一个task,然后去调用HDFS上某一个方法,获取数据的位置,依据数据的位置来分发task 到Worker节点的Executor进程中的线程池中执行。
3、TaskScheduler会实时跟踪每一个task的执行情况,若执行失败或为挣扎任务,会重试提交task。
4、如果重试了3次task依然失败,则向DS汇报,当前stage失败,此时DS会重试提交stage,如果DS重试了4次依然失败,那么stage所在的job就失败了。注意:每一次重试提交的stage,已经成功执行的不再次分发到Executor进程执行,只是重试失败的。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值