Spark 初识


这篇分享从介绍Spark开始,算是入门前的入门,不涉及原理,不涉及技术,但是却很重要,重要的是理解Spark是什么?用来做什么?为什么要选择Spark?这将对以后工程师们在选择和使用Spark的时候,更加能知道,应该怎样的去用Spark,在什么样的场景下去使用什么样的Spark组件,来发挥它的价值。

What - Spark


Spark是一个通用数据处理引擎。适用于各种环境 ,这里介绍一下,主要应用于两种最常见的场景


离线场景:可以是时间为维度,几年的数据集,或者是业务为维度,某个领域的大数据集,这种数据可以我们一般叫做离线数据,或者冷数据。


实时场景:网站埋点,实时从前端页面传输过来的数据,或者业务系统,物理硬件实时传输过来的数据,硬件信号或者图像数据,我们需要实时的去计算处理并且返回结果。


应用程序开发人员和数据科学家将Spark纳入其应用程序,以便快速查询,分析和转换数据。所以与Spark关联最频繁的任务包括跨大型数据集的交互式查询,处理来自传感器或金融系统的流数据以及机器学习任务。


Spark于2009年开始在加利福尼亚大学伯克利分校的AMPLab项目中生活。更具体地说,它是由于需要证明Meso的概念而诞生的,这也是在AMPLab中创建的。

(科普:Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核。)


从一开始,Spark就被优化成在内存中运行。它比Hadoop的MapReduce等替代方法更快速地处理数据,这往往会在每个处理阶段之间向计算机硬盘驱动器写入数据。Spark的支持者声称,Spark在内存中的运行速度比Hadoop MapReduce快100倍,而且在处理基于Hadoop MapReduce本身的磁盘数据时速度也快了10倍。这种比较并不完全公平,这不仅仅是因为对于Spark的典型用例,原始速度往往比批处理更重要,在这种情况下类似MapReduce的解决方案仍然非常出色。基于Hadoop基于YARN的体系结构为Spark和其他应用程序共享通用集群和数据集提供了基础,同时确保一致的服务和响应级别。


下图是构成Spark的生态系统,强大的生态系统:



其中 Spark Core是Spark的核心API,并且支持Scala,Python,Java编程语言,R,SQL分析语言,在以Spark Core为基础之上,有着Spark SQL,Spark Streaming,Spark Mlib,Spark Graphx四个亲儿子。这四个组件,我将在之后的文章详细的介绍,并且会从应用和代码示例来讲解。

Spark do What


Spark能够一次处理数PB的数据,分布在数千个协作的物理或虚拟服务器集群中。

(科普:什么是分布式计算?所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。分布式网络存储技术是将数据分散的存储于多台独立的机器设备上。分布式网络存储系统采用 可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性、可用性和扩展性。)


它有一套广泛的开发者库和API,并且支持Java,Python,R和Scala等语言; (现在在写spark应用程序时,最长使用的是Scala语言,因为spark的源码就是用scala来编写的,再其次就是python语言,python的第三方库很多,节省了程序员很多的时间要去自己实现某些功能,这两个语言的语法都很简洁,上手简单,支持函数式编程)
它的灵活性使其非常适合于各种用例。


Spark通常与Hadoop的数据存储模块HDFS一起使用,但它也可以与HBase,Cassandra,MapR-DB,MongoDB和Amazon S3 等其他流行的数据存储子系统集成,并且可以和Kafka,Flume等数据传输队列和数据采集工具一起搭配使用。

Who Use Spark


Spark是为数据科学设计的,其抽象使数据科学变得更加简单。数据科学家通常使用机器学习 - 一套可以从数据中学习的技术和算法。这些算法通常是迭代的,Spark将数据集缓存在内存中的能力大大加快了迭代数据处理速度,使得Spark成为实现这种算法的理想处理引擎。


Spark是为大数据工程师设计的,在强大的计算能力和优秀的架构设计面前,可以让数据工程师在不管是离线情景下还是实时的业务需求下,都可以放心的选择使用Spark,一次读取,并行化处理,对数据集支持容错,操作灵活性,第三方社区的积极支持,虽然Spark还面对着缺点,但我相信Spark的明天会更好。

Why Use Spark

在技术不断高速更迭的程序圈,一个新工具的出现与流行,必然是因为它满足了很大一部分人长期未被满足的需求,或是解决了一个长期让很多人难受的痛点。这里就不能不提MapReduce了,既然已经有了看似很成熟的 Hadoop 和 MapReduce,为什么我们还需要 Spark?

MapReduce 被硅谷一线公司淘汰的两大主要原因:高昂的维护成本、时间性能“达不到”用户的期待。除此之外,MapReduce 模型的抽象层次低,大量的底层逻辑都需要开发者手工完成。只提供 Map 和 Reduce 两个操作。在 Hadoop 中,每一个 Job 的计算结果都会存储在 HDFS 文件存储系统中,所以每一步计算都要进行硬盘的读取和写入,大大增加了系统的延迟。由于这一原因,MapReduce 对于迭代算法的处理性能很差,而且很耗资源。因为迭代的每一步都要对 HDFS 进行读写,所以每一步都需要差不多的等待时间。第四,只支持批数据处理,欠缺对流数据处理的支持。因此,在 Hadoop 推出后,有很多人想办法对 Hadoop 进行优化,其中发展到现在最成熟的就是 Spark。

