数据采集组件-flume

flume常见agent的配置

Flume1.9.0

自我认知:flume是一个可以采集数据的组件,底层代码由Java写的,flume组件之间就像搭积木一样可以一对一拼接可以多对多拼接实现数据的采集传输,如果有一定的Java语言编写水平,可以写一些定制化的拦截器实现对数据的更自由化的处理方式,没有语言功底也能通过修改配置文件实现对数据的采集功能。

  • 是什么
    Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量日志数据。它具有基于流数据流的简单灵活的体系结构。它具有可调整的可靠性机制以及许多故障转移和恢复机制,具有强大的功能和容错能力。它使用一个简单的可扩展数据模型,允许在线分析应用程序。

flume是一个数据采集工具,agent是flume的一个基本单元

Source用于采集数据,Source 是产生数据流的地方,同时 Source 会将产生的数据流传输到 Channel,这个有点类似于Java IO 部分的 Channel。
Channel 被设计为 Event 中转临时缓冲区,存储 Source 收集并且没有被Sink 读取的 Event,为平衡 Source 收集和 Sink 读取的速度,可视为 Flume内部的消息队列。
Sink从Channel 收集数据,将数据写到目标(可以是下一个 Source,也可以是 HDFS 或者 HBase)。

Kafka Sink: Flume 通过 Kafka Sink 将 Event 写⼊到 Kafka 中的主题,其他应⽤通过订阅主题消费数据。kafka.producer.acks 可以设置 Producer 端发送消息到 Broker 之后不需要等待 Broker 返回成功送达的信号。0表示Producer 发送消息到 Broker 之后不需要等待 Broker 返回成功送达的信号,这种⽅式吞吐量⾼,但存在丢失数据的风险。
1表示 Broker 接收到消息成功写⼊本地 log ⽂件后向 Producer 返回成功 接收的信号,不需要等待所有的 Follower 全部同步完消息后再做回应,这种⽅式在数据丢失风险和吞吐量之间做了平衡。
-1表示 Broker 接收到 Producer 的消息成功写⼊本地log 并且等待所有的 Follower 成功写⼊本地 log 后向 Producer 返回成功接收的信号,这种⽅式能够保证消息不丢失,但是性能最差(层层递进)

  • 配置
    单个文件a1.sources.r1.type = exec
    多个文件a1.sources.r1.type = TAILDIR
  • 拦截器
    拦截器是简单的插件式组件,设置在source和channel之间。source接收到的时间,在写入channel之前,拦截器都可以进行转换或者删除这些事件。每个拦截器只处理同一个source接收到的事件。可以自定义拦截器。

Flume和Kafka的区别与联系
flume追求的是数据和数据源、数据流向的多样性,适合多个生产者的场景;
kafka追求的是高吞吐,高负载,同一topic下可以有多个partition,由于是pull模式拉取数据,因此适合多个消费者的场景;kafka没有内置的producer和consumer组件,需要自己编写代码。

Flume 的负载均衡和故障转移
⽬的是为了提⾼整个系统的容错能⼒和稳定性。简单配置就可以轻松实现,⾸先需要设置 Sink 组,同⼀个 Sink 组内有多个⼦ Sink,不同 Sink 之间可以配置成负载均衡或者故障转移。


Flume和Kafka选取

Kafka 是一个非常通用的系统。你可以有许多生产者和很多的消费者共享多个主题Topics。相比之下,Flume是一个专用工具被设计为旨在往HDFS,HBase发送数据。它对HDFS有特殊的优化,并且集成了Hadoop的安全特性。所以,Cloudera 建议如果数据被多个系统消费的话,使用kafka;如果数据被设计给Hadoop使用,使用Flume。Kafka和Flume都是可靠的系统,通过适当的配置能保证零数据丢失。然而,Flume不支持副本事件。于是,如果Flume代理的一个节点奔溃了,即使使用了可靠的文件管道方式,你也将丢失这些事件直到你恢复这些磁盘。如果你需要一个高可靠行的管道,那么使用Kafka是个更好的选择。


flume管道内存,flume宕机了数据丢失怎么解决

1)Flume的channel分为很多种,可以将数据写入到文件。
2)防止非首个agent宕机的方法数可以做集群或者主备


flume和kafka采集日志区别,采集日志时中间停了,怎么记录之前的日志。

Flume采集日志是通过流的方式直接将日志收集到存储层,而kafka是将缓存在kafka集群,待后期可以采集到存储层。
Flume采集中间停了,可以采用文件的方式记录之前的日志,而kafka是采用offset的方式记录之前的日志。


Flume的配置实例
  • Taildir Source(可用来读取文件夹下多个文件)
    监视指定的文件,一旦检测到附加到每个文件的新行,就几乎实时跟踪它们。如果正在写入新行,则此源将重新尝试读取它们,等待写入完成。
    这个源是可靠的,即使在拖尾文件旋转时也不会丢失数据。它定期地以JSON格式在给定的位置文件上写入每个文件的最后读取位置。如果Flume由于某种原因被停止或关闭,它可以从写入现有位置文件的位置重新开始尾随。目前这个源不支持跟踪二进制文件。它逐行读取文本文件。
