Storm学习总结(flume+kafka+storm)
storm是实时流计算用到的一门技术。在学习storm的时候,首先学习了flume和kafka,所以在这里放一块总结一下。flume的核心是把数据从数据源收集过来,然后送到目的地。kafka是一种分布式的消息系统。storm集群可以实时处理数据源传入的数据。
flume
flume为了实现数据的传输,设计了三个部分,source, channel, sink。
source
source负责接收外部传来的数据,并传入channel中,可以通过配置source使其接收不同类型的数据(如http source, exec source, Avro source, Syslog source,自定义source等等),也可以为它配置拦截器,来对数据源进行过滤。
channel
channel的功能是临时存储source传来的数据,再发给sink端。常用的有memory channel和file channel。各有速度和可靠性方面的优缺点。
sink
sink是将传来的数据按照指定的方式写入。常用的类型有HDFS sink, Avro sink, kafka sink等。
配置文件
所有的source, channel, sink配置全都在conf文件夹下进行配置,然后在命令行直接运行该agent即可。要注意,如果使用TCP, UDP这几种source的话,先开启该代理,然后往指定的ip地址和端口下写入内容。使用Avro source创建多层拓扑时也一样。
kafka
kafka是一种分布式的,基于发布/订阅的消息系统。它包括生产者和消费者两部分。kafka集群中的每台机器都是一个broker。
使用kafka的必要性:
- 如果有些时候访问量激增, 无疑会对后续的处理程序带来极大的压力,甚至有可能丢失数据,所以,使用消息队列,可以作为缓冲,保存下数据供以后的程序处理。
- 消息队列还提供了异步处理机制,用户可以在想用的时候再从队列中调出数据,然后处理。
- 消息系统也可以作为一个接口,降低耦合性。
kafka的工作原理:
- 一个topic可以认为是一类消息,首先创建出一个topic,指定分区数目。
- 每个topic将被分成多个partition,每个partition在存储层面是append log文件。任何发布到此partition的消息都会被追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量), offset为一个long型的数字,它唯一标记一条消息。
- 然后生产者往该topic下写入数据
- 消费者可以消费该topic下的数据。
- 其中,每个消费者都存在于一个group中,发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费。
storm
storm是用来进行流计算的工具。它是一个拓扑结构,定义了数据的源头spout和处理方法bolt。storm集群上,master node上运行着nimbus,work node上运行着supervisor。
使用storm时需要构建一个拓扑,定义spout,bolt,这样就指定了数据的流动顺序和处理方式。
- storm的并行度:
- 每个supervisor上运行着若干个worker进程(运行多少个取决于最开始安装时的配置)。
- 每个work进程中运行着若干executor线程(线程的数量在代码中指定)。
- 每个executor线程中运行着若干个相同的task(spout或者bolt)。
- DRPC
- istributed RPC是由一个” DPRC服务器”协调(storm自带了一个实现)。
DRPC服务器协调:
① 接收一个RPC请求
② 发送请求到storm topology
③ 从storm topology接收结果
④ 把结果发回给等待的客户端
- istributed RPC是由一个” DPRC服务器”协调(storm自带了一个实现)。
trident
- Trident是在storm基础上,一个以实时计算为目标的高度抽象。
- 它在提供处理大吞吐量数据能力的同时,也提供了低延时分布式查询和有状态流式处理的能力。
- Tident提供了 joins, aggregations, grouping, functions, 以及 filters等能力。
storm窗口机制
- 窗口分为滑动窗口和滚动窗口,需要设置窗口大小和滑动间隔即可。