理解流处理

在过去几年中,开源流处理的创新激增。Apache Spark和Apache Storm等框架为开发人员提供了可以开发应用程序的流抽象; Apache Beam提供API抽象,使开发人员能够编写独立于底层框架的代码,而Apache NiFi和StreamSets Data Collector等工具提供用户界面抽象,允许数据工程师定义来自高级构建块的数据流。没有编码。

在本文中,我将提出一个组织流处理项目的框架,并简要描述每个领域。我将专注于将项目组织成概念模型; 有很多文章比较了实际应用程序的流式框架 - 我最后列出了一些。

我将介绍的具体类别包括流处理框架,流处理API和流数据流系统。

什么是流处理?

解释流处理的最简单方法是与其前身批处理相关。过去的许多数据处理都是围绕处理定期的,可预测的批量数据 - 夜间工作,在“安静”时间,将处理前一天的交易; 提供仪表板等摘要统计信息的月度报告。批处理过程简单,可扩展,可预测,企业可以容忍模型中固有的延迟 - 在处理事件和下游可见之前可能需要数小时甚至数天。数据存储。

随着企业要求更及时的信息,批次变得越来越小,处理频率越来越高。由于批量大小倾向于单个记录,因此出现了流处理。在流处理模型中,事件在发生时进行处理。这种更具动态性的模型带来了更多的复杂性。通常,流处理是不可预测的,事件以突发方式到达,因此系统必须能够应用反压,缓冲事件进行处理,或者更好地动态扩展以满足负载。更复杂的场景需要处理乱序事件,异构事件流以及重复或丢失的事件数据。

虽然批量大小正在缩小,但数据量也在增长,同时需要容错。分布式存储架构随着HadoopCassandraS3和许多其他技术而蓬勃发展。Hadoop的文件系统(HDFS)带来了一个简单的API,用于将数据写入集群,而MapReduce使开发人员能够编写可扩展的批处理作业,使用简单的编程模型处理数十亿条记录。

MapReduce是一个用于扩展数据处理的强大工具,但其模型在某种程度上受到限制; 加州大学伯克利分校AMPLab的开发人员创建了Apache Spark,通过提供除map和reduce之外的更多操作来改进MapReduce,并允许将中间结果保存在内存中而不是存储在磁盘上,从而大大提高了性能。无论是在集群上运行还是作为独立应用程序运行,Spark都提供了一致的API。现在,开发人员可以编写分布式应用程序并对其进行小规模测试 - 甚至可以在他们自己的笔 - 在将它们推广到数百或数千个节点的集群之前。

Spark Streaming满足了缩小批量大小和不断增加的数据量的趋势它通过将数据流时间切片为离散块来将Spark编程模型调整为微批量。微批量在较大的批量大小和单个事件处理之间提供折衷,旨在平衡吞吐量和延迟。移动到微批处理,单事件批次的限制,Apache Flink提供低延迟处理,具有一次性交付保证。

快进到今天,Flink和Spark Streaming只是流框架的两个例子。流式框架允许开发人员构建应用程序以解决近实时分析用例,例如复杂事件处理(CEP)。CEP结合来自多个来源的数据来识别各种事件的模式和复杂关系。CEP的一个示例是在一个滑动时间窗口内分析来自一组医疗监视器的参数,例如温度,心率和呼吸速率,以识别临界状况,例如患者进入休克状态。

在很大程度上,各种框架提供了类似的功能:跨群集分发代码和数据,配置数据源和目标,加入事件流,将事件传递给应用程序代码等的能力。它们的方式不同这样做,提供延迟,吞吐量,部署复杂性等方面的权衡。

流式框架和API面向开发人员,但是有大量的数据工程师正在寻找更高级别的工具来构建数据管道 - 将事件从生成位置移动到可以分析的位置。流数据流系统(如StreamSets Data CollectorApache NiFi)为用户提供基于浏览器的UI,以设计管道,提供一系列现成的连接器和处理器,以及用于添加自定义代码的扩展点。

流处理框架

至少有七个开源流处理框架。大多数都在Apache横幅下,每个都实现了自己的流抽象,并在延迟和吞吐量方面进行了权衡:

