首页 > 代码库 > 初探Spark

初探Spark

  众所周知,目前大数据时代数据分析处理最常提到的是两个框架,一是Hadoop,另一个无疑便是Spark,Spark基于map reduce算法实现的分布式计算,虽然拥有着Hadoop的优点,但是关于这个架构网上的解释并不全面,此次王家林老师带我们从技术的角度去探索一下Spark。

 

第二代大数据技术Spark 

  首先先来抛开这两种技术,谈一下大数据。大数据是数据的一种,数据处理到达一定复杂程度,或者数据规模到达一定程度的时候便会称之为大数据。在采访中王家林讲到:“其实关于大数据的处理本身包含两部分,一部分是数据的存储,另外一部分就是数据计算本身。目前而言谈大数据大家最常知道的技术是Hadoop,做得比较资深会再使用Spark。那么这两项技术到底各自有什么样的历史地位或者说各自有什么价值呢?”

  Hadoop准确地说是称为第一代大数据技术,而Spark可以把它称之为第二代大数据技术。Hadoop开启了人们大规模使用大数据的这样一个时代,但由于Hadoop本身架构的一些自己已有的机制,例如说它每次操作都要经过读写磁盘,这极大地限制了它的速度和计算模型。

  而Spark由于具有了Hadoop这样第一代技术的参考和借鉴,以及它自己充满了学术基因。了解Spark的朋友都知道,它是来自于APM实验室的,它一开始就专注于数据的计算,而且是专注于任意规模、任意类型的数据计算,用它自己的口号就是一站式一体化多元化的大数据处理。所以说Spark的时候,主要是聚焦在大数据处理,而这种处理主要有三方面。

  第一个方面是实时流处理,第二个方面就是批处理,第三个方面就是交互式的处理。如果说以前用Hadoop的话,大家都知道实时处理的话,大家选的比较多的会选择Storme。批处理,例如说Hive,或者用比较复杂的Mahout进行这种数据深度挖掘,如果是交互式的话,其实大家现在用的比较多的也是Hive,当然现在一个比较流行的是impala,但如果说我们基于Hadoop就需要部署多套系统,需要多个团队去维护。其实这个不是最重要的,最重要的是它带来的效果是非常慢的,而且投入成本也非常大。

  而若是使用Spark,只需要一个技术队就会解决这所有的问题,解决实时流处理、批处理、交互式,还是QL,或者交互式查询。所以从这个角度来看,Spark天生就是为计算而生的,而大家都知道在这个大数据领域计算肯定是最有价值的。计算可以提供商业支持,可以提供业务支持。

该用Scala开发,还是JAVA?

  在Spark上不同语言的开发存在着很多疑问,如到底该用Scala开发,还是该用JAVA开发?在采访中王家林分享道:“从技术本质的角度来谈,毫无疑问我们要选择Scala,为什么呢?第一点,Spark本身框架就是用Scala编写的。第二点,既然框架是Scala编写的,可以得出一个直接的结论就是在开发时候的API的支持,Scala语言的支持肯定是最强的,也是最丰富的。第三点,因为我们要进行大数据处理,这些处理往往需要复杂的算法,这就直接数量到一个非常重要的问题,就是语言的表现力的问题,当然这个问题要牵扯到JAVA和Scala这两门语言的不同。”

  Scala是一门非常富有表现力的语言的很重要的原因就是它全面支持函数式编程Scala把面向对象和函数式编程这两种语言完美地整合在一个语言体系中。而JAVA是为了组织大型项目和组织不同的人分工协作完成一个项目而生的,它本身并不擅长数据计算,这也直接导致了它不擅长大数据计算。

  所以说Scala和JAVA确实是两门紧密相关的语言,因为它们两个都基于VM虚拟机,而且Scala可以直接调动JAVA,JAVA也可以直接调动Scala,但是如果进行数据计算的这个角度来看的话,毫无疑问的首选肯定是Scala。Spark之所以很强大的另外一点就是Spark非常好地支持Hadoop,而Hadoop是用JAVA写的,所以它可以直接调动Hadoop的几乎所有功能,包括它的NoSQL,底层的HDFS文件系统,以及自己的一些功能。

