Apache Kafka、Apache Storm、Apache Spark、Apache Samza、Apache Beam
生产、使用、处理和分析数据的速度正在以令人难以置信的步伐迅速增加。社交媒体、物联网、广告技术和游戏等垂直领域都在竭力处理大得出奇的数据集。这些行业需要近实时处理和分析数据。像Apache Hadoop这些大数据类型的传统框架不是很适合这些使用场合。
因而,过去几年已经启动了多个开源项目,以处理数据流。它们都旨在处理来自不止一个数据源的源源不断的记录。从Kafka到Beam,有十多个Apache项目,它们处于不同的发展阶段。
当前的Apache数据流项目高度重叠,针对类似的使用场景。用户常常一头雾水,不知该选择哪种合适的开源架构,以实施实时数据流处理解决方案。本文试图帮助客户理清让人眼花缭乱的Apache数据流项目,为此列出了每个项目的主要差异化优势。我们将讨论以下开源项目针对的使用场合和主要场景:Apache Kafka、Apache Storm、Apache Spark、Apache Samza、Apache Beam及相关项目。
Apache Flume
Apache Flume是历史最悠久的Apache项目之一,它旨在收集和聚合庞大数据集(比如Web服务器日志),并将它们转移到中心位置。它属于数据收集和单事件处理系列的数据流处理解决方案。Flume基于代理驱动型架构,客户端生成的事件直接流式传输到Apache Hive、HBase或其他数据存储区。
Flume的配置包括:来源、通道和接收器(sink)。来源可以是任何东西:从系统日志(Syslog)、Twitter数据流到Avro端点,不一而足。通道定义了数据流如何传输到目的地。有效的选项包括:内存、Java数据库连接(JDBC)、Kafka、文件及其他。接收器则定义了数据流传输到哪个目的地。Flume支持许多接收器,比如Hadoop分布式文件系统(HDFS)、Hive、HBase、ElasticSearch、Kafka及其他。
Flume
Apache Flume很适合客户端基础设施支持安装代理的场景。最流行的使用场合就是,将来自多个来源的日志流式传输到中央持久性数据存储区,供进一步处理分析。
典型的使用场合:流式传输来自能够运行Java虚拟机(JVM)的多个来源的日志。
Apache Spark
Apache Spark是大数据生态系统中最炙手可热的技术。由于快速的内存处理功能以及一套表达式开发API,它引起了广大数据科学家和开发人员的注意。Spark最初是在加州大学伯克利分校的AMPLab开发而成,后来被捐赠给了Apache软件基金会。
Apache Spark为开发人员提供的一套API围绕一种名为弹性分布式数据集(RDD)的数据结构,这是只读格式的多重集数据项,这些数据项分布在具有容错机制的机器集群上。Spark旨在克服MapReduce的局限性,RDD充当分布式程序的工作集,充分利用分布式共享内存。Spark声称在内存中处理起来比Hadoop MapReduce快100倍,在磁盘上运行时快10倍。
Spark用Scala编写,但支持多种编程语言。它随带适配件,可以处理存储在不同来源的数据,包括HDFS文件、Cassandra、HBase和亚马逊S3。
Spark Streaming是一个必不可少的组件,用于构建容错的数据流应用程序。它让开发人员能够借助Spark的高级API,构建数据流应用程序。由于Spark Streaming在Spark上运行,让开发人员得以重复使用同一代码用于批处理,针对历史数据合并数据流,或者对数据流状态运行即席查询。它可用于构建传统分析之外的强大的交互式应用程序。Spark Streaming在微批处理(micro-batching)模式下运行,批任务大小比常规批处理小得多。
Spark(来源:Toptal)
虽然不是一个严格的要求,但Spark可以在现有的Hadoop和Mesos集群上运行。它提供了一个外壳,可用于交互式探究数据。
Apache Spark与Apache Kafka结合起来后,就能提供一种强大的数据流处理环境。
典型的使用场合:实时处理社交媒体内容,以执行情感分析。
Apache Storm
Apache Storm最初由BackType公司(已被Twitter收购)的内森·马兹(Nathan Marz)开发。收购后,Twitter开放了Storm的源代码,后来捐赠给Apache软件基金会。Storm备受Flipboard、雅虎和Twitter等公司的信赖,已逐渐成为开发分布式实时数据处理平台的标准。
Storm常常被称为是用于实时处理的Hadoop。据官方说明文档显示,“有了Storm,就很容易可靠地处理无边界数据流,它之于实时处理,如同Hadoop之于批处理。”
Apache Storm主要是为确保可扩展性和容错性设计的。它保证每个元组(tuple)会至少处理一次。虽然它是用Clojure编写的,但应用程序可以用读写标准输入输出数据流的任何编程语言来编写。Storm旨在支持连接输入数据流,名为“spout”和“bolt”,它们是处理模块和输出模块。spout和bolt组合构成了有向非循环图(DAG),这被称为拓扑结构。基于预先定义的配置,拓扑结构可以在集群上运行,调度程序将工作量分配到属于集群一部分的节点上。
Storm拓扑结构常常与Hadoop MapReduce作业相比较。但不同于Hadoop作业,拓扑结构持续运行,直到被终止。在拓扑结构里面,spout获取数据,之后数据将通过一系列bolt。每个bolt负责转换或处理数据。一些bolt可能将数据写入到持久性数据库或文件,而另一些bolt可能调用第三方API来转换数据。
来源:Hortonworks
由于开源生态系统,有一系列丰富的spout可用于流行的数据源,它们由社区创建。借助适配件概念,Storm可与HDFS文件系统实现互操作,参与Hadoop作业。
Storm经常与Apache Kafka和Apache Spark等其他数据获取和处理组件结合起来使用。它提供了一种可靠、可扩展、容错的分布式计算框架。
典型的使用场合:实时转换和处理社交媒体/物联网传感器数据流。
Apache NiFi
相比其他数据流解决方案,Apache NiFi是个比较新的项目,2015年7月份升级成为Apache的顶级项目。它基于企业集成模式(EIP),数据在到达目的地之前经历多个阶段和多次转换。
Apache NiFi随带一个高度直观的图形界面,因而很容易设计数据流和转换。业务分析师和决策者可以使用该工具来定义数据流。它支持众多输入源,包括静态数据集和流式数据集。从文件系统、社交媒体数据流、Kafka、FTP、HTTP和JMS等数据源获取的数据可以流到诸多目的地,包括ElasticSearch、亚马逊S3、AWS Lambda、Splunk、Solr、SQL和NoSQL数据库。转换内容可以被引入到数据流的路径。
NiFi
新兴的工业物联网领域需要一种强大、可靠和安全的数据流引擎。Apache NiFi有望成为最受青睐的编排引擎,用于处理实施的物联网系统中的传感器数据。
它结合了Node-Red的简洁和大数据的力量。内置了支持Kafka、JMS及其他通道的功能,因而成为企业物联网解决方案的一种理想选择。
Apache NiFi面向的经典场景之一是,构建热路径和冷路径分析。物联网设备和传感器生成的数据集含有需要实时分析的某些数据点,而一小部分的数据存储起来用于批处理。这类数据集通常通过高速引擎来流式传输,比如Apache Kafka、亚马逊Kinesis和Azure Event Hubs。Apache NiFi可以用来为同一数据集定义两条不同的路径:负责近实时处理的热路径和负责批处理的冷路径。
典型的使用场合:定义物联网传感器数据流动的交互式规则引擎。
Apache Apex
总部位于硅谷的DataTorrent公司将其中一款实时数据流商业产品捐赠给了Apache软件基金会,该产品现在名为Apache Apex。它是Apache历史最短的项目之一,已从孵化器项目升级成为顶级项目。Apache Apex定位于作为Apache Storm和Apache Spark的替代方案,用于实时数据流处理。它声称,速度至少比Spark快10倍到100倍。
相比Apache Spark,Apex自带企业功能,比如事件处理、保证事件传递有顺序,以及核心平台层面的容错机制。不像Spark需要Scala方面有过硬的技能,现有的Java开发人员就可以使用Apex。它可以在现有的Hadoop生态系统里面顺畅运行,使用YARN用于向上扩展或向下扩展,同时使用HDFS用于容错。
Apex
Apache Apex定位于业界唯一的开源企业级引擎,既能够处理批数据,又能满足数据流的要求。它是一种动态数据平台,允许统一处理实时无边界数据流(流式作业)或常规文件中的边界数据(批作业)。企业组织可以构建应用程序以适合其业务逻辑,并且跨流式作业和批处理来扩展应用程序。Apache Apex架构可以处理从消息总线、文件系统、数据库或其他任何数据源读取数据,或将数据写入到这些对象。只要这些数据源拥有可以在JVM里面运行的客户代码,就可以实现无缝集成。
Apex随带一个名为Malhar的操作符库,这些预先构建的操作符面向数据源和目的地,比如消息总线、文件系统和数据库。这些操作符让开发人员能够快速构建处理众多数据源的业务逻辑。Apex的总体目标是降低企业中大数据项目的复杂性。
典型的使用场合:在容错基础设施上运行的应用,需要实时处理异构数据集以及需要在批模式下处理数据集。
Apache Kafka Streams
Kafka Streams就是建立在流行的数据获取平台Apache Kafka上的一个库。源代码作为Kafka项目的一部分来提供。它由Confluent捐赠,创办这家初创公司的正是LinkedIn当初开发Kafka项目的一群人。
不久前,Apache Kafka成为了最流行的实时大规模消息传递系统。它迅速成为了当代数据平台的核心基础设施构建模块。它用于众多行业的成千上万家公司,包括Netflix、思科、贝宝和Twitter。Kafka还成了提供托管型大数据和分析平台的公共云提供商提供的一项托管服务。
Kafka Streams是一个库,用于构建数据流应用程序,具体来说是指负责将输入Kafka主题转换为输出Kafka主题的那些应用程序。它不是为大型分析设计的,而是为提供高效、紧凑的数据流处理的微服务设计的。这意味着,Kafka Streams库旨在集成到应用程序的核心业务逻辑中,而不是作为批分析作业的一部分。
Kafka
Kafka Streams帮助用户摆脱了这项任务:安装、配置和管理专门为数据流处理而部署的复杂Spark集群。它简化了数据流处理,因而让它可以作为一种面向异步服务的独立式应用编程模型。开发人员无需数据流处理集群,就可以嵌入Kafka Streams功能。该架构会有Apache Kafka和应用程序,没有外部的依赖项。
Kafka Streams提供了与Kafka提供的核心抽象完全集成的处理模式,以便减少数据流架构中活动部分的总数。它不是通常为了处理批处理而编写的MapReduce代码的一部分。
讨论Kafka Streams时,还有必要谈提到Kafka Connect,这种框架可靠地将Kafka与外部系统连接起来,比如数据库、键值存储系统、搜索索引和文件系统。
Kafka Streams的最大优点是,它可以包装成一个容器,可以放在Docker上。开发运维团队还可以使用Ansible、Puppet、Chef、Salt,甚至外壳脚本,以部署和管理应用程序。一旦被包装成容器,它可以与众多编排引擎集成起来,比如Docker Swarm、Kubernetes、DC/OS、Yarn及其他编排引擎。
典型的使用场合:需要嵌入式数据流处理功能,又不依赖复杂集群的微服务和独立式应用程序。
相关网址:http://docs.confluent.io/3.0.0/streams/index.html
Apache Samza
Apache Samza是在LinkedIn开发出来的,避免Hadoop的批处理需要的那种漫长的周转时间。它建立在Apache Kafka这低延迟分布式消息传递系统的基础上。开发Samza的初衷是,为数据持续处理提供一种轻量级框架。
Kafka和Samza这对组合好比HDFS和MapReduce。如果HDFS充当MapReduce作业的输入,那么Kafka获取由Samza处理的数据。数据流入时,Samza可以持续计算结果,提供亚秒级响应时间。
从数据流获得输入后,Samza执行作业,作业其实是使用和处理一组输入数据流的代码。作业可能用Java、Scala或支持JVM的其他语言编写。为了确保可扩展性,作业进一步细分为名叫任务(task)的更小执行单位,任务是一种并行处理单位,就好比数据流的分区。每个任务使用由其中一个分区传输的数据。
任务按顺序处理来自每一个输入分区的消息,按照消息偏移的次序。没有跨分区的定义顺序,让每个任务可以独立运行。
Samza
Samza将在一个或多个容器里面执行的多个任务分成一组,容器是隔离的操作系统进程,运行JVM,负责为某一个作业执行一组任务。容器是单线程,负责管理任务的生命周期。
Samza及其他数据流技术之间的主要区别在于有状态的数据流处理功能。Samza任务有专门的键/值存储区,位于同样任务的机器上。这种架构提供的读写性能胜过其他任何数据流处理软件。
由于Samza从LinkedIn广泛使用的Kafka发展而来,它有着出色的兼容性。它变成了Kafka用于获取数据的架构当中的一种自然选择。
Apache Samza和Kafka Streams旨在处理同一个问题,后者是一种可嵌入库,而不是功能完备的软件。
典型的使用场合:经过优化的数据流处理,面向利用Kafka来获取数据的应用。
Apache Flink
Apache Flink最初于2010年在德国开发,当时还叫“Stratosphere:云端信息管理系统”,它是德国柏林工业大学、柏林洪堡大学和波茨坦哈索-普拉特纳学院合作的产物。提交给Apache软件基金会后,它在2014年12月成为了一个顶级项目。起初,Apache Flink的概念和使用场合类似Apache Spark。它旨在成为运行批处理、数据流处理、交互处理、图形处理和机器学习等应用的单一平台。
但是Spark和Flink在实施方面存在着区别。
Spark Streaming旨在处理小批作业,提供近实时功能。由于细粒度事件级处理架构,Apache Flink提供实时处理。
Flink为数据流处理带来了几项独特的功能。它为状态更新提供了数据仅处理一次并且仅输出一次(exactly-once)的保证,让开发人员不必面临处理重复的负担。它有一种高吞吐量引擎,可以在通过分布式网络发送事件之前缓存事件。Flink提供了一种强大的数据流编程模型,拥有灵活的窗口方案。
Flink
Flink旨在既是用于数据流分析的DataStream API,又是在底层数据流处理引擎上用于批分析的DataSet API。
Apache Flink支持用Java或Scala编写的程序,这类程序会自动编译并优化,变成数据流程序。Flink并没有数据存储系统。输入数据可能来自像HDFS或HBase这样的分布式存储系统。至于数据流处理,Flink可以使用来自Kafka等消息队列的数据。
典型的使用场合:实时检测和预防欺诈性信用卡交易。
Apache Beam
Apache Beam是Apache软件基金会越来越多的数据流项目中最新增添的成员。这个项目的名称表明了设计:结合了批处理(Batch)模式和数据流(Stream)处理模式。它基于一种统一模式,用于定义和执行数据并行处理管道(pipeline),这些管理随带一套针对特定语言的SDK用于构建管道,以及针对特定运行时环境的Runner用于执行管道。
谷歌以及Data Artisans、Cloudera和贝宝将其大数据服务的SDK:Cloud Dataflow捐赠给Apache软件基金会,后来它成为了Apache Beam的基础。它由谷歌的众多内部项目演变而来,比如MapReduce、FlumeJava和Millwheel。Beam中的Pipeline Runners概念可将数据处理管道转变成与多个分布式处理后端兼容的API。管道是一连串在数据集上运行的进程。每个Beam程序都会有面向后端的runner,这取决于管道在哪里执行。该平台目前支持的runner包括:谷歌Cloud Dataflow、Apache Flink和Apache Spark。正在开发支持Storm和MapReduce等其他runner的功能。
Beam
Beam可以解决什么问题?当MapReduce作业从Hadoop迁移到Spark或Flink,就需要大量的重构。Dataflow试图成为代码和执行运行时环境之间的一个抽象层。代码用Dataflow SDK实施后,会在多个后端上运行,比如Flink和Spark。Beam支持Java和Python,与其他语言绑定的机制在开发中。它旨在将多种语言、框架和SDK整合到一个统一的编程模型。
典型的使用场合:依赖多种框架(包括Flink和Spark)的应用程序。
相关网址:http://beam.incubator.apache.org
Apache Ignite
Apache Ignite是建立在分布式内存计算平台上的一个内存层。它经过了优化,以便实时处理庞大数据集。内存架构让它的运行速度比基于磁盘或基于闪存的传统技术要快得多。
该项目最初是由GridGain Systems开发的,后来它在2014年捐赠给了Apache软件基金会。2015年9月份,Ignite从孵化器项目升级为顶级项目。
虽然Spark和Ignite都依赖分布式内存处理架构,但两者之间还是存在细微的差别。Spark主要是为交互式分析和机器学习等应用设计的,而Ignite旨在提供编程实时分析、机器对机器通信和高性能事务处理。
Ignite有可能成为事务处理系统的优选解决方案,比如股票交易、欺诈检测、实时建模和分析。无论是在商用硬件上运行的横向扩展架构,还是在高端工作站和服务器上的纵向扩展,Ignite同样可以轻松应对。
Ignite
Ignite数据流功能让用户能够以可扩展、容错的方式,处理持续不断的数据流。数据注入Ignite的速度可以非常快,在一个中等规模的集群上每秒轻松超过100万个事件。
典型的使用场合:高度依赖编程实时分析、机器对机器通信和高性能事务处理的应用。
相关网址:https://ignite.apache.org
云头条编译|未经授权谢绝转载
欢迎加入交流,群主微信:aclood