flume+kafka+storm



flume

原理
Flume 是一个可靠的,分布式的,用于采集,聚合,传输海量日志数据的系统。
Flume 的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。
下面是一些概念.
 
Event
数据传输的基本单位.通常是一行记录.
 
Agent
Flume的运行核心,有三个组件:source,channel,sink.
 
Source
用于接收外部源发来的数据
 
Channel
用于缓存Source发来的event,有fileChannel和memoryChannel两种,分别将event缓存于文件和内存中,当事件被sink掉,才会从channel中删除.
 
Sink
消费event,将数据发送给外部存储系统(如hdfs等),或者发送给下一个agent的source.

搭建
--解压即用
tar -zxvf apache-flume- 1.6 . 0 -bin.tar.gz
配置文件
#测试配置
a1.sources = r1
a1.sinks = k1
a1.channels = c1
 
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port =  44444
 
# Describe the sink
a1.sinks.k1.type = logger
 
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity =  1000
a1.channels.c1.transactionCapacity =  100
 
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
 
#启用代理
cd /opt/apache-flume- 1.6 . 0 -bin/
bin/flume-ng agent --conf conf --conf-file /opt/apache-flume- 1.6 . 0 -bin/conf/test.conf --name a1 -Dflume.root.logger=INFO,console
 
#向端口灌数据测试
nc localhost  4444
 
###########################################################################################
 
 
#dapp1到test1
#######test1配置
a1.channels = ch1
a1.sources = avro-source1
a1.sinks = s1
 
a1.sinks.s1.type = logger
 
a1.channels.ch1.type = memory
a1.channels.ch1.capacity =  10000
a1.channels.ch1.transactionCapacity =  100
 
a1.sources.avro-source1.channels = ch1
a1.sources.avro-source1.type = avro
a1.sources.avro-source1.bind =  0.0 . 0.0
a1.sources.avro-source1.port =  41415
 
a1.sources.avro-source1.channel = ch1
a1.sinks.s1.channel = ch1
 
#启动代理
bin/flume-ng agent --conf conf --conf-file /opt/apache-flume- 1.6 . 0 -bin/conf/from_dapp1_test.conf --name a1 -Dflume.root.logger=INFO,console
 
dapp1配置
a1.sources = r1
a1.sinks = k1
a1.channels = c2
 
a1.sources.r1.type = exec
a1.sources.r1.command = tail  -F /home/q/www/dapp/logs/access. 2015 - 12 - 07 .log
a1.sources.r1.shell = /bin/bash -c
a1.sources.r1.channels = c2
a1.sources.r1.restart =  true
a1.sources.r1.logStdErr =  true
 
a1.sources.r1.interceptors = i1 i2
a1.sources.r1.interceptors.i1.type = host
a1.sources.r1.interceptors.i1.hostHeader = hostname
a1.sources.r1.interceptors.i1.useIP =  false
 
a1.sources.r1.interceptors.i2.type = timestamp
 
# Describe the sink
a1.sinks.k1.channel = c2
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = l-pgtest1.s.dev.cn6.yincang.com
a1.sinks.k1.port =  41415
 
a1.channels.c2.type = memory
a1.channels.c2.capacity =  10000
a1.channels.c2.transactionCapacity =  100
 
###启动代理
/export/flume/bin/flume-ng agent --conf conf --conf-file /export/flume/flume-access-to-test1.conf --name a1
 
##################################################
flume to kafka配置
a1.channels = ch1
a1.sources = avro-source1
a1.sinks = s1
 
#a1.sinks.s1.type = logger
a1.sinks.s1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.s1.topic = flume_to_kafka_test
a1.sinks.s1.brokerList =  192.168 . 236.62 : 9092 , 192.168 . 236.63 : 9092 , 192.168 . 236.77 : 9092
a1.sinks.s1.requiredAcks =  1
a1.sinks.s1.batchSize =  20
a1.sinks.s1.channel = c1
 
