大数据流处理平台的技术选型参考
选择太多,是一件好事情,不过也容易乱花渐欲迷人眼。倘若每个平台(技术)都去动手操练一下,似乎又太耗时间。通过阅读一些文档,可以帮我们快速做一次筛选。在将选择范围进一步缩小后,接下来就可以结合自己的应用场景去深入Spike,做深度的甄别,这是我做技术选型的一个方法。
技术没有最好,只有最适用。在做技术选型时,需要选择适合需求、适合项目类型、适合团队的技术。这是实用主义的判断,而非理想主义的追捧。若是在实用的技术选型中,再能点燃一些些技术上的情怀,那就perfect了!
属性矩阵(Attributes Matrix)
我在《Apache下流处理项目巡览》一文中翻译了Janakiram的这篇文章,介绍了Apache基金会下最主流的流处理项目。巧的是,我在InfoQ上又发现了Ian Hellstrom的文章,他用一张图给出了非常棒的总结。
为了更好地阅读,我将这张图的内容转成一张矩阵表。由于Ian的文章是2016年撰写的,我对其内容做了适度更新。
注:由于微信排版关系,若要查看技术选型的矩阵表,请点击文末的“阅读原文”查看详情。
数据流模型
在进行流数据处理时,必然需要消费上游的数据源,并在处理数据后输出到指定的存储,以待之后的数据分析。站在流数据的角度,无论其对数据的抽象是什么,都可以视为是对消息的生产与消费。这个过程是一个数据流(data flow),那么负责参与其中的设计元素就可以称之为是“数据流模型(Data flow model)”。
不同流处理平台的数据流模型有自己的抽象定义,也提供了内建的支持。我针对Flume、Flink、Storm、Apex以及NiFi的数据流模型作了一个简单的总结。
Flume
Flume的数据流模型是在Agent中由Source、Channel与Sink组成。
内建的Source支持:
- Avro
- Thrift
- JMS
- Taildir
- Exec
- Spooling Directory
- Kafka
- NetCat
- Sequence Generator
- Syslog
- HTTP
内建的Sink支持:
- HDFS
- Hive
- Logger
- Avro
- Thrift
- IRC
- File Roll
- HBase
- Solr
- Elasticsearch
- Kite Dataset
- Kafka
- HTTP
Flume还支持自定义Source、Sink与Channel。
Flink
Flink将数据流模型抽象为Connector。Connector将Source与Sink连接起来,一些特殊的connector则只有Source或Sink。Flink定义的connector包括:
- Kafka(支持Source/Sink)
- Elasticsearch(仅为Sink)
- HDFS(仅为Sink)
- RabbitMQ(支持Source/Sink)
- Amazon Kinesis Streams(支持Source/Sink)
- Twitter(仅为Source)
- NiFi(支持Sink/Source)
- Cassandra(仅为Sink)
- Redis、Flume和ActiveMQ(仅为Sink)
Flink也支持用户自定义Connector。
Storm
Storm对数据流模型的抽象则形象地定义为Spout和Bolt。为了支持其他数据源的读取,并将数据存储到指定位置,Storm提供了与诸多外部系统的集成,并针对这些外部系统去定义对应的Spout与Bolt。
Storm集成的外部系统包括:
- Kafka:通过
BrokerHosts
的ZKHosts
支持Spout - HBase:提供
HBaseBolt
- HDFS:提供
HdfsBolt
- Hive:提供
HiveBolt
- Solr:提供
SolrUpdateBolt
与对应的Mapper - Canssandra:提供
CassandraWriterBolt
- JDBC:提供
JdbcInsertBolt
与JdbcLookupBolt
等 - JMS:提供JMS Spout与JMS Bolt
- Redis:提供
RedisLookupBolt
、RedisStoreBolt
与RedisFilterBolt
等 - Event Hubs:提供了Event Hubs Spout
- Elasticsearch:提供
EsIndexBolt
、EsPercolateBolt
与EsLookupBolt
等 - MQTT:MQTT主要用于物联网应用的轻量级发布/订阅协议,提供了对应的Spout
- MongoDB:提供了
MongoInsertBolt
、MongoUpdateBolt
- OpenTSDB
- Kinesis
- Druid
- Kestrel
Storm和Storm Trident都支持用户自定义Spout和Bolt。
Apex
Apex将数据流模型称之为Operators,并将其分离出来,放到单独的Apex Malhar中。对于Source,它将其称之为Input Operators,对于Sink,则称为Output Operators,而Comput Operators则负责对流数据的处理。
Apex Malhar支持的Input/Output Operators包括:
- 文件系统:支持存储到HDFS、S3,也可以存储到NFS和本地文件系统
- 关系型数据库:支持Oracle、MySQL、Sqlite等
- NoSQL数据库:支持HBase、Cassandra、Accumulo、Aerospike、MongoDB和CouchDB
- 消息系统:支持对Kafka、JMS、ZeroMQ和RabbitMQ消息的读写
- 通知系统:支持通过SMTP发送通知
- 内存数据库和缓存:支持Memcached和Redis
- 社交媒体:支持Twitter
- 协议:支持HTTP、RSS、Socket、WebSocket、FTP和MQTT
毫无疑问,Apex也支持用户自定义Operator。除了可以用Java编写之外,还可以使用JavaScript、Python、R和Ruby。
NiFi
NiFi对流模型的主要抽象为Processor,并且提供了非常丰富的数据源与数据目标的支持。
常用的数据采集方法包括:
- GetFile
- GetFtp
- GetSFtp
- GetJMSQueue
- GetJMSTopic
- GetHTTP
- ListenHTTP
- ListenUDP
- GetHDFS
- ListHDFS / FetchHDFS
- FetchS3Objet
- GetKafka
- GetMongo
- GetTwitter
发送数据的方法包括:
- PutEmail
- PutFile
- PutFTP
- putSFTP
- PutJMS
- PutSQL
- PutKafka
- PutMongo
Nifi也支持用户自定义Processor,例如通过继承NiFi定义的AbstractProcessor
类。自定义的Processor可以和内建的Processor一样添加到NiFi定义Flow的GUI上,并对其进行配置。
- ssh 免密码设置失败原因总结
- C++服务器开发之基于对象的编程风格
- The jQuery UI CSS Framework
- hadoop:将WordCount打包成独立运行的jar包
- Hadoop: MapReduce2多个job串行处理
- UE4新手引导之下载和安装虚幻4游戏引擎
- mac 下卸载mysql的方法
- ZooKeeper 笔记(1) 安装部署及hello world
- mybatis 使用经验小结
- ZooKeeper 笔记(2) 监听数据变化
- 使用C# 和Consul进行分布式系统协调
- 设置 java -jar 的进程显示名称
- 爱浪携手豆瓣内容、腾讯共同发布AI语音耳机
- Win.ini和注册表的读取写入
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法