----本节内容-------
1.Spark背景介绍
2.Spark是什么
3.Spark有什么
4.Spark部署
4.1.Spark部署的2方面
4.2.Spark编译
4.3.Spark Standalone部署
4.4.Standalone HA配置
4.5.伪分布式部署
5.Spark任务提交
5.1.Spark-shell
5.2.Spark-submit
6、参考资料
---------------------
1.Spark背景介绍
Spark是AMLab实验室贡献出的代码,是Apache的*项目之一。AMLab实验室,提交了很多项目,追求人、机器、数据的完美整合,Spark是Amlab2009年提交的代码,后来AMLab的开发人员成立了专门的公司Databricks,主要是推广spark,目标是建立一个计算云,建立一个大数据处理的统一平台。目前,已经有非常多的互联网公司加入,如硬件IBM、Intel,数据库公司ORACLE,SAP公司等。
2.Spark是什么
Spark是什么,可以通过官网查询:
Spark官网地址:http://Spark.apache.org
Spark gitHub地址: http://Spark.databricks.com
Spark是 快速大数据处理通用引擎,具有有如下特征:
1) Speed非常快
Spark是Mapreduce处理速度的100倍以上,原因是spark基于内存的计算,Mapreduce的每次计算将中间结果写到硬盘,然后又从硬盘读取数据,磁盘IO非常很。
当然Spark处理速度快,也不仅仅是基于内存的原因,还有其他很多方面,比如运算步骤统筹性的优化,而不是MR的一步一步的来执行,先形成一个DAG图,对整个运算过程进行优化,RDD Linger血缘图的快速恢复等,后面进一步总结。
2)非常容易使用
主要表现在代码简洁和丰富的API上面,看wordCount代码,Mapreduce有80多行的代码,而spark只有几10行,Spark只有一句代码就可以行实现wordCount操作,节省了大量的开发时间,阅读和维护的工作量也减少很多。
3)通用性
可以和spark sql,spark streaming进行无缝的集成,是一个通用平台和开发库,实现通用型的根本就是RDD.通过RDD的转化和action可以进行各种计算,可以进行流计算,图计算,机器学习等,RDD技术的出现,使得Spark成为统一处理平台成为可能。
spark是一个开发库SDK,提供各种应用场景支持以及完整解决方案,可以跑多个集群上的开发库,简单且容易开发的开发库。开发者可以开发各种大数据应用程序,可以使用python,scala,java,r等调用spark各种API,构建一个完整的大数据应用处理程序。
Spark 可以处理hdfs,s3等数据源,也可以通过jdbc处理hive数据,还可以处理cassandara等nosql程序,可以运行在亚马逊、hadoop等平台
Spark执行的是Spark应用程序,Spark应用程序包含2个部分 spark driver和sparkexecutor2部分
Spark总结起来,有如下几点:
1)spark是一个开发库,具有丰富的API
2)可提供交互式的开发和部署
3)集成了各个领域的平台流处理、图计算、机器学习等,是一个强大的综合型数据处理平台。
3.Spark有什么
AMLab勃勃雄心,希望建立一个利用大量机器通过大量算法处理大量数据的大数据平台,并贡献出了Spark给Apache,包含很多组件,以spark为核心,整合了Spark Streaming,MLib,Graphx构成的大数据平台。
1)Spark Core-基础平台
Spark程序一般由2部分组成,1.驱动程序,2.Executor,驱动程序比较标准Executor实现各种计算逻辑,Executor主要是针对RDD编程,RDD通过各种算子进行转换,还提供了缓存、广播变量,关键的2个核心算子主要是transformation和acton, Spark编程模型如图所示,
Spark运行架构和流程
实际上都是对RDD进行操作,首先用RDD勾画DAG图,DAG图分解成stage,stage交付给Executor运行,整个过程RDD会不断的进行变换,RDD Linger特性,如果中间有一步发生错误,可以从前一步重新构建,具有非常好的容错性。通过对编程模型和运行架构的了解,明白了Spark为什么更快了,总结起来有一下几点(面试会被问到):
a.Spark基于内存计算,避免了过多的磁盘IO,减少IO开销;
b.提供了支持DAG图的分布式并行框架,DAG图可以减少不同阶段的中间结果IO开销,重复利用中间计算结果,DAG图可以优化中最佳的计算调度策略。
c.提供cache机制,支持多次迭代计算或者数据共享,减少IO开销
d.RDD之间维护血统关系,一旦RDD失败,可以通过父RDD重新构建,保证容错。
e.移动计算,而非移动数据,RDD partition可以就近读取分布式文件系统中的数据块到各个节点内存中进行计算
d.使用多线程池模型来减少task启动开销
f.shuffle过程中避免不必要的sort操作
g.采用容错、高可伸缩性的akka作为通讯框架
2)spark sql
spark sql的前身是spark shark,因shark太依赖hive了,制约了shark的发展,shark是hive的100倍速度,但已经停止开发了,以脱离对第三方工具的依赖,shark查询速度之快,可以从下图看出,蓝色是shark。
目前Spark sql支持Hive和SQL-92标准,还引入Schema RDD,可以直接在内存中构建表,能够将关系型数据库和nosql数据库关联在一起。 spark sql原理:
a.SQL语句解析
b.优化SQL
c.转成RDD运算
总结起来,1.0版本的Spark SQL有如下几点:
·引入了Schema RDD,可以像传统数据库定义表一样来定义Schema RDD,Schema RDD由定义了列数据类型的行对象构成。
·Schema RDD有三种方式转换过来,a.从parquet文件读入,b.从HiveQL从Hive中获取,c.从RDD转换过来
· 在应用程序中可以混合使用不同来源的数据,如可以将来自HiveQL的数据和来自SQL的数据进行join。
· 内嵌的catalyst优化器对用户查询语句自动进行优化
· 后面会支持JDBC
· 对多种数据类型的支持,是spark里面发展最迅猛的组件
3)Spark Sreaming
Spark Streaming 通过分布在各个节点上的接收器,缓存接收到的流数据,并将流数 据 包 装 成 Spark 能 够 处 理 的 RDD 的 格 式, 输 入 到 Spark Streaming, 之 后 由 Spark Streaming 将作业提交到 Spark 集群进行执行
· 将流计算分解成一系列短小的批处理作业
· 将失败或执行较慢的任务在其他节点上并行执行
· 较强的容错能力,基于RDD继承关系Lineage
· 使用和RDD一样的予以
Spark Streaming 具有RDD的所有特性,可以处理Kafka,flumeHDFS,ZeroMQ,等数据源
4)MLib
MLib 是MLBase发展的一个底层库,是机器学习的一个通用平台,使用简单的语句,就可以做机器学习的开发,MLib底层机器学习库,转为spark程序执行。
5)Graphx
有三种核心的DD,对RDD的操作可以对图处理
6)BlinkDB
比较有意思的查询系统,运行速度和精度之间进行权衡的一个查询系统
7)SparkR
使得R能运行在Spark集群上上面,极大的提高了R的运算能力,spark1.3正式发布了
以spark为核心,其他组件为外援的一个处理平台,spark通过RDD将各个组件融合到spark平台
不同组件提供不同功能,可以应付各种数据场景
4.Spark部署
4.1.Spark部署的2方面
1) spark集群的部署
standalone部署:主从式部署,单点故障
HA部署:消除主节点的单点故障,有基于文件系统的HA和基于Zookeeper的HA
standalone为分布式部署:主节点和子节点在一台机器上,方便测试,资源消耗更少
2)Spark 应用程序部署
应用程序 = 驱动程序+Executor;
应用程序提交程序给集群后,由驱动程序向集群注册、申请资源,集群根据自身资源情况 分配资源给spark应用程序,spark应用程序就会在各个资源生开启Executor,开启各种任务进行计算,spark应用程序可以泡在本地,standaloone,yarn,mesos,EC2上
4.2.Spark编译
1)部署包下载,
从官网直接下载,或者从github下载
源码编译有2种方式
·SBT编译
· Maven编译:编译前要对Maven各种参数进行,-DskipTests:编译时不要进行测试,没有测试环境会报错
4.3.Spark Standalone部署
· Java环境配置
· ssh免密码登录配置
· 解压Spark安装
· 修改配置文件:conf/slaves和conf/spark-env.sh
· 分发Spark安装包
· 启动集群,检验
· spark客户端启动
1.修改conf/slaves ,填写spark集群子节点的机器名
2.修改conf/spark-env.sh
export SPARK_MASTER_IP=hadoop1 ###Spark master节点名
export SPARK_MASTER_PORT=7077 ###集群访问端口
export SPARK_WORKER_CORES=1 ###子节点使用的cpu核数
export SPARK_WORKER_INSTANCES=1 ###子节点运行的实例个数
export SPARK_WORKER_MEMORY=2g ###子节点的内存
注意要使用export, 拷贝的时候注意一些特殊字符的生成
3.将配置好的spark环境拷贝到各个节点去
使用scp命令分发
4.启动集群
sbin/start-all.sh
5.客户端访问spark
6.安装spark客户端
从子节点将安装文件拷贝到客户机,客户端访问spark集群,监控界面可以看到,缺省I情况下,会使用所有内存,使用如下启动客户端访问spark集群。
命令: bin/spark-shell --master spark://hadoop1:7077
4.4.Standalone HA配置
有两种HA的方式:基于文件系统的HA和基于zookeeper的HA,用的比较多的是基于zookeeper的HA。
1)基于文件系统的HA
基于文件系统的HA的原理:master在运行过程中将work的运行监控状态信息都写到文件系统的目录中,一旦master挂掉,恢复之后从文件目录中将信息恢复。 修改spark_env.sh,修改2个关键的参数。
spark.deploy.recoveryMode 设置为FILESYSTEM
spark.deploy.recoveryDirectory Spark保存恢复状态的目录
执行步骤如下:
a. 在spark_env.sh中修改SPARK_DAEMON_JAVA_OPTS设置
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=FILESYSTEM -Dspark.deploy.recoveryDirectory=/app/hadoop/spark100/recovery"
b.将修改后的文件分发到子节点
c.启动集群:sbin/start-all.sh
d.启动spark-shell客户端,启动一个spark-shell客户端并做部分操作后,然后用sbin/stop-master.sh杀死Master进程
启动客户端:bin/spark-shell --master spark://hadoop1:7077
执行操作:val a=2; val b=3; val c=a+b;
e.用sbin/stop-master.sh 杀死master,杀死完后在客户端可以看到
命令:sbin/start-master.sh
f.过段时间用sbin/start-master.sh启动master
g.观察客户端和浏览器监控,发现spark-shell可以使用杀死master进程之前的变量c。
2).基于Zookeeper的 HA部署
要修改三个参数分别是
spark.deploy.recoveryMode 设置为ZOOKEEPER
spark.deploy.zookeeper.url zookeeper的url
spark.deploy.zookeeper.dir zookeeper保存恢复状态的木乱转,缺省为/spark
执行步骤如下:
a. 在spark_env.sh中修改SPARK_DAEMON_JAVA_OPTS设置
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark。deploy.zookeeper.url=hadoop01:2181,hadoop2:2181,hadoop3:2181 -Dspark.deploy.recoveryDirectory=/spark"
另外注意:conf/spark_env.sh中master参数不用设置,因为集群会通过zk从多个master中选择一个出来
b. 将配置好的spark_env.sh分发到各个子节点
c. 配置了ZK ha的集群启动
· 启动zk集群,在每个zk节点上执行:bin/zkServer.sh start
· 启动spark集群:sbin/start-all.sh
· 启动一个master standby节点:sbin/start-master.sh
· 从界面监控,主master监控界面
standaby监控界面,这里是么有一个work节点在运行的,如果杀死主master就会切换到这里来,一旦主msater死掉,那么其他standby就会通过zk获得集群子节点信息
4.5.伪分布式部署
在一台机器上部署,ssh就是自己对自己的无密码登录
1.对slaves配置
只配置自己机器名就可以了
2.修改spark_env.sh文件
不需要分发了,只有他自己一台机器
3监控
4.启动spark shell
6.Spark任务提交
spark-shell交互工具,spark-submit部署工具,实际上spark shell调用的是spark-sbumit,因此他们都有相同的参数。
6.1 Spark-shell提交任务
针对运行环境的配置,缺省会使用所有的资源,查看spark-shell各种参数的含义
bin/spark-shell --help,bin/sjpark-submit --help
当zk多个master时,写多个master,启动的时候,会对每个master都连接轮询,只有当action提交时,spark才会提交任务,执行任务。
spark-shell启动命令:
bin/spark-shell --master spark://hadoop1:7077,hadoop2:7077 --executor-memory 2g
6.2 spark-submit运行
没做HA 提交任务:
bin/spark-submit --master spark://hadoop1:7077 --class org.apache.spark.examples.SparkPi --executor-memory 2g lib/spark-examples-1.0.0-hadoop2.2.0.jar
做HA 提交任务: bin/spark-submit --master spark://hadoop1:7077,hadoop2:7077 --class org.apache.spark.examples.SparkPi --executor-memory 2g lib/spark-examples-1.0.0-hadoop2.2.0.jar
7.参考资料
1).spark-sql执行原理:http://www.itnose.net/detail/6472074.html
2).Spark Streaming执行过程:http://www.cnblogs.com/zlslch/p/5725374.html
3).Spark基于文件系统的HA:http://blog.csdn.net/kinger0/article/details/46315375
4).基于zookeeper的HA:http://blog.csdn.net/panguoyuan/article/details/
5).DataGru教育spark相关资料