a1.channels.ch1.type = memory
a1.channels.ch1.capacity =  10000
a1.channels.ch1.transactionCapacity =  100
 
a1.sources.avro-source1.channels = ch1
a1.sources.avro-source1.type = avro
a1.sources.avro-source1.bind =  0.0 . 0.0
a1.sources.avro-source1.port =  41415
 
a1.sources.avro-source1.channel = ch1
a1.sinks.s1.channel = ch1
 
##启动
bin/flume-ng agent --conf conf --conf-file /opt/apache-flume- 1.6 . 0 -bin/conf/from_dapp1_to_kafka.conf --name a1
 
 
 
bin/flume-ng agent --conf conf --conf-file /export/flume1. 6 /conf_a1/skynet_from_kafka.conf --name a4&
 
###启动带http监控参数,通过host:port/metrics url访问得到监控数据
bin/flume-ng agent --conf conf --conf-file /export/flume1. 6 /conf_a1/skynet_from_kafka.conf --name a4 -Dflume.monitoring.type=http -Dflume.monitoring.port= 34545 &

kafka

原理
Apache Kafka 是一个分布式消息发布订阅系统,易于扩展,提供高吞吐量的发布和订阅,支持多订阅者.
如下是一些概念.
 
1 .Broker
一个broker就是一个kafka服务
 
2 .Topic
使用kafka时,我们会将消息分类,一个类别称为一个topic.
一个topic可以有多个分区,每一个分区位于一个broker上.
每个topic的多个partitions 都有一个称为leader的server,用于处理分区的读写请求,
同时有 0 到多个followers ,用于分区备份,如果leader失败,其中任一followers变为leader.
 
3 .Producer
消息生产者,向topics发送数据,可以进行负载均衡,也可以定义分区函数进行分发(通过消息中的关键字,不同关键字的消息分发至不同的分区)
 
4 .Consumer
消费者,订阅消息并处理发布的消息,

整体架构

不同的producer 向kafka集群发送消息

不同的consumer 从kafka订阅消费消息

topic


一个topic可以有多个分区,每一个分区位于一个broker上.每一个分区都是一个顺序的、不可变的消息队列, 并且可以持续的添加.

同一个partition中的数据是有序的,如果要保证整topic中的消息有序,可以一个topic设置一个partition.kafka会保留所有的消息,直到消息过期.

消费者持有的元数据只是一个偏移量,一般情况下,当消费者处理消息的时候,偏移量会线性增加,实际上偏移量由消费者自己控制,可以回到一个先前的位置重新开始处理.

一个消费者的处理不会影响其他消费者对此Topic的处理.

并行发送,并行处理.

zookeeper搭建
用的是kafka自带的zk
1 .config/zookeeper.properties 配置
tickTime= 2000
dataDir=/home/q/data/zookeeper
clientPort= 2182
initLimit= 5
syncLimit= 2
server. 1 = 192.168 . 236.62 : 2889 : 3889
server. 2 = 192.168 . 236.63 : 2889 : 3889
server. 3 = 192.168 . 236.77 : 2889 : 3886
 
2 .在dataDir目录下写一个myid,这个id是zookeeper的主机标示,每个主机id不同echo  1  >myid
3 .逐次启动 3 台机器的zookeeper构成一个集群
  bin/zookeeper-server-start.sh config/zookeeper.properties &
kafka搭建
0 .搭建zookeeper
 
1 .解压
tar -zxvf kafka_2. 11 - 0.8 . 2.2 .tgz
 
2 .配置config/server.properties
-----------------------------------------------------------------------------
# 每个broker的唯一标识,非负整数
broker.id= 1
# broker 服务端口
port= 9092
# broker绑定的服务器地址
host.name= 192.168 . 236.62
# zk 连接配置,防止某个zk宕机,可配置多个,以逗号分隔
zookeeper.connect= 192.168 . 236.62 : 2182 , 192.168 . 236.63 : 2182 , 192.168 . 236.77 : 2182
# kafka存放数据的位置
log.dirs=/home/q/data/kafka-logs
#日志清理策略
log.cleanup.policy=delete
#日志存储的最大时间,超过时间会按日志清理策略清理,消费消息的最长时间
log.retention.minutes=3days
#每个topic 每个分区保存数据的上限,超过则会被清理
log.retention.bytes=- 1
#压缩日志保留时间
log.cleaner.delete.retention.ms=1day
...
--------------------------------------------------------------------------------
其他broker配置类似
 