选择Spark有很多原因,但三个关键:


简单性:Spark的功能可以通过一组丰富的API来访问,所有这些都是专门为大规模数据快速轻松地交互而设计的。这些API都有详细的文档和结构,使数据科学家和应用程序开发人员能够快速地将Spark工作。


速度:Spark是为速度而设计的,可以在内存和磁盘上运行。来自Databricks的团队使用Spark在2014年Daytona Grey Sort 100TB Benchmark挑战赛中与加利福尼亚大学圣地亚哥分校的一队队员并列第一名。挑战包括处理静态数据集; Databricks团队能够在23分钟内处理存储在固态硬盘上的100TB的数据,而之前的获胜者通过使用Hadoop和不同的集群配置需要72分钟的时间。在支持存储在内存中的数据的交互式查询时,Spark可以执行得更好。在这种情况下,有人声称Spark可以比Hadoop的MapReduce快100倍。


关于速度来好好讲解一下,Spark以速度为出名,所以要把Spark为什么这么快来聊一聊


由于 Spark 可以把迭代过程中每一步的计算结果都缓存在内存中,所以非常适用于各类迭代算法。Spark 第一次启动时需要把数据载入到内存,之后的迭代可以直接在内存里利用中间结果做不落地的运算。所以,后期的迭代速度快到可以忽略不计。在当今机器学习和人工智能大热的环境下,Spark 无疑是更好的数据处理引擎。下图是在 Spark 和 Hadoop 上运行逻辑回归算法的运行时间对比。
54e4df946206a4a2168a25af8814843d.png


在任务(task)级别上,Spark 的并行机制是多线程模型,而 MapReduce 是多进程模型。多进程模型便于细粒度控制每个任务占用的资源,但会消耗较多的启动时间。而 Spark 同一节点上的任务以多线程的方式运行在一个 JVM 进程中,可以带来更快的启动速度、更高的 CPU 利用率,以及更好的内存共享。从前文中你可以看出,Spark 作为新的分布式数据处理引擎,对 MapReduce 进行了很多改进,使得性能大大提升,并且更加适用于新时代的数据处理场景。


支持:Spark支持一系列编程语言,包括Java,Python,R和Scala。尽管通常与HDFS密切相关,但Spark还包括对Hadoop生态系统及其以后的许多领先存储解决方案的紧密集成的本地支持。此外,Apache Spark社区是大型的,活跃的和国际性的。包括Databricks,IBM以及所有主要Hadoop供应商在内的不断增长的商业提供商为Spark解决方案提供全面的支持。

Spark Use Case


随着 Apache Spark的发展势头继续增长,几乎所有一站式大数据平台都早已集成Spark,国外最为著名的CDH,HDP,国内的TDH等,所有行业用于实际应用。正在使用Spark来改善他们的业务,通过检测模式和提供可操作的洞察力来推动组织变革,并开始改变生活的某些方面。下面提供了一些从保险到互联网公司如何使用Spark的例子:

  • 保险行业: 通过使用Spark的机器学习功能来处理和分析所有索赔,优化索赔报销流程。
  • 医疗保健: 使用Spark Core,Streaming和SQL构建病人护理系统。
  • 零售业 : 使用Spark分析销售点数据和优惠券使用情况。
  • 互联网 : 使用Spark的ML功能来识别虚假的配置文件,并增强他们向客户展示的产品匹配。
  • 银行业 : 使用机器学习模型来预测某些金融产品的零售银行客户的资料。
  • 政府 : 分析地理,时间和财政支出。
  • 科学研究 : 通过时间,深度,地理分析地震事件来预测未来的事件。
  • 投资银行 : 分析日内股价以预测未来的价格走势。
  • 地理空间分析: 按时间和地理分析Uber旅行,以预测未来的需求和定价。
  • Twitter情绪分析: 分析大量的推文,以确定特定组织和产品的积极,消极或中立的情绪。
  • 航空公司 : 建立预测航空旅行延误的模型。
  • 设备 : 预测建筑物超过临界温度的可能性。


上面所举的应用实例是想让大家更直接的去理解,Spark到底在实际的生产环境中能带来什么样的作用和发挥什么样的价值,对以后的学习,能更好的指导方向!


最后来纠正一个不正确的观点,貌似很多技术论坛和网站上都有一些标题党在说“Spark是Hadoop的代替者”,“Hadoop被Spark终结”等类似标题的文章,内行的人一看就是脑残一样的标题😄,Spark 并不是一个完全替代 Hadoop 的全新工具。


因为 Hadoop 还包含了很多组件:

  • 数据存储层:分布式文件存储系统 HDFS,分布式数据库存储的 HBase;
  • 数据处理层:进行数据处理的 MapReduce,负责集群和资源管理的 YARN;
  • 数据访问层:Hive、Pig、Mahout……


从狭义上来看,Spark 只是 MapReduce 的替代方案,大部分应用场景中,它还要依赖于 HDFS 和 HBase 来存储数据,依赖于 YARN 来管理集群和资源。当然,Spark 并不是一定要依附于 Hadoop 才能生存,它还可以运行在 Apache Mesos、Kubernetes、standalone 等其他云平台上。