从零开始认识 Spark

前言

Spark的知识点不少,决定分多P来慢慢讲🤣,比较关键的RDD算子其实已经写了大半,奈何内容仍是太多了就不和这篇扯皮的放一块儿了。java

老套路,咱们点开官网来see see先吧
node

把这句话翻译一下
python

spark是在Hadoop基础上的改进,是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用的并行计算框架,Spark 基于 mapReduce 算法实现的分布式计算,它拥有 Hadoop MapReduce 所具备的优势。web

但不一样于MapReduce的是Job中间输出和结果能够保存在内存中,从而再也不须要读写 HDFS,所以Spark能更好地适用于数据挖掘与机器学习等须要迭代的mapReduce的算法。可是它仅仅只是涉及到计算,并无涉及到数据的存储,后期须要使用spark对接外部的数据源,好比 Hadoop 中的 HDFS。算法

1、Spark 基础

1.1 Spark 的四大特性

其实就是官网主页如下的内容sql

1.1.1 速度快

把内容丢到百度翻译中去
shell

先无论什么DAG调度,查询优化···等等诸如此类的专业术语,就看那张柱形图那个百来倍速度咱们就知道它很快就是了,MapReduce 须要 110s 的事情它 0.9s 就完成了apache

1.1.2 Spark 为啥比 MapReduce 快这么多

大概能够分为两个方面vim

1.基于内存:mapreduce任务在计算的时候,每个job的输出结果会落地到磁盘,后续有其余的job须要依赖于前面job的输出结果,这个时候就须要进行大量的磁盘io操做,性能就比较低。而spark任务在计算的时候,job的输出结果能够保存在内存中,后续有其余的job须要依赖于前面job的输出结果,这个时候就直接从内存中获取,避免了磁盘io操做,因此性能就得以提高。服务器

2.进程与线程方面:mapreduce任务以进程的方式运行在yarn集群中,好比程序中有100个MapTask,一个task就须要一个进程,这些task要运行就须要开启100个进程。

spark任务以线程的方式运行在进程中,好比程序中有100个MapTask,后期一个task就对应一个线程,这里就不在是进程,这些task须要运行,这里若是极端一点:只须要开启1个进程,在这个进程中启动100个线程就能够了。进程中能够启动不少个线程,而开启一个进程与开启一个线程须要的时间和调度代价是不同。开启一个进程须要的时间远远大于开启一个线程。

1.1.3 易用性


这个就没有啥好展开的了,就是能够经过 java/scala/python/R/SQL 等不一样语言快速去编写 spark 程序

1.1.4 通用性


其实能够理解为 Spark 已经造成了本身的一个生态,其内部包含了许多模块

SparkSQL:经过sql去作离线分析
SparkStreaming:解决实时计算用的
Mlib:机器学习的算法库
Graphx:图计算方面的
复制代码

1.1.5 兼容性


spark程序就是一个计算逻辑程序,这个任务要运行就须要计算资源(内存、cpu、磁盘),哪里能够给当前这个任务提供计算资源,就能够把spark程序提交到哪里去运行

1.2 Spark 的架构

1.2.1 Driver

它会执行客户端写好的main方法,它会构建一个名叫 SparkContext 对象。该对象 是全部spark程序的执行入口

1.2.2 Cluster Manager

给 Spark 程序提供外部计算资源的服务,通常来讲有如下3种

  1. standAlone:Spark 自带的集群模式,整个任务的资源分配由 Spark 集群的老大 master 负责
  2. Yarn:能够把 Spark 提交到 Yarn 中运行,此时资源分配由 Yarn 中的老大 ResourceManager 负责
  3. mesos:Apache开源的一个相似于 Yarn 的资源调度平台

正常来讲咱们都会使用 Yarn 去进行管理

1.2.3 Worker Node

Master是整个spark集群的老大,负责任务资源的分配。也就是 Spark 集群中负责干活的小弟,是负责任务计算的节点

1.2.4 Executor

Executor 是一个进程,它会在worker节点启动该进程(计算资源)

1.2.5 Task

spark任务是以task线程的方式运行在worker节点对应的executor进程中

1.3 Spark 的安装部署