Spark的缺点在哪里?

  众所周知Spark确实擅长内存计算,不仅如此,它也擅长基于磁盘的计算,也就是Hadoop所擅长的领域。Spark的官方团队和亚马逊进行了一个业界排序的几种测试,测试不同软件或者框架的性能的。在Spark没有基于内存计算优势的情况下,它只用了Hadoop十分之一的硬件,速度却是Hadoop的三倍。也就是说大家一直对Spark都有一个误解,就是认为Spark所有数据的计算都必须在内存中,但事实上不是这样的,Spark可以在任意规模数据大小,这种任意规模数据大小当然包括当数据远远大于内存容量的时候,这个测试显然是证明了Spark在这种情况下不适用自己内存计算迭代优势的情况下,也是目前的最佳选择。那么我们来看一下Spark的缺点在哪?相信是很多用户所关心的地方。

  在采访中得知:“Spark的第一个弱点是不擅长细粒度的异步更新的计算模式,就是比较细的粒度的异步更新。第二点,其实很多人认为Spark耗内存这是一个缺点,实际上我们从整个计算模型的角度去考虑,整个计算模型使用的要么是CPU,要么是内存,要么是网络IO或者磁盘IO,计算本身很多时候一般都主要发生在内存中。所以如果说计算能够耗内存这是一件好事情,因为把数据放在内存中,它是计算的主战场,它可以更好地发挥CPU或者说磁盘或者说网络提供的一种机制。另一方面,现在随着硬件不断地推进,其实耗内存这件事情不是一个问题,就相当于以前说某某软件很大,或者某某数据库比较耗磁盘一样,磁盘它不是问题,相信在未来两三年的时间内,随着大数据的演进以及一些厂商的支持,内存也不是问题。”

Spark在实际生产环境下的应用

  正如上面所说的优点,Spark能处理任意数据规模大小的数据等,那么在实际生产环境下的应用又是如何呢?这也是所有要使用大数据的人们共同关注的一个问题。在采访中得知:“Spark会是一个大数据通用的计算平台,Spark能做什么,其实也基本上标志着大数据能做什么,当然这个可能不是完全地科学。大家最常见的是通过SQL对大规模的数据,例如产生的用户行为数据,如用户访问我们的产品,假设我们是做电子商务的,用户在我们网站上操作行为记录,都可以以日志的方式放进我们的Spark大数据系统,然后通过SQL对这个数据进行多维度的分析。像现在很多电商这个用得非常广泛,这是第一方面。”

  第二方面就是流处理。例如用户点击流进来,是否可以根据这个点击流进一步进行分析?举个简单的例子,假设说在进行一笔银行交易,肯定会有用户的操作终端,例如转账之类的业务。需要实时地判断这个转账是否合法,或者说更好地判断这个是否合法,用户的操作直接流进Spark集群的内存中,此时可以基于这个内存流进来的数据,跟Spark SQL或者说机器学习,或者图计算进行一种深度的结合,这就会极大地降低操作的风险,例如这个操作是否合法等等。

  第三个方面就是我们所说的深度的图计算,就像现在社交网络Facebook、Twitter、当然也包括新浪微博等等,这是社交网络。还有电子商务,像京东、淘宝等等。它们背后其实都在大规模地使用图计算或者类似图计算,而Spark就提供了这样一种技术。当然这个肯定是一项至关重要的技术,也是大数据中技术的一个可信点。

  最后一点就是机器学习,这是一个永恒的主题。比较好的消息就是Spark从1.0开始持续在机器学习库方面投入了巨大的精力。第二个便是Spark官方团队在结合业界机器学习的一些比较知名的专家或者教授学者,把已有的机器学习的一些算法都融入Spark平台中,在Spark平台中就可以直接使用这些机器学习算法。现在协同过滤算法、聚类、线性迭代等等这些大家都可以去使用的,就是它现在已经相对比较成熟了,但是它又在高速发展。

  最后必须额外提出来一点Spark不可取代的优势的极为重要的核心就是这些功能可以相互协作,例如SQL提取出的数据可以直接交给图计算或者机器学习,实时流流进来的数据可以边流进去数据边进行机器学习的算法的模型训练,这是任何其他平台都不具有的优势。如果说你使用其他平台要完成这个功能的话,你就需要部署多套技术框架。这个也是Scala必成大器的一个非常重要的核心点。

Spark在国内仍属起步阶段

  目前在国内现在已经有很多企业在使用Spark了,比较知名的大家就知道淘宝、腾讯、百度、京东、华为、优酷、土豆、大众点评等等这些公司都在用,大家从网络上应该可以搜寻到很多信息。当然还有其他一些公司处在技术选型的试验阶段,就是以前的一些技术现在在新的Spark平台上在逐步地过渡的阶段。

  在国内总体情况来看,Spark现在基本还是处于起步阶段,很多人都是处于学习摸索阶段,首先会考虑这个技术的独特价值是什么,第二点就是怎么去学习,第三点就是在生产环境中怎么去使用。

初探Spark