介绍
- 快如闪电的集群计算 快速通用的大规模数据处理技术
- 有DAG(有向无环图)执行引擎
- 速度 比MapReduce在 内存上快一百倍 磁盘上快10倍
- 可以使用多种语言编写 java Scala Python R
- 80多种高级操作用于并行app
版本选择
spark1.6.1
三种部署模式
-
standalone
- 在hdfs上分配空间,spark和MR同时运行,覆盖到所有的job
-
hadoop yarn
-
在yarn上运行,不需要预先安装或者要求root访问
-
有助于spark和hadoop生态系统进行集成
-
-
spark in mapreduce
Spark核心组成
Spark Core(内核)
Spark SQL
新推出的交互式大数据SQL技术,支持结构化与半结构化.把sql语句翻译成Spark上的RDD操作可以支持Hive、Json等类型的数据.
Spark Streaming
通过对kafka数据读取,将Stream数据分成小的时间片段(几秒),以类似batch批处理的方式来处理这一部分小数据,每个时间片生成一个RDD,有高效的容错性,对小批量数据可以兼容批量实时数据处理的逻辑算法,用一些历史数据和实时数据联合进行分析,比如分类算法等,也可以对小批量的stream进行mapreduce、join等操作,而保证其实时性,针对数据流时间要求不到毫秒级的工程性问题都可以.
Spark Streaming也有一个StreamingContext,其核心是DStream,是通过以组时间序列上的连续RDD来组成的,包含一个有Time作为key、RDD作为value的结构体,每一个RDD都包含特定时间间隔的数据流,可以通过persist将其持久化,在接受不断的数据流后,在blockGenerator中维护一个队列,将流数据放到队列中,等处理时间间隔到来后将其中的所有数据合并成为一个RDD(这一间隔中的数据),其作业提交和spark相似,只不过在提交时拿到DStream内部的RDD并产生Job提交,RDD在action触发之后,将job提交给jobManager中的JobQueue,又jobScheduler调度,JobScheduler将job提交到spark的job调度器,然后将job转换成为大量的任务分发给spark集群执行,Job从outputStream中生成的,然后触发反向回溯执行DStreamDAG,在流数据处理的过程中,一般节点失效的处理比离线数据要复杂,Spark streamin在1.3之后可以周期性的将DStream写入HDFS,同时将offset也进行存储,避免写到zk,一旦主节点失效,会通过checkpoint的方式读取之前的数据,当worknode节点失效,如果HDFS或文件作为输入源那Spark会根据依赖关系重新计算数据,如果是基于Kafka、Flume等网络数据源spark会将手机的数据源在集群中的不同节点进行备份,一旦有一个工作节点失效,系统能够根据另一份还存在的数据重新计算,但是如果接受节点失效会丢失一部分数据,同时接受线程会在其他的节点上重新启动并接受数据.
MLlib(machine learning library)
GraphX
主要用于图的计算.核心算法有PageRank、SVD奇异矩阵、TriangleConut等.
Spark R
通过R语言调用spark,目前不会拥有像Scala或者java那样广泛的API,Spark通过RDD类提供SparkAPI,并且允许用户使用R交互式方式在集群中运行任务.同时集成了MLlib机器学习类库.
MLBase
从上到下包括了MLOptimizer(给使用者)、MLI(给算法使用者)、MLlib(给算法开发者)、Spark.也可以直接使用MLlib.MLOptimizer,一个优化机器学习选择更合适的算法和相关参数的模块,还有MLI进行特征抽取和高级ML编程抽象算法实现API平台,MLlib分布式机器学习库,可以不断扩充算法.MLRuntime基于spark计算框架,将Spark的分布式计算应用到机器学习领域.MLBase提供了一个简单的声明方法指定机器学习任务,并且动态地选择最优的学习算法.
Tachyon
高容错的分布式文件系统.宣称其性能是HDFS的3000多倍.有类似java的接口,也实现了HDFS接口,所以Spark和MR程序不需要任何的修改就可以运行.目前支持HDFS、S3等.
核心RDD
弹性分布式数据集 完全弹性的 如果数据丢失一部分还可以重建 有自动容错、位置感知调度和可伸缩性 通过数据检查点和记录数据更新金象容错性检查
通过SparkContext.textFile()加载文件变成RDD 然后通过transformation构建新的RDD 通过action将RDD存储到外部系统
RDD使用延迟加载(懒加载) 只有当用到的时候才加载数据 如果加载存储所有的中间过程会浪费空间 因此要延迟加载 一旦spark看到整个变换链
他可以计算仅需的结果数据 如果下面的函数不需要数据那么数据也不会再加载 转换RDD是惰性的 只有在动作中才可以使用它们
Spark分为driver和executor driver提交作业 executor是application早worknode上的进程 运行task driver对应为sparkcontext
Spark的RDD操作有transformation、action Transformation对RDD进行依赖包装 RDD所对应的依赖都进行DAG的构建并保存
在worknode挂掉之后除了通过备份恢复还可以通过元数据对其保存的依赖再计算一次得到 当作业提交也就是调用runJob时spark会根据RDD构建DAG图 提交给DAGScheduler
这个DAGScheduler是在SparkContext创建时一同初始化的 他会对作业进行调度处理 当依赖图构建好以后 从action开始进行解析每一个操作作为一个task
每遇到shuffle就切割成为一个taskSet 并把数据输出到磁盘 如果不是shuffle数据还在内存中存储 就这样再往前推进 直到没有算子然后运行从前面开始
如果没有action的算子在这里不会执行 直到遇到action为止才开始运行 这就形成了spark的懒加载
taskset提交给TaskSheduler生成TaskSetManager并且提交给Executor运行 运行结束后反馈给DAGScheduler完成一个taskSet 之后再提交下一个
当TaskSet运行失败时就返回DAGScheduler并重新再次创建 一个job里面可能有多个TaskSet 一个application可能包含多个job