Spark入门——什么是Hadoop,为何是Spark?

  #Spark入门#这个系列课程,是综合于我从2017年3月分到今年7月份为止学习并使用Spark的使用心得感悟,暂定于每周更新,之后可能会上传讲课视频和PPT,目前先在博客园把稿子打好。注意:这只是一个草稿,里面关于知识的误解还请各大网友监督,咱们互相进步。总而言之,网络上的知识学会断舍离,学会带着辩证的眼光去学习就能进步。html

  谈到Spark,实际上从16年本科实习的时候就已经开始接触,那个时候是从Pig入门大数据Hadoop的,有兴趣的朋友能够看Hadoop家族之Pig入门;当时你们基本都在使用Pig,Pig我也没有接触太深,大概两个月后开始跟着当时的师父(当时是实习的硕士,后来就业去了阿里)学了Spark,整个公司就他在写Spark,他是一个我很佩服的人,属于全栈工程师类型的人,先后端数据分析以及数据挖掘的算法都会,因此就跟着使用Python写着Spark的一些入门程序,可见我另一个博客Spark2.0系列RDDVs.DataSetVs.DataFrame,实际上这里关于Dataset的介绍是很是不全面的,接下来我也会在这个Spark入门系列讲的更为详细一点。目前看来,大数据相关的职位那么吃香,不少学计算机的,学数学的,学统计的,半路上培训的,各类各样的人都来投Spark工程师的岗位,由于薪资高的缘由吧,可是真正喜欢这个职业的又有几个,但愿你们能一直坚持下去,见证大数据技术的更新迭代!git

  第一个问题,什么是HadoopTM实际上这个答案Hadoop官网已经给的很明确:github

  Hadoop是Apache软件基金会支持可靠的、可扩展的一个开源的分布式计算框架的工程。(PS:Apache软件基金会真是扛下了开源世界的半壁江山,旗下支持的开源的大数据项目你们有兴趣能够去官网访问一下。)算法

  具体而言,Apache Hadoop软件库是一个容许使用简单编程模型跨计算机集群处理大型数据集合的框架,其设计的初衷是将单个服务器扩展成上千个机器组成的一个集群为大数据提供计算服务,其中每一个机器都提供本地计算和存储服务。shell

  Hadoop工程包括如下模块:数据库

  • Hadoop Common:支持其余Hadoop模块的通用工具。
  • Hadoop Distributed File System(HDFSTM):提供高吞吐量的访问应用数据的一个分布式文件系统。
  • Hadoop YARN:一种做业调度和集群资源管理的框架。
  • Hadoop MapReduce:一种基于Yarn来处理大数据集合的系统。

  Apache中其余Hadoop相关的项目包括:apache

  • AmbariTM:一种用于提供、管理和监督Apache Hadoop集群的基于Web UI的且易于使用的Hadoop管理工具。
  • AvroTM:一种数据序列化系统。
  • CassandraTM:一种无单点故障的可扩展的分布式数据库。
  • ChukwaTM:一种用于管理大型分布式系统的数据收集系统。
  • HBaseTM:一种支持存储大型表的结构化存储的可扩展的分布式数据库。
  • HiveTM:一种提供数据汇总和特定查询的数据仓库。
  • MahoutTM:一种可扩展的机器学习和数据挖掘库(Scala语言实现,可结合Spark后端)。
  • PigTM:一种高级的数据流语言且支持并行计算的执行框架(2017年发布的最新版本0.17.0是添加了Spark上的Pig应用)。
  • SparkTM:一种用于Hadoop数据的快速通用计算引擎。Spark提供一种支持普遍应用的简单而易懂的编程模型,包括ETL( Extract-Transform-Load)、机器学习、流处理以及图计算。
  • TezTM:一种创建在Hadoop YARN上数据流编程框架,它提供了一个强大而灵活的引擎来任意构建DAG(Directed-acyclic-graph)任务去处理用于批处理和交互用例的数据。
  • ZooKeeperTM:一种给分布式应用提供高性能的协同服务系统。

  第二个问题,既然Hadoop生态家族这么庞大,咱们为何要选择Spark做为对于大数据进行数据分析和数据挖掘的基本计算框架?编程

  这个问题的答案实际上Spark官网已经给的很明确了,我就照样搬砖过来。json

  • 速度快

  Apache Spark拥有先进的DAG调度器、查询优化器以及物理执行引擎从而高性能的实现批处理和流数据处理。后端

  • 易用性(可使用Java,Scala,Python,R以及SQL快速的写Spark应用)

  Spark提供80个以上高级算子便于执行并行应用,而且可使用Scala、Python、R以及SQL的shell端交互式运行Spark应用。