3 .启动每个kafka服务
bin/kafka-server-start.sh config/server.properties &
4 .关闭kafka
bin/kafka-server-stop.sh config/server.properties &
5 .重启
先执行 3 ,再执行 4
命令
bin/kafka-topics.sh --create --zookeeper  192.168 . 236.62 : 2182  --replication-factor  1  --partitions  3  --topic flume_to_kafka_test
 
bin/kafka-topics.sh --list --zookeeper localhost: 2182
 
bin/kafka-console-producer.sh --broker-list l-pgtest1.vc.dev.cn0.yincang.com: 9092  --topic test
 
bin/kafka-console-consumer.sh --zookeeper localhost: 2182  --topic flume_to_kafka_test --from-beginning
 
bin/kafka-topics.sh --describe --zookeeper localhost: 2182  --topic flume_to_kafka_test
Topic:flume_to_kafka_test    PartitionCount: 3     ReplicationFactor: 1     Configs:
     Topic: flume_to_kafka_test    Partition:  0     Leader:  2     Replicas:  2     Isr:  2
     Topic: flume_to_kafka_test    Partition:  1     Leader:  0     Replicas:  0     Isr:  0
     Topic: flume_to_kafka_test    Partition:  2     Leader:  1     Replicas:  1     Isr:  1
PartitionCount 分区数
ReplicationFactor 副本服务数
Partition 分区编号
Leader 分区读写请求服务编号
replicas 给定partition备份的列表,无论活着与否,是否为leader
Isr 同步的副本,副本列表的子集,当前活着并可以被leader联系到
 
#删除Topic
bin/kafka-topics.sh --delete --zookeeper  192.168 . 236.62 : 2182  --topic flume_to_kafka_test
bin/kafka-topics.sh --delete --zookeeper  192.168 . 236.62 : 2182  --topic flume_to_kafka_test
 
#########调整分区数
bin/kafka-topics.sh --alter --topic qvpas_pv_logs --zookeeper localhost: 2181  --partitions  4
调分区的警告:WARNING: If partitions are increased  for  a topic that has a key, the partition logic or ordering of the messages will be affected
--看效果
--调整前
[xiao.yang @l -pgtest1.vc.dev.cn0 /opt/kafka_2. 11 - 0.8 . 2.2 ]$ bin/kafka-topics.sh --describe --zookeeper localhost: 2182  --topic qvpas_pv_log
Topic:qvpas_pv_log    PartitionCount: 3     ReplicationFactor: 3     Configs:
     Topic: qvpas_pv_log    Partition:  0     Leader:  2     Replicas:  1 , 2 , 3     Isr:  2 , 3 , 1
     Topic: qvpas_pv_log    Partition:  1     Leader:  2     Replicas:  2 , 3 , 1     Isr:  2 , 3 , 1
     Topic: qvpas_pv_log    Partition:  2     Leader:  3     Replicas:  3 , 1 , 2     Isr:  3 , 2 , 1
--调整后
[xiao.yang @l -pgtest1.vc.dev.cn0 /opt/kafka_2. 11 - 0.8 . 2.2 ]$ bin/kafka-topics.sh --describe --topic qvpas_pvogs --zookeeper localhost: 2182
Topic:qvpas_pv_logs    PartitionCount: 4     ReplicationFactor: 1     Configs:
     Topic: qvpas_pv_logs    Partition:  0     Leader:  1     Replicas:  1     Isr:  1
     Topic: qvpas_pv_logs    Partition:  1     Leader:  3     Replicas:  3     Isr:  3
     Topic: qvpas_pv_logs    Partition:  2     Leader:  1     Replicas:  1     Isr:  1
     Topic: qvpas_pv_logs    Partition:  3     Leader:  2     Replicas:  2     Isr:  2
 
