flume
原理
Flume
是一个可靠的,分布式的,用于采集,聚合,传输海量日志数据的系统。Flume
的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。下面是一些概念.Event数据传输的基本单位.通常是一行记录.AgentFlume的运行核心,有三个组件: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
= r1a1.sinks
= k1a1.channels
= c1#
Describe/configure the sourcea1.sources.r1.type
= netcata1.sources.r1.bind
= localhosta1.sources.r1.port
= 44444#
Describe the sinka1.sinks.k1.type
= logger#
Use a channel which buffers events in memorya1.channels.c1.type
= memorya1.channels.c1.capacity
= 1000a1.channels.c1.transactionCapacity
= 100#
Bind the source and sink to the channela1.sources.r1.channels
= c1a1.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
= ch1a1.sources
= avro-source1a1.sinks
= s1a1.sinks.s1.type
= loggera1.channels.ch1.type
= memorya1.channels.ch1.capacity
= 10000a1.channels.ch1.transactionCapacity
= 100a1.sources.avro-source1.channels
= ch1a1.sources.avro-source1.type
= avroa1.sources.avro-source1.bind
= 0.0.0.0a1.sources.avro-source1.port
= 41415a1.sources.avro-source1.channel
= ch1a1.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,consoledapp1配置a1.sources
= r1a1.sinks
= k1a1.channels
= c2a1.sources.r1.type
= execa1.sources.r1.command
= tail -F /home/q/www/dapp/logs/access.2015-12-07.loga1.sources.r1.shell
= /bin/bash -ca1.sources.r1.channels
= c2a1.sources.r1.restart
= truea1.sources.r1.logStdErr
= truea1.sources.r1.interceptors
= i1 i2a1.sources.r1.interceptors.i1.type
= hosta1.sources.r1.interceptors.i1.hostHeader
= hostnamea1.sources.r1.interceptors.i1.useIP
= falsea1.sources.r1.interceptors.i2.type
= timestamp#
Describe the sinka1.sinks.k1.channel
= c2a1.sinks.k1.type
= avroa1.sinks.k1.hostname
= l-pgtest1.s.dev.cn6.yincang.coma1.sinks.k1.port
= 41415a1.channels.c2.type
= memorya1.channels.c2.capacity
= 10000a1.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
= ch1a1.sources
= avro-source1a1.sinks
= s1#a1.sinks.s1.type
= loggera1.sinks.s1.type
= org.apache.flume.sink.kafka.KafkaSinka1.sinks.s1.topic
= flume_to_kafka_testa1.sinks.s1.brokerList
= 192.168.236.62:9092,192.168.236.63:9092,192.168.236.77:9092a1.sinks.s1.requiredAcks
= 1a1.sinks.s1.batchSize
= 20a1.sinks.s1.channel
= c1a1.channels.ch1.type
= memorya1.channels.ch1.capacity
= 10000a1.channels.ch1.transactionCapacity
= 100a1.sources.avro-source1.channels
= ch1a1.sources.avro-source1.type
= avroa1.sources.avro-source1.bind
= 0.0.0.0a1.sources.avro-source1.port
= 41415a1.sources.avro-source1.channel
= ch1a1.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 a1bin/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自带的zk1.config/zookeeper.properties
配置tickTime=2000dataDir=/home/q/data/zookeeperclientPort=2182initLimit=5syncLimit=2server.1=192.168.236.62:2889:3889server.2=192.168.236.63:2889:3889server.3=192.168.236.77:2889:38862.在dataDir目录下写一个myid,这个id是zookeeper的主机标示,每个主机id不同echo 1 >myid3.逐次启动3台机器的zookeeper构成一个集群 bin/zookeeper-server-start.sh
config/zookeeper.properties & |
kafka搭建
0.搭建zookeeper1.解压tar
-zxvf kafka_2.11-0.8.2.2.tgz2.配置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.关闭kafkabin/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_testbin/kafka-topics.sh
--list --zookeeper localhost:2182bin/kafka-console-producer.sh
--broker-list l-pgtest1.vc.dev.cn0.yincang.com:9092 --topic
testbin/kafka-console-consumer.sh
--zookeeper localhost:2182 --topic
flume_to_kafka_test --from-beginningbin/kafka-topics.sh
--describe --zookeeper localhost:2182 --topic
flume_to_kafka_testTopic: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: 1PartitionCount
分区数ReplicationFactor
副本服务数Partition
分区编号Leader
分区读写请求服务编号replicas
给定partition备份的列表,无论活着与否,是否为leaderIsr
同步的副本,副本列表的子集,当前活着并可以被leader联系到#删除Topicbin/kafka-topics.sh
--delete --zookeeper 192.168.236.62:2182 --topic
flume_to_kafka_testbin/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_logTopic: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: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#########调整备份因子--需要配置一段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集群来完成。WokerWorker是Spout/Bolt中运行具体处理逻辑的进程。ExecutorExecutor称为物理线程,每个Worker可以包含多个Executor。TaskTask是具体的处理逻辑对象,默认情况下,执行器和任务对应,即一个执行器对应一个任务。 |

搭建
1.解压tar
-zxvf apache-storm-0.10.0.tar.gz2.配置
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 - 67033.启动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来处理数据.下面是一些概念.StreamStorm中的核心抽象概念就是流。流是无边界的元组(tuples)的序列。通过对stream中tuple序列中每个字段命名来定义stream。storm提供一些原语来分布式地、可靠地把一个stream传输进一个新的stream。(spout和bolt)Spoutspout的流的源头。比如一个spout可能从kafka的topic读取消息并且把这些消息发射成一个流。通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,之后发送到Stream中。Spout是一个主动的角色,在接口内部有个nextTuple函数,Storm框架会不停的调用该函数。Boltbolt可以接收任意多个输入stream,作一些处理,有些bolt可能还会发射一些新的stream。一些复杂的流转换,需要多个步骤,从而也就需要多个bolt。Bolt可以做任何事情:
运行函数,过滤tuple,做一些聚合,做一些合并以及访问数据库等。Bolt是一个被动的角色,其接口中有一个execute(Tuple
input)方法,在接收到消息之后会调用此函数,我们可以在此方法中执行自己的处理逻辑。StreamGroups一个Stream应如何分配数据给Bolt上面的Task.
http://wiki.corp.yincang.com/display/~xiao.yang/stream+groupsTopologyspout和bolt所组成一个网络会被打包成topology,
topology是storm里面最高一级的抽象(类似 Job), 我们可以把topology提交给storm的集群来运行. |
使用
##集群部署topologybin/storm
jar /home/xiao.yang/storm_test.jar kafka.MyTest l-pgtest1.s.dev.cn6.yincang.com##查看topologybin/storm
list##删除topologybin/storm kill
MyTest##激活topologybin/storm active
MyTest##不激活bin/storm
deactive MyTest |
本文详细介绍了Flume、Kafka及Storm三大组件的基本原理、核心概念与配置方法。Flume作为日志采集工具,Kafka作为消息中间件,Storm作为实时计算框架,三者在大数据处理流程中扮演着重要角色。
5万+

被折叠的 条评论
为什么被折叠?