#经过Spark的Python的DataFrame的API读取JSON文件
df = spark.read.json("logs.json")
df.where("age > 21").show()
  • 通用性(支持SQL,流数据处理以及复杂分析)

  Spark拥有一系列库,包括SQL和DataFrame,用于机器学习的MLib,支持图计算GraphX以及流计算模块Streaming。你能够在一个应用中同时组合这些库。

  

  • 支持多种模式运行(平台包括Hadoop,Apache Mesos,Kubernete,standalone或者云上,也能够获取各类数据源上的数据)

  Spark能够直接运行以自身的standalone集群模式运行,也能够在亚马逊EC2上运行,不过企业级用的比较多的是Hadoop Yarn模式,固然也有MesosKubernetes模式。能够获取不限于来自于HDFSApache CassandraApache HBaseApache Hive等上百种数据源。

  那么,第三个问题,Hadoop和Spark之间的关系是什么?

  首先要从Hadoop的MapReduce编程框架提及,若是说MapReduce是第一代计算引擎,那么Spark就是第二代计算引擎。

  MapReduce将复杂的并行计算过程高度的抽象到了两个函数:Map函数和Reduce函数。

  

  MapReduce的核心是“分而治之”策略。数据在其MapReduce的生命周期中过程当中须要通过六大保护神的洗礼,分别是:Input、Split、Map、Shuffule、Reduce和Output。

  

  MapReduce框架采用Master/Slave架构,一个Master对应多个Slave,Master运行JobTracker,Slave运行TaskTracker;JobTracker充当一个管理者,负责Client端提交的任务可以由手下的TaskTracker执行完成,而TaskTracker充当普通员工执行的Task分为Map Task(Split and Map)和Reduce Task(Shuffle and Reduce)。

  如今,咱们普通的开发人员只要会用MapReduce的API就能够实现高大上的并行计算了,可是对于非科班毕业的数据分析(例如我这样半路出家的统计学毕业)人员而言,MapReduce存在的局限性不只仅是在于其代码的又长又臭,固定的框架等,总而言之其短板可见如下列表:

  1. 抽象层次低,具体的Map和Reduce实现起来代码量大而且对于数据挖掘算法中复杂的分析须要大量的Job来支持,且Job之间的依赖须要开发者定义,致使开发的难度高而代码的可读性不强;
  2. 中间结果也存放在HDFS文件系统中,致使中间结果不能复用(须要从新从磁盘中读取),不适宜数据挖掘算法中的大量迭代操做,ReduceTask须要等待全部的MapTask执行完毕才能够开始;
  3. 只适合批处理场景,不支持交互式查询和数据的实时处理。

  要知道,咱们一般意义上的Hadoop每每是Hadoop生态圈,意味着不少技术对Hadoop自己具备的局限进行了扩展和改进,从而有了Pig、Hive将SQL语言翻译成MapReduce程序,让咱们从繁琐的MapReduce程序中释放出来。若是说Pig这类的类SQL语言解决了MapReduce中存在的大量手写代码,那么Tez就解决是去除了Map和Reduce两个任务之间的屏障从而提高了总体的性能,从而将多个MapReduce任务在一个Tez任务中处理完。

  随着大数据处理的应用场景愈来愈多,人们对Hadoop的要求也愈来愈高,开发出的对应的系统也愈来愈多,人们迫切的须要一个综合的计算框架,Spark应运而生,咱们能够看看Spark能够干些什么。

  那么为何Spark能作到这些?

  首先,咱们须要理解Spark中的三大概念:

  1. RDD(Resilient Distributed Dataset)。实际上对与开发人员而已它是以一种对象的形式做为数据的一种表现形式而存在,能够理解为一种你能够操做的只读的分布式数据集,之因此称之为有弹性,在于:
    1. RDD能够在内存和磁盘存储间手动或自动切换;
    2. RDD拥有Lineage(血统)信息,及存储着它的父RDD以及父子之间的关系,当数据丢失时,可经过Lineage关系从新计算并恢复结果集,使其具有高容错性;
    3. 当血统链太长时,用户能够创建checkpoint将数据存放到磁盘上持久化存储加快容错速度(建议经过saveAsTextFile等方式存储到文件系统),而persist方式能够将数据存储到内存中用于后续计算的复用;
    4. RDD的数据从新分片能够手动设置。在Spark中执行从新分片操做的方法有repartition和coalesce两个方法,这两个方法都是手动设置RDD的分区数量,repartition只是coalesce接口中参数shuffle=true的实现;是否从新分区对性能影响比较大,若是分区数量大,能够减小每一个分区的占存,减小OOM(内存溢出)的风险,但若是分区数量过多同时产生了过多的碎片,消耗过多的线程去处理数据,从而浪费计算资源。
  2. Transformations。转换发生在当你将现有的RDD转换成其余的RDD的时候。好比当你打开一个文件而后读取文件内容并经过map方法将字符串类型RDD转换成另一个数组类型RDD就是一种转换操做,经常使用的转换操做有map,filer,flatMap,union,distinct,groupByKey等。
  3. Actions。动做发生在你须要系统返回一个结果的时候。好比你须要知道RDD的第一行数据是什么样的内容,好比你想知道RDD一共有多少行这样相似的操做就是一种动做,经常使用的动做操做有reduce,collect,count,first,take(),saveAsTextFile(),foreach()等。

  有意思的是Spark使用“lazy evaluation”,意味着执行Transformations操做的时候实际上系统并无发生任何操做,只有在遇到Actions操做的时候Spark才开始真正从头运行程序执行一系列转换并返回结果。由于有了这种惰性求值方式加上RDD的血缘依赖关系致使程序在一系列连续的运算中造成了DAG,而这种DAG(Directed Acyclic Graph)能够优化整个执行计划(参照上图中的Tez)。

  最后再强调一下,为何要选择Spark?

  • 首先,Spark经过RDD的lineage血统依赖关系提供了一个完备的数据恢复机制;
  • 其次,Spark经过使用DAG优化整个计算过程;
  • 最后,Spark对RDD进行Transformation和Action的一系列算子操做使得并行计算在粗粒度上就能够简单执行,并且Spark生态系统提供了一系列的开发包使得数据科学家能够执行一系列的SQL、ML、Streaming以及Graph操做,并且还支持不少其余的第三方包括一些交互式框架相似于Apache Zeppelin,地理数据可视化框架GeoSpark以及一些比较流行的深度学习框架Sparking-water,Deeplearning4j,SparkNet等。

  咱们都知道Spark最初是由UC伯克利大学的AMP实验室研究出来的,强烈推荐这个实验室的Projects!Happy Coding!

相关文章
相关标签/搜索