无情 @ 阅读(3394)
spark


由于公司业务发展需要,最近将暂停研究springcloud相关知识,转向spark学习和研究。本文开始一步一步研究和学spark,中间遇到实战经验也会慢慢分享给大家。(重点是实时计算方向

一:什么是spark

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎, 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处,Spark以其先进的设计理念,迅速成为社区的热门项目。

Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集(Scala 提供一个称为 Actor 的并行模型,其中Actor通过它的收件箱来发送和接收非同步信息而不是共享数据,该方式被称为:Shared Nothing 模型


官方网站http://spark.apache.org/
官方文档http://spark.apache.org/docs/latest/index.html
源码地址https://github.com/apache/spark

二:spark特点


1:运行速度快
Spark 拥有 DAG 执行引擎,支持在内存中对数据进行迭代计算。如果数据由磁盘读取,速度是Hadoop的10倍以上,如果内存中读取,速度可以高达 100 多倍。

2:易用性好
Spark 不仅支持 Scala 编写应用程序,而且支持 Java 和 Python 等语言进行编写,特别是 Scala 是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。

3:通用性
Spark 提供了大量的库,包括SQL、DataFrames、MLlib、GraphX、Spark Streaming。 开发者可以在同一个应用程序中无缝组合使用这些库。

4:支持多种资源管理器
Spark 支持 Hadoop YARN,Apache Mesos,及其自带的独立集群管理器


三:spark生态体系介绍


Spark 生态圈也称为 BDAS(伯克利数据分析栈),是伯克利 APMLab 实验室打造的,力图在算法(Algorithms)、机器(Machines)、人(People)之间通过大规模集成来展现大数据应用的一个平台。通过一张图来看下他的生态体系

 

1:Spark Core

 Spark Core实现了Spark基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。还包含了对弹性分布式数据集(RDD)的API定义,RDD表示分布在多个计算机节点上可以并行操作的元素集合,是Spark主要的编程抽象

2:Spark SQL

本质上是通过Hive的HQL解析,把HQL翻译成Spark上的RDD操作,然后通过Hive的metadata获取数据库里的表信息,实际HDFS上的数据和文件,会由Shark获取并放到Spark上运算。Spark SQL支持多种数据源,如:hive、json等。

3:Spark Streaming 

SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kdfka、Flume、Twitter、Zero和TCP 套接字)进行类似Map、Reduce和Join等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。Spark Streaming 提供了用来操作数据流的API,并且和RDD API高度对应,这样大大降低了学习和开发的门槛和成本。

内原理:Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark Core,也就是把Spark Streaming的输入数据按照batch size(如1秒)分成一段一段的数据(Discretized Stream),每一段数据都转换成Spark中的RDD(Resilient Distributed Dataset),然后将Spark Streaming中对DStream的Transformation操作变为针对Spark中对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加或者存储到外部设备。



4:MLlib
MLlib是一个机器学习库,它提供了各种各样的算法,这些算法用来在集群上针对分类、回归、聚类、协同过滤等。其中一些算法也可以应用到流数据上,例如使用普通最小二乘法或者K均值聚类(还有更多)来计算线性回归。Apache Mahout(一个针对Hadoop的机器学习库)已经脱离MapReduce,转而加入Spark MLlib

5:GraphX
GraphX是Spark中用于图和图并行计算的API,可以认为是GraphLab(C++)和Pregel(C++)在Spark(Scala)上的重写及优化,跟其他分布式图计算框架相比,GraphX最大的贡献是,在Spark之上提供一栈式数据解决方案,可以方便且高效地完成图计算的一整套流水作业。GraphX最先是伯克利AMPLAB的一个分布式图计算框架项目,后来整合到Spark中成为一个核心组件。

四:Spark的适用场景


1:复杂的批量处理(Batch Data Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时(这个类似hadoop的 MapReduce计算)
2:数据量不是特别大,但是要求实时统计分析需求 (实时计算)
3:Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小

 

目前和官方推荐的使用模式是这样

五:Spark的运行模式


1: Local 本地模式 常用于本地开发测试,本地还分为local单线程和local-cluster多线程。


2: Standalone 集群模式 典型的Mater/slave模式,不过也能看出Master是有单点故障的;Spark支持 ZooKeeper来实现HA。


3: On yarn 集群模式 运行在yarn资源管理器框架之上,由yarn负责资源管理,Spark负责任务调度和计算


4: On mesos 集群模式 运行在mesos资源管理器框架之上,由mesos负责资源管理,Spark负责任务调度和计算


六:Spark基本原理


Spark运行框架如下图所示,首先有集群资源管理服务(Cluster Manager)和运行作业任务的结点(Worker Node),然后就是每个应用的任务控制结点Driver和每个机器节点上有具体任务的执行进程(Executor)。
首先Driver程序启动多个Worker,Worker从文件系统加载数据并产生RDD(即数据放到RDD中,RDD是一个数据结构),并按照不同分区Cache到内存中。

7:Spark RDD介绍


RDD是Spark的核心内容(2.0版本之前)之一, RDD的中文解释为:弹性分布式数据集,全称Resilient Distributed Datasets,宾语是dataset,即内存中的数据库。RDD只读、可分区,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用。所谓弹性,是指内存不够时可以与磁盘进行交换。这涉及到了RDD的另一特性:内存计算,就是将数据保存到内存中。同时,为解决内存容量限制问题,Spark为我们提供了最大的自由度,所有数据均可由我们来进行cache的设置,包括是否cache和如何cache。

 

8:Spark 任务提交


spark-submit 提交可以指定各种参数

./bin/spark-submit \
--class\
--master\
--deploy-mode\
--conf=\
... # other options
\
[application-arguments]

各个参数解释如下:
--class:一个spark任务的入口方法,一般指main方法。如:org.apache.spark.examples.SparkPi)
-master:集群的master URL。如spark://127.0.0.1:7077
--deploy-mode:部署方式,有cluster何client两种方式,默认为client
--conf:额外的属性
application-jar:指定的jar目录,路径必须在整个集群当中可见
application-argument:main方法的参数


官方更详细的参数说明:http://spark.apache.org/docs/latest/submitting-applications.html