火花四溢,热情洋溢。极客朋友么知道,我们翘首以盼的Spark来了。
提及Spark, 这几年如日中天,谈到大数据如果不提及Spark, Hadoop,就好比这年代带耳机不是2B的,你都不好意思带。Spark最初由加州大学伯克利分校(太屌的大学,出了多少名人,名作啊)的AMPLab Matei为主的小团队使用Scala开发,其核心代码只有63个Scala文件(早期版本,这里提及一下Scala语言又是一个创时代的大作,有人说它太锋利,有人说它太妖魔)。
Spark作者Matei:
Spark于2010年才成为Apache开源项目之一。经过短短几年的发展,尤其是在2014年很多知名重量级公司如IBM, Cloudera等大力支持,到如今已经是登峰造极,在大数据并行计算,MapReduce领域,完全无人能及其只右,甚至已然代替了Hadoop的MapReduce模块,以及到后来Hadoop也只好把Spark作为其生态重要的一部分作为介绍。
老样子,看看Spark官方如何介绍吧:
Spark官网是作者比较喜欢的风格,虽说没有后来Docker那么cool,但简单,清新,美观,有图有真相,显然看起来是一个产品,不像Hadoop的官网,这个...
Spark是一个高速,通用大数据计算处理引擎。简单明了,低调中包涵了野心。
官网继续介绍亮点:
1. 速度快,Spark直接上数据,超过Hadoop内存MapReduce速度100+以上,又或者磁盘MapReduce速度10+以上。why?Spark拥有高级DAG(有向无环图)引擎支持数据循环利用,多步数据管道以及in-memory computing。
其实Spark用到了减少IO以及其精华RDD。其实我们在上一篇介绍Hadoop的时候提到了虽然MR
v2解决了MR v1的一些问题,但是由于其对HDFS的频繁操作(包涵了计算临时结果持久化,数据备份以及shuffle等)导致了磁盘I/O成为系统瓶颈,因而只适用于离线数据处理,无法支持大规模实时数据处理能力,从而也为其埋下了重大隐患,被Spark乘胜追击。
2.易用性,支持Java,
Scala, Python, R. 简单,高效。还记得我们介绍
hadoop的时候提到案例word count,spark只用下面2行甚至可以简化到1行代码就实现hadoop几十,上百行的功能,不得感慨其之强大,这里提一下之所以着么简单是得益于函数式编程以及RDD.
3.功能强大,涵盖数据各个领域: SQL, Streaming, Analytics, Machine
Learning, Graph X, 野心勃勃,一统大数据江山。
4.兼容各大生态圈,可以运行在Hadoop,
Mesos单机或者云端。同时支持访问多种多样的数据源:HDFS, Cassandra, HBase, S3.
可以看出,Spark的团队除了包涵技术大拿,还有顶级的宣传广告达人,看完了这些介绍,你想不用Spark都难。换句话说,Spark提供了一站式大数据解决方案:
Spark目前官方稳定版本为1.6于2016年3月9日发布,当然激动人心的大版本2.x正在紧锣密鼓中,我们下面也会提到其新特性。
下面开始介绍一些核心模块。
架构图如下:
如果我们在缩放一下的化看spark的设计架构:
RDD(Resilient
Distributed Dataset):
我们首先介绍其最核心的RDD(Resilient Distributed Dataset), 中文翻译叫弹性分布式数据集,Spark将数据存储在不同分区上的RDD之中。RDD最初思想源于Matei Zaharia自己发表的研究论文。
官方抽象介绍,RDD是一个支持容错,可以用于并行计算的数据集。够抽象!
其核心是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集,并且已经被Partition。不同的数据集格式对应不同的RDD实现。RDD要支持分布式必然要可序列化,并默认缓存到内存中(如果内存不足,也可以存储于磁盘)。每次RDD数据集的操作后的结果,都存放到内存中,并且可以作为下一个操作的源。这样省去了MR的大量磁盘读写,效率提升至秘籍。说起来容易,这可是Spark最核心之一啊。
另外,其主要特点包括,RDD可以重新安排计算并优化数据处理过程;具有重建RDD和重新计算的容错性;RDD是不可变的,我们可以修改RDD,但修改后的Transformation是一个新的RDD, 原有的
RDD保持不变。这么设计显然是为了支持高并发。
值得一提的是,RDD的存储级别还包涵,useDisk, useMemory, deserialized, replication, useOfHeap等等12种,其中OFF_HEAP被保存在Tachyon(一个基于内存的分布式文件系统,潜力巨大)。
Spark提供两种主要方法创建一个RDD: Parallelizing an existing collection OR External Dataset, i.e. HDFS, HBase etc.
1> Parallelizing an existing collection.
2> External Dataset, i.e. from HDFS File (这个路径必须可以被所有工作节点访问)
以上两种方法看起来都很简单直接。一旦你有了RDD, 接下来空间无限, 如:
distFile.map( s => s.length ).reduce( (a,b) => a + b)
RDD支持两种类型操作,Transformation与Action:
Transformation从现有数据集中创建返回一个全新的RDD,如map, filter, flatMap, groupByKey etc.;RDD1 => RDD2, 实际操作是lazy模式。
Action是基于当前数据集计算后返回的一个值,如reduce, collect, count, first, countByKey,save etc. Action主要用来启动Spark计算。
如简单sample:
上边第二句map是一个transformation;第三句reduce是一个action。注意,因为是lazy模式,所有的第二,第三句都是action后启动。Spark在action启动后, 内核会绘制一张关于计算路径的有向无环图DAG, 之后把计算分解成stage运行于独立机器,并提交每一个机器会运行M/R,并返回结果。
有向无环图DAG:
有了计算的DAG, Spark内核下一步就是根据DAG图在划分stage时充分考虑分布式计算中的流水线pipeline部分来提高效率,这个过程中RDD引入了Lineage在数据集转换过程中纪录了操作数据集的关系,每个操作只关心其父操作,出现错误时恢复单个部分,保证了其卓越的性能,其他大多数系统采用类似LOG或备份机制。根据不同transformation操作,RDD在Lineage依赖分为窄依赖Narrow
Dependencies和宽依赖Wide Dependencies。窄依赖指生成的RDD的每一个partition都依赖父RDD(s)的固定的partition,如map,filter,union等;对应的宽依赖则生成RDD的每一个partition都依赖于父RDD(s)的所有partition,如groupby,sort等,其往往对应shuffle。所以,对于窄依赖,Spark会尽量把其划分在同一个stage中,以为他们可以进行并行,流水线计算。
上图:
整体内核计算DAG与Stage划分如下:
上面我们花了很大的篇幅介绍RDD,这个是Spark的核心之核心,这个不理解的话后续会吃力。
时间篇幅问题,下面简要介绍Spark大数据一站式服务的其他功能。
Spark Streaming
Spark Streaming提供了高吞吐,高容错的实时流处理机制。这里数据来源可以是多种多样,如Kafka, Flume, Twitter, ZeroMQ, Kinesis, TCP. Spark会将流式计算分解成一系例短小的批处理作业Discretized Stream, 每一段数据都转换成
RDD,然后将DStream的transformation操作转变为针对RDD的transformation。
具体处理流程:
Spark SQL
显然,Spark SQL使得运行SQL和HiveQL查询非常简单,并提供了定位相应表与原数据。查询时候既可以使用SQL, 也同时支持DataFrame API(RDD)。
SQL使用起来很直接:
DataFrame是一种以RDD为基础,类似与传统数据table的抽象,含带了schema元信息。可以从sqlContext(已存在RDD, Hive table,或者上图数据源)。
DataFrame其实从另一个层面是面向对象的数据访问查询, 并提供DSL.
不知大家有没有看出,Spark SQL为所有的数据源Hive, Avro, Parquet, ORC,
JSON, JDBC提供了统一的访问接口模型,甚至跨数据源访问,这个非常棒。
Machine Learning
机器学习,属于高大上AI范畴了。主要理念是算法通过经验自动改进算法的研究,如著名的AlphaGo. Spark MLib是Spark对常用的机器学习算法的实现库,包括了相关的测试和数据生成器。四种常见机器学习问(shu)题(xue):二元分类,回归,聚类以及协同过滤。抱歉,太深了,虽然学数学出身,但你懂的。
总体来说, MLib支持在大数据中进行机器学习,如数据源HDFS, HBase;
并且Spark MLib提供的高质量算法,性能100+倍于Hadoop MapReduce. 就不能给老大哥点面子啊?当然,这在此说明了基础架构的重要性,完全得益于核心之核心RDD.
Spark Graph X
Spark Graph X是一个分布式图处理框架,提供了对图计算和图挖掘的各种接口。有什么用?举例来说,我们常用的社交网络微信,微博等,都需要图计算处理很多人与人之间的关系链,又如著名的PageRank; 类似Pregel(Google的三架马车之一)在Spark(Scala)上的实现优化。
Spark 2.0
最后,令人期待的Spark 2.0版本也即将发布。主要核心功能如下:
好了,我们先介绍到这里了。Spark博大精深,我们抛砖引玉,大家共同分享吧。
最后,看到Spark SUMMIT 2016会在6月初在旧金山举办,声势浩大,关键演讲人除了Spark创始人兼CTO, 还包括了Google, Microsoft, 还有我们百度的科学家,Andrew Ng可是业界的顶尖大牛啊!
wechat:erixhao