在大数据技术成熟之前,受限于数据采集、存储和分析能力,样本数量相对较少。大数据技术的出现使得数据存储和分析能力不再成为瓶颈,研究人员可以对更大规模的数据进行研究。 ,更快地进行数据分析。但数据本身并不有价值。如何将数据变成黄金是非常具有挑战性的。在诚信调查中,如果我们直接询问样本对象:“您是否曾谎报自己和家人的资产以获得较大的金融贷款额度?”十有八九,我们不会得到真正的答案,但我们可以结合多种渠道来分析这个问题,比如结合样本对象的工作经验、信用记录等数据。
可见,大数据具有数据量更大、速度更快、数据类型更多的特点。基于一定的数据真实性,大数据技术最终服务于数据背后的价值。
随着大数据技术的发展,数据的复杂性越来越高。有人在这5V的基础上提出了一些补充,比如增加()来强调整个数据系统的动态性;添加(),强调数据的显式显示;增加合法性(),强调数据收集和应用的合法性,特别是个人隐私数据的合理使用;增加了data (),强调数据永远在线,可以随时调用、计算。
分布式计算分而治之
计算机诞生后,数据一般在单台计算机上处理。大数据时代到来后,一些传统的数据处理方法已经不能满足大数据的处理需求。将一组计算机组织在一起形成集群,利用集群的力量处理大数据的工程实践已逐渐成为主流解决方案。这种利用集群进行计算的方法称为分布式计算。目前,几乎所有的大数据系统都是在集群上进行分布式计算。
分而治之的算法思想
分布式计算的概念听起来很深奥,但其背后的思想却很简单,那就是分而治之(and),也称为分而治之法。分治法将原始问题分解为子问题。多个子问题在多台机器上解决。借助必要的数据交换和合并策略,通过对子结果进行汇总即可得到最终结果。具体来说,不同的分布式计算系统根据要解决的问题采用的算法和策略有所不同,但基本上都是将计算进行拆分,将子问题放在多台机器上,分而治之的计算和解决方案。分布式计算中的每台机器(物理机或虚拟机)也称为节点。
分布式计算在科研界已经有很多成熟的解决方案,其中比较著名的有消息传递接口(MPI)和消息传递接口(MPI)。
MPI
MPI是一个古老的分布式计算框架,主要解决节点之间的数据通信问题。在之前的时代,MPI是分布式计算的行业标准。 MPI 项目仍在世界各地的主要超级计算中心、大学、政府和军事附属研究机构中广泛运行。物理、生物、化学、能源、航空航天等基础学科的许多大规模分布式计算都依赖于MPI。
分治法将问题划分为子问题,并在不同的节点上求解。 MPI为多进程、多节点之间的数据通信提供了解决方案,因为大多数情况下,在中间计算和最终合并的过程中,需要在多个节点上交换和同步数据。
MPI并行计算示意图
MPI 中最重要的两个操作是数据发送(Send)和数据接收(Recv)。 Send表示将本进程中的某条数据发送给其他进程,Recv表示接收来自其他进程的数据。上图是MPI架构在4台服务器上并行计算的示意图。在实际的代码开发过程中,用户需要设计自己的分治算法,将复杂的问题划分为子问题,手动调用MPI库,将数据发送到指定的进程。
MPI可以非常细粒度地控制数据通信,这是它的优点,也是它的缺点,因为细粒度控制意味着从分而治之的算法设计到数据通信到结果聚合的一切都需要程序员手动控制。经验丰富的程序员可以对程序进行低级优化并实现指数级的速度提升。然而,如果你没有太多的计算机和分布式系统经验,那么编码、调试和运行MPI程序的时间成本是极高的。再加上不同节点上的数据不平衡、通信延迟等问题,一个节点进程的失败就会导致整个程序失败。因此,MPI的失败对于大多数程序员来说是一场噩梦。
并非所有程序员都精通 MPI 编程。衡量一个程序的时间成本,我们不仅要考虑程序运行所花费的时间,还要考虑程序员学习、开发、调试所花费的时间。就像C语言速度极快,但语言更流行一样,MPI虽然可以提供极快的分布式计算加速,但并不是很踏实。
为了解决分布式计算学习和使用成本较高的问题,研究人员提出了一种更简单易用的编程模型[^2]。它是2004年提出的一种编程范式。与将一切都交给程序员控制的MPI相比,该编程模型只需要程序员定义两个操作:map和。
用于制作三明治
网上有很多介绍和解释,这里我们以三明治的制作过程来分解一下。假设我们需要大批量制作三明治。三明治的每种成分都可以单独加工。在Map阶段,原材料在不同的节点上分别进行加工,生成一些中间原料。在Map阶段,将不同的中间成分组合起来,最后将一组中间成分组合起来形成三明治成品。可以看出这个map++方法是分而治之思想的一种实现。
基于编程模型,不同的团队实现了自己的大数据框架:是最早的开源实现,现在已经成为大数据领域的行业标杆。后来出现了Spark和Flink。这些框架提供编程接口和API来帮助程序员存储、处理和分析大数据。
与MPI相比,该编程模型封装了更多的中间流程。程序员只需要将原始问题转换为更高级别的API即可。至于如何将原始问题划分为更小的子问题、如何传输和交换中间数据、如何将计算扩展到多个节点等一系列细节问题,都可以交给大数据框架来解决。因此,相对来说,学习门槛更低,使用更方便,编程开发速度更快。
批处理和流处理数据和数据流
我们在大数据的5V定义中已经提到,数据容量大、生成快。从时间维度来看,数据不断产生,形成无界的数据流( )。例如,我们每时每刻的运动数据都会积累在手机传感器上。金融交易随时随地发生,传感器将持续监控并生成数据。数据流中的某个有界数据流( )可以构成一个数据集。我们通常所说的分析某条数据,是指分析某一个数据集。随着数据产生的速度越来越快,数据来源越来越多,人们越来越注重时效性。如何处理数据流成为了大家比较关心的问题。
数据和数据流
批量处理
批处理(Batch)就是处理一批数据。批量计算在我们周围比比皆是。批量计算最简单的例子包括:微信运动每天晚上都有一个批量任务,统计用户好友一天的步数,生成排序结果推送给用户;银行信用卡中心每个月的账单日都有一个批量任务,统计一个月的消费总额,生成用户的月账单;国家统计局每季度统计经济数据,公布季度GDP增速。可见,批处理任务一般都是经过一段时间的聚合后才处理数据。对于数据量大的应用,比如微信运动、银行信用卡等,一段时间内积累的数据总量非常大,计算非常耗时。
批处理计算的历史可以追溯到 20 世纪 60 年代,当时计算机刚刚起步。目前应用最广泛的是数据仓库的ETL(Load)数据转换工作,例如以/Spark为代表的商业数据仓库和以/Spark为代表的开源数据。库。
流处理
前面说过,数据实际上是以()的形式不断产生的,而()就是对数据流进行处理。时间就是金钱,分析处理数据流并获取实时数据价值变得越来越重要。个人用户每晚查看一次微信体育排名是比较舒服的节奏,但对于金融界来说,时间就是以百万、千万甚至上亿衡量的金钱!双十一电商促销,管理者必须以秒级响应时间查看实时销售业绩、库存信息、与竞品对比结果,以获得更多决策时间;股票交易必须以毫秒的速度处理。响应新信息;风控要快速处理每一笔欺诈交易,减少不必要的损失;网络运营商必须快速发现网络和数据中心故障等。在上述场景中,一旦发生故障,服务将被延迟,损失难以估计。因此,响应速度越快,就越能减少损失并增加收入。物联网和5G通信的兴起将为数据生成提供更加完善的底层技术基础。海量数据在物联网设备上收集和生成,并通过更高速的5G通道传输到服务器。更大的实时数据流将会激增。那么,流媒体的需求肯定会爆炸。
代表性大数据技术
如上所述,编程模型的引入为大数据分析和处理开创了先例。此后,Spark、Flink等大数据框架相继出现。
2004年,创始人受到编程模型等一系列论文的启发,将论文中提到的思想进行了编程。这个名字来源于创始人道格儿子拥有的玩具大象。由于创始人Doug当时加入雅虎,并在这期间支持了大量的研发工作,因此常常被认为是雅虎开源的一个大数据框架。如今,它不仅是整个大数据领域的先行者和领导者,而且已经形成了周边的生态系统,其生态是大多数企业首选的大数据解决方案。
生态
虽然生态系统中有很多组件,但主要有三个核心组件:
这三个组件中,数据存储在HDFS上,HDFS负责计算,YARN负责集群的资源管理。除了三个核心组件之外,生态系统还有许多其他著名的组件:
火花
Spark于2009年诞生于加州大学伯克利分校,并于2013年捐赠给基金会。Spark是一个大数据计算框架,其初衷是改进编程模型和执行速度。与Spark相比,主要有两点改进:
星火生态系统
Spark的核心在于计算。主要目的是优化计算部分,在计算层面提供更细致的服务。例如,它提供了几种常用数据科学语言的API,并提供SQL、机器学习和图计算支持。这些服务是最终面向计算的。 Spark并不能完全取代它。事实上,Spark已经融入到生态系统中,并成为其中的重要元素。 Spark任务很可能依赖HDFS上的数据,从YARN申请计算资源,并使用HBase作为输出结果的目的地。当然Spark也可以不依赖这些组件独立完成计算。
Spark数据流图
Spark主要面向批处理需求。由于其卓越的性能和易于使用的界面,Spark已经是批处理行业中的绝对王者。 Spark提供流处理功能。其流处理主要基于mini-batch的思想,即将输入数据流拆分为多个batch,每个batch使用批处理进行计算。因此,Spark是一个集批处理和流处理于一体的计算框架。
弗林克
Flink 是由德国多所大学发起的学术项目。此后不断发展壮大,并于2014年底成为顶级项目。Flink主要面向流处理。如果说Spark是批处理领域的王者,那么Flink就是流处理领域的后起之秀。在Flink之前,不乏流处理引擎,比较出名的有Storm和Spark,但有些功能远不如Flink。
流处理框架的演进史
第一个广泛采用的流处理框架是 Strom。在多项基准测试中,Storm 的数据吞吐量和延迟均远不如 Flink。 Storm只支持“至少一次”和“最多一次”,即数据流中的事件传递只能保证至少一次或最多一次,而不能保证只能一次。对于许多对数据准确性要求较高的应用来说,Storm 存在一定的缺点。 Spark是非常流行的第二代流处理框架。 Spark采用mini-batch的思想,每次处理一小批数据。小批量数据包含多个事件,达到接近实时的处理效果。因为它一次计算一小批数据,所以总是存在一些延迟。不过Spark的优势在于,以Spark为后盾,用户从Spark迁移到Spark的成本较低,因此可以为用户提供批流一体化的计算框架。
Flink是不同于以上两代框架的新一代计算框架。它是一个大数据引擎,支持有界和无界数据流上的状态计算。它基于事件并支持SQL、State和其他功能。它支持“一次”,即事件传递保证只一次,不多也不少,这样可以提高数据的准确性。与Storm相比,吞吐量更高、延迟更低、准确率有保证;与Spark相比,它实现了真正基于事件的实时计算,并且需要相对较少的计算资源。
如前所述,数据以流的形式生成。数据可以分为有界()和无界()。批处理实际上是有界数据流,是流处理的特例。基于这个思想,Flink逐渐发展成为一个支持流式处理和批处理的大数据框架。
经过几年的发展,Flink 的 API 已经非常完善,可以支持 Java、Scala 和 SQL。 Flink 的 Scala 版本 API 与 Spark 非常相似。有 Spark 经验的程序员可以在一个小时内熟悉 Flink API。
与Spark类似,Flink目前主要面向计算,可以与生态高度融合。 Spark和Flink各有千秋,互相学习、竞争、学习。最终谁能称霸世界,我们拭目以待。
概括
大数据一般是基于分而治之的思想,以分布式的方式进行计算。经过十多年的发展,大数据生态圈中涌现出一大批优秀的组件和框架。这些组件封装了一些底层技术,为程序员提供简单易用的API接口。在大数据分析处理领域,已经发展成为非常成熟的生态系统,涵盖了很多与大数据相关的基础服务。 Spark和Flink主要专注于大数据计算,分别在批处理和流处理方面建立了自己的优势。 。