“如果没有大数据分析,公司就像盲人和瞎子一样在互联网上游荡,就像高速公路上游荡的鹿一样”
– Geoffrey Moore
处理和分析大数据集的能力是真正需要花时间的。所有的组织日益增长的数据量是非常巨大的。企业面临着3V数据的挑战,描述如下:
• Variety多样性(数据的类型)
• Velocity速度 (数据产生的速度)
• Volume海量 (需要处理和存储的数据量)
在过去的十年里,行业已经见证过很多数据的处理和分析的案例了。当涉及到数据处理,很难找到一个工具既可以存储数据,也可以处理数据,分析数据,和生成数据处理的报
告,但是仍然找到一系列的技术,来很好的协同工作来实现这些需求。
持久化数据有两种来源。一种是经常改变的数据,另一种是静态数据。后一种经常被各种应用程序读取,然后用来处理和发现数据中有用和有意义的信息。数据分析所做的事情
比上面描述的更多。研究论文 《数据分析技术的比较研究》给了很好的描述:
“数据分析是一个数据的检查,清理,转移和建模的过程,为了达成发现有用信息的目标,提出结论然后支持做出的决定。数据分析包含多个方面和多种方法,包括不同名
称下的多种技术,不同的业务,科学和社会科学领域。”
大数据处理
要执行数据分析,首先而且最重要的是根据所需分析的需要,处理数据和转换数据。换句话说,这里的目标是分析 ,要达到这个目的,方法就是数据处理和数据转换。因此,
这里的焦点就是数据处理和数据转换。这里讨论的工具和技术将围绕着数据处理和数据转换。虽然分析是最终目标,但是关注于数据处理和数据转换方面,也能实现最终目标。
在过去的十年里,市场上出现了很多处理大规模数据的技术。这有许多的共同点。他们是开源的,他们运行在普通硬件上,他们本质上支持集群,而且他们的技术支持的公司
已经做好了大规模使用的准备。
Apache Bigtop是一个Apache基金会项目,用来帮助基础工程师使用工具和框架来初始部署,以及整个组件的升级,包括Hadoop, Spark等等。这里,重点是使一组大数据
组件一起工作来提供解决方案。
Apache Hadoop
Apache Hadoop是用来处理大数据量的这样一个软件套件库,在批处理的时候非常强大。最初来源于Yahoo ,现在开源了,它有通用的功能,比如可靠和分布式的文件系统,名称叫做Hadoop分布式文件系统(HDFS),一个用于资源和作业管理的框架,Hadoop MapReduce,这是一个
对大规模数据集进行并行处理的系统。
但是Hadoop MapReduce的HDFS本身自带包袱,它的数据处理受限于从HDFS系统的读写和循环。有很多应用场景,主要用来执行大量批处理操作的,这种情况下Hadoop MapReduce是一个不错的选择。鉴于Hadoop MapReduce的介绍,它已经成为了一种方法论,而不仅仅是数据处理的方法了。尽管这种方法对数据处理来说并不新鲜,但随着有限的计算资源的大量处理,谷歌等公司不得不提出这样的技术例如Hadoop的MapReduce。它有点类似于分而治之的数据处理方法。相对于很多其他的主流开源的数据处理框架,Hadoop MapReduce是比较早期进入该领域的,现在,谷歌、雅虎等许多公司都在大量使用。
许多书籍和文档的术语使用MapReduce作为Hadoop MapReduce的实现,而不是作为一个概念。换句话说,他们使用的术语MapReduce,意思就是Hadoop MapReduce。Map/Reduce是一个概念,流行起来主要来源于Google的MapReduce:的研究论文:《在大型集群中简化数据处理》。它是一个概念,也是一个编程模型。任何编程语言都可以用来实现它,很多编程语言库函数都可以用来执行类似于Map/Reduce的数据处理。唯一的区别是,有一些经过了大公司的高度可扩展性实验中经过了测试,而Hadoop MapReduce就是其中的一种。
Map/Reduce,作为一个概念,将一个大的过程分为大量小的过程处理,将它们并行分布在分布式集群中处理,最后将结果组装在一起来获取最终结果。它有两个阶段,即Map阶段然后是Reduce阶段。Map阶段执行过滤,处理和排序。Reduce阶段,将处理的结果进行合并。因此,通常如果想进行一个数据处理的作业,需要用他们选择的Map/Reduce的库函数写一些Mapper函数和Reducer函数。
Apache Spark
Apache Spark在数据处理领域来说是一个相对较新的进入者。它是一个进行大规模分布式数据处理的通用软件。Spark 是一个内存数据处理的系统,比Hadoop MapReduce要快很多。Spark与Cassandra, Hadoop, HBase, 以及Mesos,是紧密的集成和使用的。Spark 的大部分是用Scala写的,因此它天然支持Scala程序。
注: 在本章节中,将讨论的数据分析的例子,使用Spark作为工具。但是考虑到Spark强大的大数据处理的能力,把它放在一个章节里对它不公平。因此,例子里不包含Spark代码。在Cassandra的数据描述了列族的细节,在某些情况下,也讨论了使用列族来存储输出的数据。合适的时候,会给出Spark处理存储在Cassandra数据的伪代码。因为实际的代码,或者精确地Spark的细节不在本书的范围内,一个兼容版本的Spark,以及与例子也将不会被提及。
Spark占领了数据处理市场的相当可观的一部分,,主要是因为它有一套工具。以Spark为基础元件,一些工具例如Spark SQL来使用类SQL查询语言来操作数据,Spark Streaming来创建数据流应用,MLlib作为机器学习库,SparkR作为R语言编程者的函数库,或者数据科学家使用R shell来运行Spark任务,GraphX可以用来
做客户操作的图计算。Spark的其他声明如下:
“在内存中的运行速度比Hadoop MapReduce快100倍,在硬盘中的速度比他快10倍。”
对于任何想要做严肃的数据处理的人来说,都是一个令人振奋的消息。
数据转换
数据转换在任何数据处理范式中都是一个基本的需求。当企业开始收到和积累了越来越多的数据,需要有可靠和快速的手段做处理变得更加相关。没有数据将永远处于静止状态。因此,数据交换成为另一种需要。数据交换格式例如XML和JSON,是现在市场上最突出的。
在1990年,XML彻底改变了数据的交换,而可扩展样式表语言转换(XSLT)彻底改变了数据转换。通常情况下数据使用XML格式呈现的,XSLT代码用来做数据转换,以及选择XSLT处理器应用于XML,使用需要的格式来处理结果转换。因此,很多市场上的产品精力聚集于数据转换市场。
当企业开始从XML转移到JSON,一个更为首选的格式的时候,大量支持JSON、JSON4S和JOLT转换的技术进入到市场,在非常强大的函数编程语言例如Scala的帮助下,市场上的一些服务于JSON转换技术占领市场。
当在一个高度分布式环境中处理和分析大量数据时,选择一个强大的数据存储,一个分布式的数据处理模型例如Map/Reduce,和一个与功能强大的程序设计语言相结合数据转换框架,是非常重要的。
Spark, 凭借它的内存数据处理的能力,Cassandra, 和它的线性可扩展以及可存储海量数据的集群NoSQL数据存储,Scala, Java, Python, 和R,用它本身就支持的并行操作和并发,是一个伟大的组合解决方案,可以处理海量的数据。市场上还有很多其他可用的数据处理范例,但是在这里选择Spark作为讨论方案,因为它的Spark编程语言DSL支持多种编程语言,而且对于所有支持的编程语言有着统一的编程模型。
注:Cassandra和Spark有着很好的互操作性,最好的连接器是来自于DataStax的Spark Cassandra Connector。来自DataStax的Spark Cassandra Connector也是开源的。
如本章开头所述,Map/Reduce的使用已经有一段时间了,而且还有很多人使用它。这里,要讨论的第一个设计模式是如何使用Spark来重写已经存在的Map/Reduce程序,或者如何使用Spark来解决Map/Reduce碰到的数据处理的问题。要讨论的第二个设计模式是Spark中的可用的数据转换,