在思想共享和采用方面,Apache Spark是800磅重的大猩猩,但每个框架都有它的拥护者。在不同的框架中,在延迟,吞吐量,代码复杂性,编程语言等方面存在权衡,但它们都有一个共同点:它们都提供了一个开发人员可以在代码中实现其业务逻辑的环境。

作为开发人员对流处理框架的观点的一个例子,这里是Spark文档中的单词计数应用程序,相当于'Hello World'的流式处理:

对象 NetworkWordCount {
  def  main(args:Array [ String ]){
    如果(ARGS。长度 <  2){
      系统。犯错。println“用法:NetworkWordCount <主机名> <端口>”
      系统。出口(1
    }
 
    StreamingExamples。setStreamingLogLevels()
 
    val  sparkConf  =  new  SparkConf()。setAppName(“NetworkWordCount”
    val  ssc  =  new  StreamingContext(sparkConf,Seconds(1))
 
    val  lines  =  ssc。socketTextStream(ARGS(0),ARGS(1)。toInt,StorageLevel。MEMORY_AND_DISK_SER)
    val  words  =  lines。flatMap(_。split(“”))
    val  wordCounts  =  单词。map(x  =>(x,1))。reduceByKey(_  +  _
    wordCounts。打印()
    ssc。开始()
    ssc。awaitTermination()
  }
}

流式传输框架为CEP等用例编码流应用程序提供了强大的功能和灵活性,但具有很高的入门门槛 - 只有开发人员需要申请。

流处理API

流式传输框架在诸如事件处理延迟和吞吐量等方面有所不同,但具有许多功能相似性 - 它们都提供了对连续事件流进行操作的方式,并且它们都提供了自己的API。此外,流处理API抽象在框架自己的API之上提供了另一层抽象,允许单个应用程序在各种环境中运行。

API抽象的一个很好的例子是Apache Beam,它起源于Google,作为Dataflow模型的一个实现。Beam提供了统一的编程模型,允许开发人员实现可以在各种框架上运行的流(和批处理!)作业。目前,有针对Apex,Flink,Spark和Google自己的Cloud Dataflow的Beam'Runners'

Beam的最小字数例子(剥离了它对空间的大量评论!)与Spark代码没有什么不同,即使它是用Java而不是Scala:

public  static  void  mainString [] args){
  PipelineOptions  options  =  PipelineOptionsFactory。create();
 
  管道 p  =  管道。创造(选项);
 
  p。apply(TextIO。阅读。来自(“gs:// apache-beam-samples / shakespeare / *”))
   。申请(“ExtractWords” ,帕尔多。的( DOFN < 字符串字符串>(){
                     @ProcessElement
                     public  void  processElement(ProcessContext  c){
                       对于字符串 字:Ç。元素。()分割(“[^ A-ZA-Z'] +” )){
                         如果(!字。的isEmpty()){
                           c。输出(字);
                         }
                       }
                     }
                   }))
 
   。申请(计数。perElement())
   。申请(“FormatResults” ,MapElements。通过( SimpleFunction < KV < 字符串>,字符串>(){
                     @覆盖
                     public  String  apply(KV < StringLong >  input){
                       返回 输入。getKey()+  “:”  +  输入。getValue();
                     }
                   }))
   。申请(TEXTIO。写。到(“wordcounts” ));
  p。run()。waitUntilFinish();
}

因此,Beam为开发人员提供了与底层流式传输框架的独立性,但您仍然会编写代码来利用它。

Kafka Streams是一种更专业的流处理API。与Beam不同,Kafka Streams提供特定的抽象,专门用于Apache Kafka作为数据流的源和目标。Kafka Streams不是一个框架,而是一个客户端库,可用于实现您自己的流处理应用程序,然后可以将这些应用程序部署在集群框架(如Mesos)之上。Kafka Connect是连接软件,它弥补了Kafka与其他系统之间的差距,API允许开发人员创建Kafka消费者和生产者。

流数据流系统

流处理框架和API允许开发人员为CEP等用例构建流分析应用程序,但是当您只想从某个源获取数据,应用一系列单事件转换以及写入一个或多个目标时,可能会过度杀伤。例如,您可能希望从Web服务器日志文件中读取事件,查找每个事件的客户端IP的物理位置,并将结果记录写入Hadoop FS - 一个经典的大数据摄取用例。

Apache Flume就是为这种过程而创建的。Flume允许您配置数据管道以从各种源中摄取,应用转换以及写入多个目标。Flume是经过实战考验的可靠工具,但它并不是最容易设置的。用户界面并不完全友好,如下所示:

#Fample Flume配置从中复制线
#log文件到Hadoop FS
 
a1。sources = r1
a1。sinks = k1
a1。channels = c1
 
a1。来源。r1。type = spooldir
a1。来源。r1。channels = c1
a1。来源。r1。spoolDir = / Users / pat / flumeSpool
 
a1。渠道。c1。type = 记忆
 
a1。下沉。k1。type = hdfs
a1。下沉。k1。channel = c1
a1。下沉。k1。hdfs。fileType = DataStream
a1。下沉。k1。hdfs。path = / flume / events
a1。下沉。k1。hdfs。useLocalTimeStamp = true

有关Flume与StreamSet数据收集器的更广泛比较,请参阅此博客条目

另一方面,StreamSets Data Collector(SDC)和Apache NiFi各自提供基于浏览器的UI来构建数据管道,允许数据工程师和数据科学家构建可在一组机器上执行的数据流,而无需写代码。虽然SDC不是Apache管理的项目,但它是开源的,并且在与NiFi,Spark等相同的Apache 2.0许可下免费提供。

该管道取自SDC教程,从本地磁盘存储读取CSV格式的交易数据,从信用卡号计算信用卡发行网络,屏蔽信用卡号码的最后4位数字,并写入结果数据到Hadoop:

当然,并非所有问题都可以通过将预构建的处理阶段连接在一起来解决,因此SDC和NiFi都允许通过脚本语言(如Scala,Groovy,Python和JavaScript)以及它们的通用实现语言Java进行自定义。

除了UI之外,从Flume到NiFi和SDC的流处理工具发展的另一个方面是分布式处理。Flume没有对集群的直接支持 - 由您来部署和管理多个Flume实例并在它们之间分区数据。NiFi可以作为独立实例运行,也可以通过自己的集群机制进行分发,尽管人们可能希望NiFi在某些时候转换到Hadoop集群资源管理器YARN。

SDC可以类似地独立运行,作为YARN上的MapReduce作业运行,或作为YARN和Mesos上的Spark Streaming应用程序运行。此外,为了将流处理合并到管道中,SDC包含Spark评估器,允许开发人员将现有的Spark代码集成为管道阶段。

那我该怎么用?

为特定工作负载选择合适的系统取决于许多因素,从功能处理要求到解决方案必须遵守的服务级别协议。一些一般准则适用:

  • 如果要从头开始为CEP等分析用例实现自己的流处理应用程序,则应使用其中一个流处理框架或API。
  • 如果您的工作负载位于群集上,并且您希望设置连续数据流以将数据提取到群集中,则使用流处理框架或API可能会过度。在这种情况下,您最好部署流数据流系统,如Flume,NiFi或SDC。
  • 如果要对已驻留在群集中的数据执行单事件处理,请在群集模式下使用SDC将转换应用于记录,并将它们写回群集或将其发送到其他数据存储。

在实践中,我们看到企业在后端使用流处理和批处理/交互式分析应用程序的混合。在这种环境中,单事件处理由SDC等系统处理,在数据存储中存储正确的数据,始终为分析应用程序提供干净,新鲜的数据。

结论

流处理环境很复杂,但可以通过将各种项目分成框架,API和流数据流系统来简化。开发人员在框架和API中有更多选择,可用于更复杂的用例,而更高级别的工具允许数据工程师和数据科学家为大数据摄取创建管道。

参考

本文重点介绍大局以及所有这些项目如何相互关联。有许多文章深入探讨,为选择一种或多种评估技术提供了基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值