大数据数据流组件选择
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.大数据数据流的架构和组件介绍
1>.什么是数据流
所谓数据流(流数据),是一组顺序、大量、快速、连续到达的数据序列,一般情况下,数据流可被视为一个随时间延续而无限增长的动态数据集合。应用于网络监控、传感器网络、航空航天、气象测控和金融服务等领域。
流数据具有四个特点: (1)数据实时到达; (2)数据到达次序独立,不受应用系统所控制; (3)数据规模宏大且不能预知其最大值; (4)数据一经处理,除非特意保存,否则不能被再次取出处理,或者再次提取数据代价昂贵。
2>.大数据架构:Lambda
Lambda Architecture(简称:LA)最早是Twitter工程师Nathan Marz提出来的,它是一种大数据软件设计设计架构,其目的是指导用户充分利用批处理和流式计算技术各自的优点实现一个复杂的大数据处理系统。通过结合这两类计算技术,LA可以在延迟,吞吐量和容错之间找到平衡点。如下图所示,LA主要思想是将数据处理流分解成三层:批处理层,流式处理层和服务层。
一.批处理层
它的主要思想是利用分布式处理计算,以批处理为单位处理数据,并产生一个经预算产生的只读数据视图。该层将数据流看成只读的,仅支持追加操作的超大数据集。它可以一次性处理大量数据,引入复杂的计算逻辑(比如机器学习中的模型迭代计算,历史库的匹配等),其优点是吞吐率高,缺点是数据处理延迟高,即从数据产生到最终被处理完成,整个过程用时较长,通常是分钟或小时级别。
二.流式处理层
为了降低批处理层带来的高延迟,LA又引入了流式处理层,该层采用流式计算技术,大大降低了数据处理延迟(通常是毫秒或秒级别),其优点是数据处理延迟低,缺点是无法进行复杂的逻辑计算,得到的结果往往是近似解。
三.服务层
批处理层和流式处理层可以看结合在一起,这样既保证数据延迟低,也能完成复杂的逻辑计算(只能保证最终一致性)。为了整合两层的计算结果,LA进一步引入服务层,它对外提供了统一的访问接口以方便用户使用。
四.LA应用案例
一个经典的LA应用案例是推荐系统。在互联网行业,推荐系统被应用在各个领域,包括电子商务,视频,新闻等。推荐系统等设计目的是根据用户的兴趣特点和购买行为,向用户推荐感兴趣的信息和商品。推荐系统是建立在海量数据挖掘的基础上的一种高级商务智能平台,以帮助商家为其顾客购物提供完全个性化的决策支持和信息服务。推荐系统最核心的模块是推荐算法,推荐算法通常会根据用户的兴趣特点和历史行为数据的构建推荐模型,以预测用户可能感兴趣的信息和商品,进而推荐给用户。
如下图所示,它为一个典型的推荐系统数据流水线架构。在该架构中,数据统一流入Kafka,之后按照不同时间粒度导入批处理和流式处理两个系统中。批处理层拥有所有历史数据(通常保存到HDFS/HBase中),通常用以实时推荐模型,它以当前数据(比如最近一小时数据)和历史数据为输入,通过特征工程,模型构建(通常是迭代算法,使用MapReduce/Spark实现)及模型评估等计算环境后,最终获得最优模型并将产生的推荐结果存储(比如Redis)起来,整个过程延迟较大(分钟甚至小时级别);为了解决推荐系统中的冷启动问题(新用户推荐问题),往往会引入流处理层:他会试试手机用户的行为,并基于这些行为数据通过简单推荐算法(通常使用Storm/Spark Streaming实现)快速产生推荐结果并存储起来。为了便于其他系统获取推荐结果,推荐系统往往通过服务层对外提供访问接口,比如网站后台在渲染某个访问页面时,可能从广告系统,推荐系统以及内容存储系统中获取对应的结果,并返回给客户端。
3>.批处理和流处理的比较
批处理一般用于计算从所含的所有数据得到的结果,并实现对大数据集的深入分析。相反,流处理则需要摄取一个数据序列,增量式更新指标、报告和汇总统计结果,以响应每个到达的数据记录。这种处理方法更适合实时监控和响应调用。
接下来我们从下面几个维度来分析一下批处理和流处理的区别:
(1)数据范围
批处理对数据集中的所有或大部分数据进行查询或处理。流处理对滚动时间窗口内的数据或仅对最近的数据记录进行查询或处理。
(2)数据大小
批处理针对的是大批量数据(如GB或者PB级别)。流处理针对的是单条记录或包含几条记录的微批数据(如KB或者MB)。
(3)性能
批处理所需的时间一般是几分钟至几小时的延迟。流处理所需的时间几毫秒至几秒的延迟。
(4)场景
批处理使用的场景分析起来很复杂。流处理只需要简单的响应调用,聚合和滚动指标。
很多企业结合使用两种方法,从而构建一种混合模式,并同时维持实时处理层和批处理层。
4>.大数据数据流典型架构
数据采集:
负责从各种数据源实时采集数据,在采集时,可能对数据做简单的ETL或格式转换,以便于下游系统使用。例如:Apache Flume
数据接入:
由于数据采集的速度和数据处理的速度不一定同步,通常会引入一个消息中间件来作为缓冲。例如:Apache Kafka
流式计算:
对流数据进行实时的处理和分析。例如:Apache Storm
批处理计算:
对大量数据进行离线处理分析,例如Apache MapReduce
数据存储:
对处理后的结果数据进行保存,以便下游系统进行查询或再次处理。例如:Apache HBase
二.数据摄取组件
1>.Apache Flume
一.什么是Flume Flume是一个分布式、可靠、高可用的海量日志聚合系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接收方。 官方地址:http://flume.apache.org/。 二.Flume特性 (1)高可靠性 Flume提供了end to end的数据可靠性机制 (2)易于扩展 Agent为分布式架构,可水平扩展 (3)易于恢复 Channel中保存了与数据源有关的事件,用于失败时的恢复 (4)功能丰富 Flume内置了多种组件,包括不同数据源和不同存储方式 三.Flume常用组件 (1)Source: 数据源,简单的说就是agent获取数据的入口。 (2)Channel: 管道,数据流通和存储的通道。一个source必须至少和一个channel关联。 (3)Sink: 用来接收channel传输的数据并将之传送到指定的地方,成功后从channel中删除。
2>.StreamSets
一.什么是StreamSets 在StreamSets推出前,Flume,Scribe等少数开源工具是流式采集日志仅有的解决方案,Flume的应用案例最多。 二.StreamSets优缺点 StreamSets是Flume的良好替代者,优势在于: (1)功能上 有管理界面,可以单个流启停,统计报表丰富,可以预览数据。因为其源和目标的支持特别丰富,还可以对数据进行不落地处理,因此还可以替代传统ETL软件的一部分功能 (2)源端支持 其多出HDFS、JDBC、Redis、FTP等几种重要的源。 (3)目标端支持 其多出JDBC、Redis、RabbitMQ、Flume等几种重要的目标。 (4)数据处理上 StreamSets有多种字段处理组件,Flume仅有过滤功能。有强大的格式处理能力,且支持源端压缩格式。还能使用JavaScript和Jython等自定义处理逻辑。 StreamSets缺点: 资源占用率比Flume略高,但因为和Flume一样可以分布式部署,问题不大。
3>.Fluentd
一.什么是Fluentd Fluentd是另一个开源的数据收集框架。Fluentd使用 C/Ruby开发,使用JSON文件来统一日志数据。它的可插拔架构,支持各种不同种类和格式的数据源和数据输出。最后它也同时提供了高可靠和很好的扩展性。 官网地址:https://docs.fluentd.org/ 二.Fluentd组件 Fluentd的Input/Buffer/Output非常类似于Flume的 Source/Channel/Sink。
Input:
负责接收数据或者主动抓取数据。支持 syslog,http,file tail等。
Buffer:
负责数据获取的性能和可靠性,也有文件或内存等不同类型的Buffer可以配置。
Output:
负责输出数据到目的地例如文件,AWS S3或 者其它的Fluentd
4>.Logstash
Logstash是著名的开源数据栈ELK (ElasticSearch, Logstash, Kibana) 中的那个L。用JRuby开发,运行时依赖JVM。 Logstash本身功能比较单调。几乎在大部分的情况下ELK作为一个栈是被同时使用的。当你的数据系统需要采集分析日志时,Logstash是首选。否则不建议用。如果只是单纯的日志采集也不推荐使用Logstash,因为它占用资源较大,官方推出的Filebeat(是Elastic Stack推出的Beats实现的一种,官网链接:https://www.elastic.co/cn/products/beats)可以轻松实现日志收集。 GitHub地址:https://github.com/elastic/logstash。 官网地址:https://www.elastic.co/cn/products/logstash。
5>.Scribe日志收集工具
Scribe是facebook开源的日志收集系统,在facebook内部已经得到大量的应用。它能够从各种日志源上收集日志,存储到一个*存储系统(可以是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。它为日志的“分布式收集,统一处理”提供了一个可扩展的,高容错的方案。当*存储系统的网络或者机器出现故障时,scribe会将日志转存到本地或者另一个位置,当*存储系统恢复后,scribe会将转存的日志重新传输给*存储系统。 GitHub地址:https://github.com/facebookarchive/scribe Scribe资料相对较少,网上的案例很少,大多都是理论派偏多,因此推荐大家使用开源社区比较火热的日志收集工具。如Flume,FileBeats之类的。
6>.chukwa
官方关于Chukwa是这样介绍的: “Apache Chukwa is an open source data collection system for monitoring large distributed systems. Apache Chukwa is built on top of the Hadoop Distributed File System (HDFS) and Map/Reduce framework and inherits Hadoop’s scalability and robustness. Apache Chukwa also includes a flexible and powerful toolkit for displaying, monitoring and analyzing results to make the best use of the collected data.” 大致翻译如下: Apache Chukwa是一个用于监控大型分布式系统的开源数据收集系统。Apache Chukwa构建于Hadoop分布式文件系统(HDFS)和Map / Reduce框架之上,并继承了Hadoop的可扩展性和健壮性。Apache Chukwa还包括一个灵活而强大的工具包,用于显示,监控和分析结果,以充分利用收集的数据。 官方地址:http://chukwa.apache.org/ 我们在官网可以看到Chukwa最近一次发布时间是2016-10-08,很显然,该项目的代码都已经多年未更新了,在国内的案例也非常非常少,不推荐使 用。
三.消息队列组件
1>.Apache Kafka
一.什么是Kafka
Kafka是一个高吞吐、分布式、基于发布订阅的消息系统,利用Kafka可在廉价PC server上搭建起大规模的消息系统。 官网地址:http://kafka.apache.org/。
二.Kafka特性: (1)使用zero-copy技术,数据在磁盘上存取代价为O(1)。 (2)高吞吐率,在万兆网下,单点写入吞吐率高于300MB/s,这取决于它顺序写入磁盘,其效率紧追随机写入内存的速度。 (3)显式分布式,即所有的producer、broker和consumer都可为分布式的。 (4)消费者的high level API易于使用(low level API则相当坑)
三.Kafka核心概念: (1)Broker:
Kafka集群包含一个或多个服务实例,这种服务实例被称为broker。 (2)Topic:
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。 (3)Producer:
负责发布(写入)消息到Kafka Broker。 (4)Consumer:
消息消费者,向Kafka Broker订阅(读取)消息的客户端。
2>.RabbitMQ
一.什么是RabbitMQ RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实 现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订 阅)、可靠性、安全。 官网地址:https://www.rabbitmq.com/ 二.RabbitMQ的使用场景 AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。 因此,RabbitMQ比较适合作为业务系统的消息队列使用,尤其像金融、通信等领域。在大数据领域,通常还是将吞吐量作为首要考虑因素,Kafka比RabbitMQ更适合。
3>.RocketMQ
一.什么是RocketMQ 如上图所示(原链接:http://rocketmq.apache.org/docs/rmq-arc/),Apache RocketMQ是一个分布式消息传递和流媒体平台,具有低延迟,高性能和可靠性,万亿级容量和灵活的可扩展性。它由四部分组成:名称服务器,代理,生产者和消费者。它们中的每一个都可以水平扩展而没有单一的故障点。 官网地址:http://rocketmq.apache.org/。 二.RocketMQ的使用场景 RocketMQ可以看作在Kafka的顶层设计上增加了一些电商业务场景支持的 产物,但在性能、吞吐量上相比Kafka并没有优势,且与其他大数据组件 的集成不好。如果你不需要如分布式事务、定时消息等这些额外特性,则没有必要使用RocketMQ。
四.其他组件
1>.Zookeeper
一.什么是zookeeper
ZooKeeper是一个分布式应用程序协调服务,是Google的Chubby的一个开源实现
二.Znode
ZooKeeper名字空间的每个节点都是以这样一个路径来标识的。这样的节点统一称为znode。 持久的/临时的 无序的/有序的
三.Zookeeper角色 Leader:接收消息,并编号 Follower:同步消息,参与Leader选举 Observer:同步消息,但不参与Leader选举
三.ZAB
ZooKeeper原子广播协议,是其数据一致性算法,与Paxos有着明显区别(注意ZooKeeper并不是强一致的)
2>.Storm
一.什么是Storm
Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架,具有较高的吞吐率和较低的延迟。Storm是无状态的,它通过Apache Zookeeper管理分布式环境和集群状态。部署和开发Storm任务比较简单,您可以并行地对实时数据执行各种操作。
由于Storm是用Clojure语言开发的,这种语言入门门槛较高,因此想从源码层学习Storm有较大的难度。阿里使用Java重写了Strom并做了一些改进,称JStorm,但目前由于阿里实时计算转向Flink,JStorm也已不维护了。
官方地址:http://storm.apache.org/
二.Storm核心概念
(1)Tuple
是Storm中的主要数据结构。它是有序元素的列表。默认情况下,Tuple支持所有数据类型。通常,它被建模为一组逗号分隔的值,并传递到Storm集群。
(2)Stream
是Tuple的无序序列。
(4)Spouts
流的源。通常Storm从原始数据源(如Twritter Streaming API,Apache Kafa队列等)接受输入数据。你也可以编写spouts以从数据源读取数据。“ISpout”是实现的核心接口,一些特定的接口是IRichSpout,BaseRichSpout,KafkaSpout等。
(5)Bolts
是逻辑处理单元。Spouts将数据从传递到Bolts,经过处理产生新的输入流。Bolts可以执行过滤,聚合,连接,与数据源和数据库交互等操作。Bolts接受数据并发射到一个或多个Bolts。“IBolt”是实现Bolts的核心接口。一些常见的接口是IRichBolt,IBasicBolt等。
(6)Topplogy
也称拓扑,Spouts和Bolts连接在一起,形成拓扑结构。实时应用程序逻辑在拓扑中指定。简单地说,拓扑是有向图,其中顶点是计算,边缘是数据流。拓扑从Spouts开始,Spouts将数据发射到一个或多个Bolts。Bolt表示拓扑中具有最小处理逻辑的节点,并且Bolts的输出可以发射到另一个Bolts作为输入。Storm保持拓扑始终运行,直到手动终止拓扑。
(7)Stream groupings
流分组。数据流从Spouts流到Bolts,或从一个Bolt流到另一个Bolt。流分组控制元组在拓扑中的路由方式,并帮助我们了解拓扑中的元组流。在当前版本中有8种流分组(另外也可以自定义):
Shuffle grouping(随机)
Fields grouping(按字段分组)
Partial Key grouping(带负载均衡的按字段分组)
All grouping(复制给所有Bolts的Tasks)
Global grouping(传递一个Bolt的Tasks)
None grouping(不关心如果分组)
Direct grouping(由tuple的生成者决定发送给哪个Task)
Local or shuffle grouping(若目标Bolt有多个worker进程,会发送给这些进程的Tasks;否则执行Shuffle grouping)
3>.Spark
一.Spark的产生背景 传统式的Hadoop缺点主要有以下两点: 第一.迭代式计算效率低(一个MapReduce依赖上一个MapReduce的结果); 第二.交互式数据挖掘效率低(运行一个HIVE语句效率是极低的,第一天输入的SQL可能等到第二天才能拿到结果) Spark优化了Hadoop的两个缺点,可以将多个job合并成一个job来执行,也可以将于磁盘的交互迁移到内存进行交互,从而提升了工作效率。 二.什么是Spark: Apache Spark是一种快速通用的集群计算系统。它提供Java,Scala,Python和R中的高级API,以及支持通用执行图的优化引擎。它还支持一组丰富的更高级别的工具,包括星火SQL用于SQL和结构化数据的处理,MLlib机器学习,GraphX用于图形处理和星火流。 Spark设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。为了实现这样的要求,同时获得最大灵活性,Spark支持在各种集群管理器(cluster manager)上运行,包括Hadoop YARN、Apache Mesos,以及Spark自带的一个简易调度器,叫作独立调度器。 Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于凤巢、大搜索、直达号、百度大数据等业务;阿里利用GraphX构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;腾讯Spark集群达到8000台的规模,是当前已知的世界上最大的Spark集群。 三.Spark内置组件 (1)Spark Core: 实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统 交互等模块。Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简称RDD)的 API定义。 (2)Spark SQL: 是Spark用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比 如 Hive 表、Parquet 以及 JSON 等。 (3)Spark Streaming: 是Spark提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。 (4)Spark MLlib: 提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。 四.Spark的安装模式 如上图所示,Spark的安装模式可分为:Local、Local-Cluster、Standalone、Yarn、Mesos Master节点主要运行集群管理器的中心化部分,所承载的作用是分配Application到Worker节点,维护Worker节点,Driver,Application的状态。Worker节点负责具体的业务运行。
4>.Flink
Apache Flink是一个开源的分布式,高性能,高可用,准确的流处理框架。主要由Java代码实现。支持实时流(stream)处理和批(batch)处理,批数据只是流数据的一个极限特例。Flink原生支持了迭代计算,内存管理和程序优化。 官网地址:https://flink.apache.org/