#########调整备份因子
--需要配置一段json,如下 alter_qvpas_pv_logs_replicas.json 文件内容:
{ "version" : 1 ,
  "partitions" :[{ "topic" : "qvpas_pv_logs" , "partition" : 0 , "replicas" :[ 1 , 2 ]},
                { "topic" : "qvpas_pv_logs" , "partition" : 1 , "replicas" :[ 1 , 2 ]},
                { "topic" : "qvpas_pv_logs" , "partition" : 2 , "replicas" :[ 1 , 2 ]},
                { "topic" : "qvpas_pv_logs" , "partition" : 3 , "replicas" :[ 1 , 2 ]}]
}
--执行
bin/kafka-reassign-partitions.sh --zookeeper localhost: 2182  --reassignment-json-file alter_qvpas_pv_logs_replicas.json --execute
--看效果
--调整前
[root @l -pgtest1.vc.dev.cn0 /opt/kafka_2. 11 - 0.8 . 2.2 ]# bin/kafka-topics.sh --describe --topic qvpas_pv_logs --zookeeper localhost:2182Topic:qvpas_pv_logs  
  PartitionCount: 4     ReplicationFactor: 1     Configs:
     Topic: qvpas_pv_logs    Partition:  0     Leader:  1     Replicas:  1     Isr:  1
     Topic: qvpas_pv_logs    Partition:  1     Leader:  3     Replicas:  3     Isr:  3
     Topic: qvpas_pv_logs    Partition:  2     Leader:  1     Replicas:  1     Isr:  1
     Topic: qvpas_pv_logs    Partition:  3     Leader:  2     Replicas:  2     Isr:  2
--调整后
[root @l -pgtest1.vc.dev.cn0 /opt/kafka_2. 11 - 0.8 . 2.2 ]# bin/kafka-topics.sh --describe --topic qvpas_pv_logs --zookeeper localhost:2182Topic:qvpas_pv_logs    
  PartitionCount: 4     ReplicationFactor: 2     Configs:
     Topic: qvpas_pv_logs    Partition:  0     Leader:  1     Replicas:  1 , 2     Isr:  1 , 2
     Topic: qvpas_pv_logs    Partition:  1     Leader:  1     Replicas:  1 , 2     Isr:  1 , 2
     Topic: qvpas_pv_logs    Partition:  2     Leader:  1     Replicas:  1 , 2     Isr:  1 , 2
     Topic: qvpas_pv_logs    Partition:  3     Leader:  2     Replicas:  1 , 2     Isr:  2 , 1
 
--调整kafka topic的队列保留时间为 1 天,(一种清理kafka队列的方式,可以将时间设置为1s,则1s之前的消息会全部被清除,然后再把时间调为正常值,如 3 天)
bin/kafka-topics.sh --zookeeper localhost: 2181  --alter --topic data. import .dujia.accesslog --config retention.ms= 86400000
 
 
-- 0.10 之后的
  bin/kafka-configs.sh --zookeeper localhost: 2181  --alter --entity-type topics --entity-name skynet_topic_td_1 --add-config retention.ms= 86400000

storm

原理
Storm是一个分布式的、高容错的实时计算系统。
 
就像Hadoop提供一组通用原语来进行批量处理(batch processing)一样,Storm也提供了一组通用原语来进行实时计算(realtime computation)。
 
storm的集群表面上看和hadoop的集群非常像。但是在Hadoop上面你运行的是MapReduce的Job, 而在Storm上面你运行的是Topology。
一个关键的区别是: 一个MapReduce Job最终会结束, 而一个Topology运永远运行(除非被显式杀掉)。
 