一笔带过。简单点来讲就是下好安装包丢到服务器,解压下来去到conf文件夹 vim spark-env.sh,配一下 Java 的环境变量和 zookeeper,而后 vim slaves 去配置 worker 节点。而后修改 Spark 的环境变量而且分发到 worker 中,而后 source /etc/profile 便可。

须要注意的是咱们通常为了 Spark 集群的高可用会有多个master(Hadoop HA的套路),通常来讲会这样配置

#配置zk相关信息
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER  
-Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181  
-Dspark.deploy.zookeeper.dir=/spark"

复制代码

上面其实就是 -D 而后带上3个参数,参数和参数之间用空格隔开便可

spark.deploy.recoveryMode 是高可用方案依赖于zookeeper进行恢复,第二个 spark.deploy.zookeeper.url 指定了zookeeper的地址,第三个 spark.deploy.zookeeper.dir 是指这个zookeeper节点负责接收 Spark 产生的元数据(目录就是一个字符串)

1.4 spark集群的启动和中止

先启动zk再启动spark集群

能够在任意一台服务器来执行(条件:须要任意2台机器之间实现ssh免密登陆)
$SPARK_HOME/sbin/start-all.sh
在哪里启动这个脚本,就在当前该机器启动一个Master进程

整个集群的worker进程的启动由slaves文件控制

后期能够在其余机器单独再启动master
$SPARK_HOME/sbin/start-master.sh
复制代码

若是部署成功,是能够经过

http://master主机名:8080 
复制代码

来访问一个web界面的,各类各样的集群信息都能看获得,大体包括

 整个spark集群的详细信息
 整个spark集群总的资源信息
 整个spark集群已经使用的资源信息
 整个spark集群还剩的资源信息
 整个spark集群正在运行的任务信息
 整个spark集群已经完成的任务信息
复制代码

补充一句,备用的master节点的话,status 的值就会是 standby

上面的信息英文都不难理解,这里就不一一说明了。

1.5 如何恢复到上一次活着master挂掉以前的状态?

在高可用模式下,整个spark集群就有不少个master,其中只有一个master被zk选举成活着的master,其余的多个master都处于standby,同时把整个spark集群的元数据信息经过zk中节点进行保存。

后期若是活着的master挂掉。首先zk会感知到alive的master挂掉,下面开始在多个处于standby中的master进行选举,再次产生一个alive的master,这个alive的master会 读取保存在zk节点中的spark集群元数据信息 ,恢复到上一次master的状态。整个过程在恢复的时候经历过了不少个不一样的阶段,每一个阶段都须要必定时间,最终恢复到上个alive的master的转态,整个恢复过程通常须要1-2分钟。

1.6 在master的恢复阶段对任务的影响?

  1. 对已经运行的任务是没有任何影响。因为该任务正在运行,说明它 已经拿到了计算资源,这个时候就不须要master
  2. 对即将要提交的任务是有影响。因为该任务须要有计算资源,这个时候会找活着的master去申请计算资源,因为没有一个活着的master,该任务是 获取不到计算资源,也就是任务没法运行

1.7 Spark程序的提交

1.7.1 普通模式下

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node1:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.3.3.jar \
10
复制代码

参数说明:

--class:指定包含main方法的主类

--master:指定spark集群master地址

--executor-memory:指定任务在运行的时候须要的每个executor内存大小

--total-executor-cores: 指定任务在运行的时候须要总的cpu核数

1.7.2 高可用模式提交 (集群有多个master)

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node1:7077,node2:7077,node3:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.3.3.jar \
10
复制代码

其实没有太多的变化。spark集群中有不少个master,并不知道哪个master是活着的master,即便你知道哪个master是活着的master,它也有可能下一秒就挂掉,这里就能够把全部master都罗列出来

--master spark://node1:7077,node2:7077,node3:7077
复制代码

后期程序会轮询整个master列表,最终找到活着的master,而后向它申请计算资源,最后运行程序。

1.8 Spark-shell

···

finally

原本也是打算写一个scala的,可是想到这东西也不算难,并且你们也能够经过各种的搜索引擎去学习,因此就丢到草稿里面了(其实就是懒了没写完😂)

这篇其实只是一个概念入门,下一篇咱们开始扯 RDD 。有兴趣的朋友可持续关注哦!公众号:说出你的愿望吧

相关文章
相关标签/搜索