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。算法
其实就是官网主页如下的内容sql
把内容丢到百度翻译中去
shell
先无论什么DAG调度,查询优化···等等诸如此类的专业术语,就看那张柱形图那个百来倍速度咱们就知道它很快就是了,MapReduce 须要 110s 的事情它 0.9s 就完成了apache
大概能够分为两个方面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个线程就能够了。进程中能够启动不少个线程,而开启一个进程与开启一个线程须要的时间和调度代价是不同。开启一个进程须要的时间远远大于开启一个线程。
这个就没有啥好展开的了,就是能够经过 java/scala/python/R/SQL 等不一样语言快速去编写 spark 程序
其实能够理解为 Spark 已经造成了本身的一个生态,其内部包含了许多模块
SparkSQL:经过sql去作离线分析
SparkStreaming:解决实时计算用的
Mlib:机器学习的算法库
Graphx:图计算方面的
复制代码
spark程序就是一个计算逻辑程序,这个任务要运行就须要计算资源(内存、cpu、磁盘),哪里能够给当前这个任务提供计算资源,就能够把spark程序提交到哪里去运行
它会执行客户端写好的main方法,它会构建一个名叫 SparkContext 对象。该对象 是全部spark程序的执行入口
给 Spark 程序提供外部计算资源的服务,通常来讲有如下3种
正常来讲咱们都会使用 Yarn 去进行管理
Master是整个spark集群的老大,负责任务资源的分配。也就是 Spark 集群中负责干活的小弟,是负责任务计算的节点
Executor 是一个进程,它会在worker节点启动该进程(计算资源)
spark任务是以task线程的方式运行在worker节点对应的executor进程中
一笔带过。简单点来讲就是下好安装包丢到服务器,解压下来去到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 产生的元数据(目录就是一个字符串)
先启动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
上面的信息英文都不难理解,这里就不一一说明了。
在高可用模式下,整个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分钟。
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核数
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,而后向它申请计算资源,最后运行程序。
···
原本也是打算写一个scala的,可是想到这东西也不算难,并且你们也能够经过各种的搜索引擎去学习,因此就丢到草稿里面了(其实就是懒了没写完😂)
这篇其实只是一个概念入门,下一篇咱们开始扯 RDD 。有兴趣的朋友可持续关注哦!公众号:说出你的愿望吧