欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~
本文讨论大数据处理生态系统和相关的架构栈,包括对适应于不同任务的多种框架特性的调研。除此之外,文章还从多个层次对框架进行深入研究,如存储,资源管理,数据处理,查询和机器学习。
使用门槛的降低是互联网上数据最初增长的驱动力。随着智能手机和平板电脑等一系列新设备的出现,这一趋势得以加强。在第一代数据增长的基础上,社交媒体平台推动数据量以指数级增长,这也就是所谓由社交媒体释放的第二次增长浪潮。信息分享平台的协作特质促成了数据分享的病毒式增长。第三次的增长则很大程度上来自于智能互联设备的的快速增加,而这也将带来前所未有的数据扩张。此外,科学领域的进步和更加廉价的计算力已经为包括医疗科学、物理学、天文学和基因学在内的诸多领域带来了新的应用。在这些领域中,收集的数据被用来验证假说,推动新的发现和创造。
数据获取和存储的快速扩张将我们带到了一个新的阶段——将数据处理为有意义的解释。处理大量数据的现实需要导致了对可扩展及并行系统的需求。这些系统能够以更高的速度和更大的规模处理数据。开源技术就是大规模数据处理所需高性能计算技术的不二之选。本文将为大数据处理栈不同层次可用的开源框架及组件做总体的介绍。
用于大数据处理的组件架构栈
随着越来越多的大数据(以数量,速度和种类三个V为特征)的生成和收集,各种各样系统开始发展,以期挖掘出这些数据的巨大而多样的潜力。尽管许多系统表现出了相同的特性,但它们往往有着不同的设计哲学,这也带来了更大的选择空间。企业决定数据策略的战略指导原则之一就是采用通用的数据存储层,这将便利不同框架对数据的运用,同时数据也能够跨框架共享。图1展示了一个典型的数据处理架构栈。
这个架构栈也可以被视为一个多阶段的数据处理流水线,如图2所示。非结构化的数据往往有多样的格式,例如文本数据、图片、视频和音频等。而这些数据也有包括交易记录、网络日志、公众网站、数据库、多种设备和工具以及其他相联系的数据在内的多种数据源。经过清洗和错误检查后,这些数据会进入数据存储层。接下来的任务就是利用下一部分描述的框架对数据进行反复和交互式的处理。处理过程本身可能会有多个子阶段,期间有可能伴随着与存储层的交互。它可以进一步使用统计算法探索和建模来推导和验证假设。用数据对算法进行训练,然后将其用于预测建模。当有新的数据集进入系统时,这些算法可以进行周期性的训练。数据集进一步用于探索性分析,从而发现潜藏的知识和见解。在处理和探索过程中,通过使用可视化工具对处理后的数据集进行可视化,促进对于数据的理解,并可将其用于与利益相关者的沟通。
存储层中的数据可以被组织内的不同利益相关者复用。大数据通常是不确定的,而多数处理框架已经适应了这一特性。事实上,这个特性正是一个框架成功的关键因素。下面,让我们讨论这些不同层次的框架和库。
存储和数据层
让我们从存储和数据层开始。这是大数据栈是最重要的组成要素和基础。正如其名,大数据通常以其大量的数据为特征,而这要求巨大乃至理论上无限的存储容量。促成更便宜的存储和计算资源的技术进步,导致了集群存储和计算平台的出现。这些平台摆脱了存储限制,并实质上实现了无限量的数据存储。这些平台不受传统数据建模和模式设计范例的限制。它们通常是无模式的,允许存储所有形式的数据(结构化,半结构化和非结构化)。这使得创建更具动态性的系统成为可能,分析人员也可以摆脱现有模型的限制对数据进行探索。
HDFS(https://hadoop.apache.org)
这是Hadoop生态系统中的可扩展的、具有容错性的分布式文件系统。将商用服务器添加到集群中即可扩展HDFS。已知的最大集群包括了大约4500个节点和高达128PB的数据。HDFS支持并行读取和写入数据。HDFS系统中的带宽随节点数量线性变化。通过存储在系统中的多个数据副本实现内置冗余。这些文件被分解成块(Blocks)并像文件一样存储在集群中。为了实现可靠性,这些文件会被复制多份。HDFS具有主/从体系结构,在集群中有一个称为NameNode的组件,该组件作为主服务器。NameNode管理文件系统命名空间(文件,目录和块以及它们的关系)。命名空间存储在内存中,并且定期将更改保存到磁盘中。除此之外,还有一些称为DataNode的从属组件,在集群中的每个节点都有一个这样的组件。这些进程管理特定计算节点所依赖的存储。
NoSQL数据库(http://nosql-database.org)
随着Web不断发展并变得更易于访问,现有的关系数据库技术无法满足Web 2.0的大量数据和并发需求。这已经成为显而易见的事实。为了满足这一需求,“不仅仅是数据查询(Not only SQL)”数据库作为存储和管理系统的新选择出现了。相比于HDFS和Hadoop最为数据分析领域实时或批量处理引擎,NoSQL数据库本质上是应用于基于前后端系统的Web应用的数据存储层,特别那些需要有大量并发处理能力的Web应用。
这些数据库的特点包括他们通常是无结构的(或者仅需要极少的结构设计)、水平可扩展以及依赖于事件一致性模型而不是即时一致性模型。
现在出现了四种基本的NoSQL架构,他们是
- 基于哈希数据结构或关联数组数据模型的键值存储。这类数据库建立在亚马逊的Dynamo论文之上。(http://www.allthingsdistribut...)。
- 列式数据库(DB)基于Google的BigTable论文(http://research.google.com/ar...)。这一数据模型允许每行有自己的模式,例如, HBase和Cassandra。
- 文档数据库将数据存储为文档,每个文档都是键值对的集合。通常,这些文档以JSON形式存在(例如,MongoDB和CouchDB)。
- 图数据库将数据模型表示为节点或表示为节点之间关系。节点和关系都以键值对(例如Neo4J)表示。
Tachyon(http://tachyon-project.org)
这是一个跨集群框架和作业提供可靠内存数据共享的平台。Tachyon实质上位于诸如HDFS之类的存储平台之上,因此可跨群集框架和作业提供以内存为中心的数据处理功能。尽管Spark等一些现有的集群计算框架已经实现了在内存中进行数据处理,但这一方案存在三个关键的缺陷,促成了Tachyon的发展:
- 虽然作业在内存中处理数据,但作业和框架间的数据共享尚未实现,因为数据仅在作业的JVM上下文中可用。
- 由于执行引擎和存储位于相同的JVM上下文中,因此任何执行引擎崩溃都会导致数据丢失并且需要重新计算。
- 在某些情况下,内存中的数据会在作业间复制,导致数据占用空间更大,触发更为严重的垃圾收集。
Tachyon正是为了解决上述问题而得以发展。它通过与存储层建立血统关系(lineage)实现。它可以在内存中只存储一个数据副本,这些数据副本可在所有框架(如Spark,MapReduce等)中使用。此外,它通过依赖于血统关系的重新计算来实现容错功能。
数据处理框架
将数据保存到存储层后,下一步就是处理这些数据,并从中形成见解。我们将在这里比较几个框架。
Apache Hadoop 栈(https://hadoop.apache.org)
是大数据处理框架的祖师爷,并且已经成为这些技术汇集的事实上的平台。该平台的成本效益和可扩展性完全符合业界大规模数据处理的需求。此外,平台的可靠性,社区支持和围绕该平台产生的生态系统使该平台得到更广泛的采用。
Hadoop生态系统有三个主要目标:
- 可扩展性 - 仅仅通过向集群添加节点即可实现扩展以满足更大的需求。由于框架采用本地计算模型以便从简化的可伸缩性模型中获益,这个特性得到了进一步的增强。
- 灵活性 - 为存储不同格式的结构化数据提供灵活性。这是通过“模式读取(Schema on Read)”方法实现的,该方法使系统能够存储任何内容,并且只在读取数据时才解析数据,而这正是需要了解数据的时间。
- 效率 - 确保集群资源得到最佳利用以提高效率。
Hadoop MapReduce(https://hadoop.apache.org)
是MapReduce编程范式的实现(由Google论文推广)。这种编程范式意在通过大型集群并行处理超大型数据集,同时确保可靠性和容错性。MapReduce() 范式本身是一个建立在确保可靠性和可扩展性的分布式文件系统之上的概念。一个MapReduce() 程序包括两个程序 Map() 和Reduce()。Map() 过程并行处理输入数据集并产生处理后的输出。由于Map() 阶段发生在一个非常大的分布式数据集上,散布在一个巨大的节点集群中,随后执行Reduce() 阶段,该阶段聚合来自于多个Map节点排序后的数据集,这个框架以及底层的HDFS系统能够处理以PB为单位运行的,分布在数千个节点上的超大型数据集。
Apache Flink(https://flink.apache.org/)
是一个数据处理系统,结合了Hadoop HDFS层的可扩展性和强大功能以及作为关系型数据库基石的的声明式特性和性能优化。Flink提供了一个运行时系统,它是Hadoop MapReduce框架的替代选择。
Apache Tez(https://tez.apache.org/)
是一个分布式数据处理引擎,建立在Yarn(Hadoop 2.0生态系统)之上。Tez将数据处理工作流程建模为分布式非循环图(Distributed Acyclic Graphs, DAGs)。凭借这一独特功能,Tez可让开发人员直观地将复杂的数据处理作业建模为一系列任务,同时利用Hadoop 2.0生态系统的基础资源管理功能。
Apache Spark(https://spark.apache.org/)
是大数据处理的分布式执行引擎,可提供处理内存中的大型数据集的高效抽象。虽然基于Yarn的MapReduce提供了使用集群计算资源的抽象方法,但它在需要复用数据的迭代算法和交互式数据挖掘算法中缺乏效率。Spark以RDD(弹性分布式数据集)的形式实现内存中的容错数据抽象。这中种存储在内存中的并行数据结构形式存在。RDD通过追踪转换过程(血统,lineage)而不是实际数据实现容错功能。如果有一个部分在丢失后需要回复,则只需要在这个数据集上执行变换。这比跨节点复制数据集以提高容错性要高效得多。据推测,这比Hadoop MR快100倍。
Spark还为批处理,流数据处理,交互式数据挖掘提供了统一的框架,还包括Java,Scala和Python中的API在内。它提供了一个交互式命令行工具(shell)。通过这一工具可以使用快速查询功能、用于机器学习的库(MLLib和GraphX)、用于图形数据处理的API、SparkSQL(一种声明性查询语言)和SparkStreaming(用于流数据处理的流式API)。SparkStreaming是一个用于实时处理事件流的系统。SparkStreaming将流处理视为微批处理(microbatch)数据集。输入流被分成预设时长的批次。这些批处理被输入到底层的Spark系统中,并且通过与Spark批处理编程范式相同的方式进行处理。这使得实时处理所需的极低延迟和实时集成批处理特性得以实现。
Apache Storm(https://storm.apache.org/)
是一个用于实时处理连续数据流的系统。它具有高度可扩展性,容错能力,并实现了可靠处理的概念,从而不会丢失任何事件。Hadoop提供了批量处理数据的框架,而Storm在流式事件数据实现了同样的功能。它使用有向无环图(DAG),并借助喷嘴(spouts, 输入数据源)和闪电(bolts)的概念来定义数据处理流水线或拓扑。流是流经这些处理流水线的元组。Storm集群由三部分组成:
- Nimbus,运行在主节点上,负责在工作进程中分配工作。
- Supervisor守护进程在工作节点上运行,监听分配的任务,并根据需要管理工作进程以启动/停止它们,以完成工作。
- Zookeeper处理Nimbus和Supervisors之间的协调,并维持容错状态。
用于分析和查询的高级语言
随着集群编程框架逐渐演变为解决大数据处理问题的主要手段,另一个问题伴随着更大规模的实用尝试而开始出现。使用这些计算框架编程变得越来越复杂且难以维护。技能可伸缩性成为另一个值得关注的问题,因为有许多人熟悉熟悉SQL和脚本等技能的领域专业知识。因此,集群计算框架的更高层次的编程抽象开始出现,它们对低层次的编程API进行抽象。本部分讨论了其中一些框架。
Hive(https://hive.apache.org/)和Pig(https://pig.apache.org/)
是MapReduce的高级语言实现。语言接口从用高级语言编写的查询命令在内部生成MapReduce程序,从而抽象出MapReduce和HDFS的基本内容。Pig实现了PigLatin,这是一种类似过程式的语言接口,而Hive提供了Hive查询语言(HQL),它是一种与SQL类似的声明式语言接口。
Pig适合于为迭代处理场景编写数据处理流程。Hive采用声明式SQL语言,可用于临时数据查询,探索性分析和商业智能(BI)。
BlinkDB(http://blinkdb.org/)
是大数据处理生态系统的新进者。它提供了一个支持大数据近似查询的交互式查询处理平台。随着数据量呈指数级增长,越来越多的长期研究出现在这个领域,并聚焦于创建低延迟的计算模型。Apache Spark在朝这一方向发展,它致力于利用内存数据结构降低延迟。
Blink DB通过引入近似查询的概念进一步压缩延迟基准。在一些行业案例中,如果速度的能有所提升,少量的错误是可以接受的。BlinkDB通过在原始数据集的样本而非整个数据集上运行查询。该框架能为查询定义可接受的错误界限,或指定时间限制。系统根据这些约束处理查询并返回给定范围内的结果。BlinkDB利用统计学采样误差的概念,即采样误差不随总体规模而变化,而是取决于样本量。因此,即便随着数据量的增加,相同的样本量总能以适当的水平反映总体的性质。这种想法带来了令人难以置信的性能改善。由于查询的时间大部分是消耗在I/O过程中,如果将样本量设定为原始数据的10%,处理速度就可以提升10倍,同时误差小于0.02%。BlinkDB构建在Hive Query引擎上,并支持Hadoop MR和Apache Shark执行引擎。BlinkDB对这种复杂的近似方法进行抽象,并提供了一种类SQL的命令结构。这种语言在用户利用原始命令自定义的函数之外还支持标准的聚合,过滤,分组,联合以及嵌套查询。
集群资源管理框架
集群资源管理是大数据处理栈中的关键组件之一。现有的资源管理框架已经能够将支持多种上层框架的通用性与一些所需的重要特性结合起来。这些特性包括完全不同的处理需求、数据控制的稳健性和无缝恢复。通用框架将避免在集群内的不同框架之间复制大量数据。提供一个易于使用的管理接口同样十分重要。下面我会介绍几个实现了这一功能的资源管理框架。
Apache Hadoop Yarn(https://hadoop.apache.org)
Hadoop 1.0完全根据MapReduce范式而构建的引擎。随着Hadoop被广泛接受为分布式大数据批处理系统的平台,其他计算模式(如消息传递接口,图形处理,实时流处理,临时和迭代处理等)的需求也不断增长。MapReduce作为一种编程范式,并不支持这些要求。因此,新的(以及其他现有的)框架开始发展。另外,HDFS作为大数据存储系统得到了广泛接受,而为其他框架单独设计存储结构并没有什么意义。因而Hadoop社区致力改进现有平台,从而使其不仅仅局限于MapReduce。这一努力的成果就是Hadoop 2.0,它将资源管理与应用程序管理分离开来。资源管理系统被命名为Yarn。Yarn同样是主从架构,资源管理器作为主服务,负责管理对集群上不同应用程序的资源分配。从属组件称为NodeManager,在群集中的每个节点上运行,并负责启动应用程序所需的计算容器。ApplicationMaster是框架特定的实体。它负责协调ResourceManager中的资源并与节点管理器一起提交和监视应用程序任务。ApplicationMaster是框架特定的实体。它负责协调ResourceManager中的资源并与节点管理器一起提交和监视应用程序任务。
这种解耦允许其他框架与MapReduce一起工作,访问和共享同一集群上的数据,从而有助于提高集群利用率。
Apache Mesos(http://mesos.apache.org/)
是一种通用的集群资源管理框架,可以管理数据中心中的所有资源。Mesos采用与Yarn不同的方式调度工作。Mesos实现了一个两级调度机制,主服务器向框架调度器提供资源,框架决定是否接受或拒绝它们。这个模型使得Mesos变得具有良好可扩展性和通用性,并且允许框架能很好地满足特定的目标,比如数据局部性。Mesos是一个主/从架构,Mesos主服务器(master)在其中一个节点上运行,并且与多个备用主服务器相配合,以便在出现故障时进行接管。主服务器管理集群节点上的从属进程以及在节点上运行任务的框架。运行在Mesos上的框架有两个组件:在主服务器上注册的框架调度器,以及在Mesos从服务器上启动的框架执行器。在Mesos中,从服务器向主服务器报告所提供的可用资源。Mesos 主服务器查找分配策略并根据策略向框架提供资源。该框架根据其目标和需要运行的任务可以完全接受,部分或甚至拒绝分配。如果有的话,它会发回一个接受的响应和要运行的任务。Mesos主服务器将这些任务转发给相应的从服务器,这些从服务器将所提供的资源分配给执行者,然后执行器启动任务。
机器学习库
如果不能最终提供商业价值,将努力付出在大数据上将毫无意义。机器学习使系统能够学习或处理大量数据,并能够将其应用于预测未知输入数据集上的结果。在显示生活中,已经有许多机器学习系统的案例,例如定向广告,推荐引擎,“下一个最佳报价/行为”,自学自治系统等。下面这个领域的一些框架。
Apache Mahout(http://mahout.apache.org/)
旨在提供一个可伸缩的机器学习平台。它实现了多种”开箱即用“算法,并提供了一个实现自定义算法的框架。尽管Apache Mahout是最早的机器学习库之一,但它最初是作为为MapReduce编程范例而编写的。然而,MapReduce不太适合机器学习算法的迭代特性,因此并没有取得很大的成功。当Spark开始展露头角时,Mahout已被移植到Apache Spark,并重新命名为Spark MLLib,且不再使用Hadoop MapReduce。
Spark MLLib(https://spark.apache.org/mllib/)
是一个可扩展的机器学习平台。它建立在在Spark的上层,可视为Spark Core执行引擎的扩展。Spark MLLib已经是Spark Core的本地扩展实现,因此它有许多优势。Spark MLLib有几种为ML问题编写的算法,例如分类,回归,协同过滤,聚类,分解等。
PredictionIO(http://prediction.io/)
是一种可扩展的机器学习服务器。它提供了一个框架,可加快机器学习应用程序的原型设计和生产应用。它基于Apache Spark构建,并利用Spark MLLib所提供多种机器学习算法的实现。它提供了一个接口将训练过的预测模型抽象为一种服务,而这是通过基于事件服务器的架构提供的。它还提供了一种将分布式环境中持续训练训练模型的方法。生成的事件是实时收集的,并且可以用来作为批处理作业重新训练模型。客户端应用程序可以通过REST API查询服务,并JSON响应返回预测结果。
问答相关阅读
此文已由作者授权腾讯云+社区发布,原文链接:https://cloud.tencent.com/dev...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。