flume+kafka+storm

本文详细介绍了Flume、Kafka及Storm三大组件的基本原理、核心概念与配置方法。Flume作为日志采集工具,Kafka作为消息中间件,Storm作为实时计算框架,三者在大数据处理流程中扮演着重要角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



    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
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    小雄哥

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值