a1.sources.r1.type = TAILDIR
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /root/cdhdata/custom/.*txt
a1.sources.r1.headers.f1.headerKey1 = value1
a1.sources.r1.fileHeader = true
a1.sources.r1.maxBatchCount = 1000
  • kafka source
    Kafka Source是一个Apache Kafka消费者,它读取来自Kafka主题的消息。如果有多个Kafka源在运行,可以将它们配置为相同的使用者组,这样每个使用者都将为主题读取一组惟一的分区。
a3.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
a3.sources.r1.batchSize = 5000
a3.sources.r1.batchDurationMillis = 2000
#kafka集群
a3.sources.r1.kafka.bootstrap.servers = wq1:9092,wq2:9092,wq3:9092
a3.sources.r1.kafka.consumer.auto.offset.reset = earliest
#多个topic用,隔开
a3.sources.r1.kafka.topics = hdfs-hive
  • NetCat TCP Source
    类似于netcat的源,它监听给定端口并将每一行文本转换为一个事件。类似于nc -k -l[主机][端口]。换句话说,它打开一个指定的端口并侦听数据。期望提供的数据是换行分隔的文本。每一行文本被转换为一个Flume事件,并通过连接的通道发送。
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = netcat
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 6666
a1.sources.r1.channels = c1

  • HDFS Sink
    This sink writes events into the Hadoop Distributed File System (HDFS). It currently supports creating text and sequence files. It supports compression in both file types. The files can be rolled (close current file and create a new one) periodically based on the elapsed time or size of data or number of events.
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a3.sinks.k1.hdfs.fileType = DataStream
a3.sinks.k1.hdfs.writeFormat = Text
  • Hive sink
    此接收器将包含分隔文本或JSON数据的事件直接流到Hive表或分区中。事件是使用Hive事务编写的。只要将一组事件提交到Hive,它们就会立即对Hive查询可见。flume将流到的分区既可以预先创建,也可以选择在缺少分区时创建它们。来自传入事件数据的字段被映射到Hive表中的相应列。
a1.channels = c1
a1.channels.c1.type = memory
a1.sinks = k1
a1.sinks.k1.type = hive
a1.sinks.k1.channel = c1
a1.sinks.k1.hive.metastore = thrift://127.0.0.1:9083
a1.sinks.k1.hive.database = logsdb
a1.sinks.k1.hive.table = weblogs
a1.sinks.k1.hive.partition = asia,%{country},%y-%m-%d-%H-%M
a1.sinks.k1.useLocalTimeStamp = false
a1.sinks.k1.round = true
a1.sinks.k1.roundValue = 10
a1.sinks.k1.roundUnit = minute
a1.sinks.k1.serializer = DELIMITED
a1.sinks.k1.serializer.delimiter = "\t"
a1.sinks.k1.serializer.serdeSeparator = '\t'
a1.sinks.k1.serializer.fieldnames =id,,msg
  • Avro sink
    This sink forms one half of Flume’s tiered collection support. Flume events sent to this sink are turned into Avro events and sent to the configured hostname / port pair. The events are taken from the configured Channel in batches of the configured batch size.
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 10.10.10.10
a1.sinks.k1.port = 4545
  • kafaka sink
    This is a Flume Sink implementation that can publish data to a Kafka topic. One of the objective is to integrate Flume with Kafka so that pull based processing systems can process the data coming through various Flume sources.

kafka.producer.acks 1 How many replicas must acknowledge a message before its considered successfully written. Accepted values are 0 (Never wait for acknowledgement), 1 (wait for leader only), -1 (wait for all replicas) Set this to -1 to avoid data loss in some cases of leader failure.

a1.sinks.k1.channel = c1
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = mytopic
a1.sinks.k1.kafka.bootstrap.servers = localhost:9092
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
a1.sinks.k1.kafka.producer.compression.type = snappy

  • Memory Channel
    事件存储在内存中的队列中,其最大大小可配置。对于需要更高吞吐量并准备在代理失败时丢失分段数据的流来说,它非常理想
a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
  • File Channel
a3.channels.c1.type = file
a3.channels.c1.capacity = 10000
a3.channels.c1.byteCapacityBufferPercentage = 20
a3.channels.c1.transactionCapacity = 10000
a3.channels.c1.byteCapacity = 20000000

flume采集数据到sparkstreaming


a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = TAILDIR
#记录了每条文件的inode,作用就是flume断开后,下次采集数据就会从新的位置开始
a1.sources.r1.positionFile = /opt/specialwu/flumeconf/nginxlog_taildir_position.json
a1.sources.r1.filegroups = f1
#向上面的json文件写inode的频率
a1.sources.r1.writePosInterval = 1000
a1.sources.r1.filegroups.f1 = /usr/share/nginx/logs/access.log

# Describe/configure the source
#a1.sources.r1.type = exec
#a1.sources.r1.channels=c1
#a1.sources.r1.command=tail -F /usr/share/nginx/logs/access.log


#define the sink 1
a1.sinks.k1.type=avro
a1.sinks.k1.hostname=47.47.47.47
a1.sinks.k1.port=1414 

# 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
a1.sinks.k2.channel=c1
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值