控制节点(master node)
控制节点上面运行一个后台程序: Nimbus, 它的作用类似Hadoop里面的JobTracker。Nimbus负责在集群里面分布代码,分配工作给机器, 并且监控状态。
工作节点(worker node)
每一个工作节点上面运行一个叫做Supervisor的后台程序(类似 TaskTracker)。Supervisor会监听分配给它那台机器的工作,根据需要 启动/关闭工作进程。
 
Nimbus和Supervisor之间的所有协调工作都是通过一个Zookeeper集群来完成。
 
Woker
Worker是Spout/Bolt中运行具体处理逻辑的进程。
Executor
Executor称为物理线程,每个Worker可以包含多个Executor。
Task
Task是具体的处理逻辑对象,默认情况下,执行器和任务对应,即一个执行器对应一个任务。

搭建
1 .解压
tar -zxvf apache-storm- 0.10 . 0 .tar.gz
2 .配置 conf/storm.yaml
#zk集群地址配置
  storm.zookeeper.servers:
      "192.168.236.62"
      "192.168.236.63"
      "192.168.236.77"
#zk端口号,如果是默认的 2181 ,无须配置
  storm.zookeeper.port:  2182
#storm使用的本地文件系统目录,用于Nimbus和Supervisor进程存储少量状态,如jars,conf等
  storm.local.dir:  "/home/q/data/storm"
#Storm集群Nimbus机器地址,各个Supervisor工作节点需要知道哪个机器是Nimbus,以便下载Topologies的jars、confs等文件
  nimbus.host:  "192.168.236.62"
 
#对于每个Supervisor工作节点,需要配置该工作节点可以运行的worker数量。每个worker占用一个单独的端口用于接收消息
  supervisor.slots.ports:
     6700
     6701
     6702
     6703
 
3 .启动Nimbus后台程序,在Storm主控节点nimbus上运行如下命令
bin/storm nimbus&
4 .启动supervisor,在各个工作节点上运行如下命令
bin/storm supervisor&
5 .启动storm ui,在nimbus节点上运行
   启动后可以通过http: //{nimbus host}:8080观察集群的worker资源使用情况、Topologies的运行状态等信息
  bin/storm ui&
注意:Storm UI必须和Storm Nimbus部署在同一台机器上,否则UI无法正常工作.
Topology

Topology是storm的核心,我们通过编写和部署Topology来处理数据.
下面是一些概念.
Stream
Storm中的核心抽象概念就是流。流是无边界的元组(tuples)的序列。
通过对stream中tuple序列中每个字段命名来定义stream。
storm提供一些原语来分布式地、可靠地把一个stream传输进一个新的stream。(spout和bolt)
Spout
spout的流的源头。
比如一个spout可能从kafka的topic读取消息并且把这些消息发射成一个流。
通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,之后发送到Stream中。
Spout是一个主动的角色,在接口内部有个nextTuple函数,Storm框架会不停的调用该函数。
Bolt
bolt可以接收任意多个输入stream,作一些处理,有些bolt可能还会发射一些新的stream。
一些复杂的流转换,需要多个步骤,从而也就需要多个bolt。
Bolt可以做任何事情: 运行函数,过滤tuple,做一些聚合,做一些合并以及访问数据库等。
Bolt是一个被动的角色,其接口中有一个execute(Tuple input)方法,在接收到消息之后会调用此函数,我们可以在此方法中执行自己的处理逻辑。
StreamGroups
一个Stream应如何分配数据给Bolt上面的Task. http: //wiki.corp.yincang.com/display/~xiao.yang/stream+groups
Topology
spout和bolt所组成一个网络会被打包成topology, topology是storm里面最高一级的抽象(类似 Job), 我们可以把topology提交给storm的集群来运行.
使用
##集群部署topology
bin/storm jar /home/xiao.yang/storm_test.jar kafka.MyTest l-pgtest1.s.dev.cn6.yincang.com
##查看topology
bin/storm list
##删除topology
bin/storm kill MyTest
##激活topology
bin/storm active MyTest
##不激活
bin/storm deactive MyTest

猜你喜欢

转载自blog.csdn.net/caisini_vc/article/details/78680425