flume数据采集_数据采集

背景

许多公司的业务平台每天都会产生大量的日志数据。对于这些日志信息,我们可以得到出很多有价值的数据。通过对这些日志信息进行日志采集、收集,然后进行数据分析,挖掘公司业务平台日志数据中的潜在价值。

任何完整的大数据平台,一般包括以下的几个过程:

数据采集-->数据存储-->数据处理(ETL)-->数据展现(可视化,报表和监控)

其中,数据采集是所有数据系统必不可少的,随着大数据越来越被重视,数据采集的挑战也变的尤为突出。这其中包括:

  • 数据源多种多样
  • 数据量大
  • 变化快
  • 如何保证数据采集的可靠性的性能
  • 如何避免重复数据
  • 如何保证数据的质量

目前常用的开源日志收集系统有Flume、Scribe、Fluentd、Logstash等。其中Apache Flume是一个分布式、可靠、可用的服务,和其他的大数据中间件契合的比较完善,用于高效地收集、聚合和移动 大量的日志数据,它具有基于流式数据流的简单灵活的架构。

例如,我们公司的架构:

08f53542d3bb2285530e7bbd65e6667e.png

其中数据埋点和数据采集是后续分析以及可视化的基础,如果进行数据埋点,在上一篇文章已经分析过了,详情见:

https://zhuanlan.zhihu.com/p/144152128​zhuanlan.zhihu.com

数据采集也是很重要的一部分,如何快速的采集数据,并保证数据的不丢失,不重复,保证数据质量是一个很重要的话题。

数据采集

介绍

1、Nginx

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

详情介绍:

Nginx中文文档​www.nginx.cn

选择nginx的原因:

  • IO复用(处理请求是异步非阻塞的)
  • 轻量级(同样起web 服务,比apache 占用更少的内存及资源)
  • CPU亲和(把每个worker进程固定在一个CPU上执行,减少切换CPU的缓存缺失)
  • 安装简单(高度模块化的设计,编写模块相对简单,配置简洁)

2、Flume

基于Flume的数据采集。常见的链路:Nginx -> flume -> HDFS -> Hive.

Flume 是Apache旗下的一款开源、高可靠、高扩展、容易管理、支持客户扩展的数据采集系统。 Flume使用JRuby来构建,所以依赖Java运行环境。具体介绍见:

Welcome to Apache Flume​flume.apache.org
038e5b9a4d898a34393df6d15786c75a.png

简单点来说就是:

flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。

event:flume中传输的基本数据单位,形式可以是字节也可以是字符串。

agent:控制所有组件将外部数据源的event流导入到目的地的JVM进程。

source:消费webserver传给它的event。

channel:是一个被动的仓库,会保持event直到被sink消费掉。

sink:将event从channel移除并储存到外部仓库。

0e4109066678f72fadbf4f5d1213a545.png

flume优点:

  • Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase;
  • Flume的管道是基于事务,保证了数据在传送和接收时的一致性;
  • Flume是可靠的,容错性高的,可升级的,易管理的,并且可定制和水平扩展;
  • Flume 已经成为 Hadoop 生态系统的标配,它的文档比较丰富,社区比较活跃;
  • Flume支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等;

3、logrotate

Logrotate是一个日志文件管理工具。用来把旧文件轮转、压缩、删除,并且创建新的日志文件。我们可以根据日志文件的大小、天数等来转储,便于对日志文件管理,可以节省磁盘空间,一般都是通过cron计划任务来完成的。

相对来说,Logrotate是一个简单的文件“转储”的工具。

详情:

https://github.com/logrotate/logrotate​github.com
logrotate命令格式:
logrotate [OPTION...] <configfile>
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。


Linux系统默认安装logrotate工具,它默认的配置文件在:

/etc/logrotate.conf

/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。

另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。

Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。
实际运行时,Logrotate会调用配置文件/etc/logrotate.conf。
可以在/etc/logrotate.d目录里放置自定义好的配置文件,用来覆盖Logrotate的缺省值。

logrotate是个优秀的日志滚动工具,正是由于这块工具太古老了,所以在使用的过程中不可避免的会出现一些问题,后面会介绍。

4、Kafka

Kafka是现在最火的一款分布式流平台,是一个高性能的消息系统。

详情见上一篇文章:

https://zhuanlan.zhihu.com/p/142239989​zhuanlan.zhihu.com

流程

1、Nginx日志获取

APP是通过ngnix日志获取,写入到日志服务器的文件系统,写入之后,每10分钟切割一次,切割后生成一个指定文件,通过Flume进行抽取。

抽取的配置文件:

{
su root
nocompress
hourly
dateformat -%Y%m%d%s
dateext
copytruncate
create
ifempty
olddir /data/search/openresty/nginx/logs/app_views
rotate 300000
}

抽取后的日志放在:/data/search/openresty/nginx/logs/app_views。

2、日志分割并轮转

通过logrotate进行10分钟日志切割和轮转。

调度:

7,17,27,37,47,57 * * * * sh /home/devopsd/scpbackup.sh

cat /home/devopsd/scpbackup.sh
#!/usr/bin/env bash
dateStrDay=`date -d -days +%Y-%m-%d`
dateNow=`date +%Y%m%d%H%M%S` 
cp /data/search/openresty/nginx/logs/*.log /data/nginx_backup/log/
cd /data/nginx_backup/log/
for li in `ls`
     do
         mv $li ${dateNow}$li
     done
scp -P 10022 -r /data/nginx_backup/log/* root@localhost:/data/backup/nginx_backup/tmp/
/usr/sbin/logrotate -f /etc/logrotate.conf
rm -r /data/nginx_backup/log/*

配置:

cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here

问题:

在logrotate切割日志的时候,就算只轮转一次,也会出现在切割的时候丢数据。

因为轮转操作是在:

1、第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;’

2、第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!

虽然我们只进行一次轮转,但是中间也会出现在名称转换之后,新建空的文件的时候,导致一批数据进不来,经过测试会出现100ms左右的数据丢失。

3、Flume抽取

调度:

cat log_record_view.sh 
nohup /data/apache-flume-1.6.0-bin/bin/flume-ng agent --conf /data/apache-flume-1.6.0-bin/conf/ -f /data/apache-flume-1.6.0-bin/conf/log_record_view.conf -n a1 &

配置:

a1.sources.r1.type = cn.idongjia.flume.source.RubustSpoolDirectorySource
a1.sources.r1.spoolDir = /data/search/openresty/nginx/logs/app_views
a1.sources.r1.batchSize = 5000
a1.sources.r1.deletePolicy = immediate
a1.sources.r1.deserializer = line
a1.sources.r1.deserializer.maxLineLength = 999999
#a1.sources.r1.fileModifiedIntervalMS = 600000
a1.sources.r1.fileModifiedIntervalMS = 120000

a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.filePrefix = test
a1.sinks.k1.hdfs.fileSuffix = .log
a1.sinks.k1.hdfs.useLocalTimeStamp = true
a1.sinks.k1.hdfs.path = hdfs://localhost:8020/flume_log/log_record_view_0/%Y-%m-%d
a1.sinks.k1.hdfs.rollCount=500000
a1.sinks.k1.hdfs.rollSize=128000000
a1.sinks.hdfsSink.hdfs.round=true
a1.sinks.hdfsSink.hdfs.roundUnit=hour
a1.sinks.hdfsSink.hdfs.roundValue=1
a1.sinks.k1.hdfs.callTimeout=50000

主要配置就是flume日志的来源和写入的path。其中a1是通道的意思,可以在配置文件中添加别的通道 然后在调用。

结论

通过这个方式进行日志的采集、抽取、轮转会出现部分的数据丢失,而且只能是离线的数据开发,对于实时的数据开发则不能满足。

后来Structured Streaming和Flink等实时的数据处理中间件的兴起,主键切换到实时的采集模式。架构模式:

Nginx->kafka->StructuredStreaming/Flink的模式。

具体见文章:

https://zhuanlan.zhihu.com/p/129672704​zhuanlan.zhihu.com
https://zhuanlan.zhihu.com/p/143696144​zhuanlan.zhihu.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。您可以按照以下步骤来使用Flume采集Kafka数据到HDFS和Hive中: 1. 首先,确保您已经安装了Flume、Kafka、HDFS和Hive等必要的软件。 2. 然后,在Flume的配置文件中添加Kafka作为Source和HDFS/Hive作为Sink。例如,以下是一个简单的配置文件示例: ``` agent.sources = kafka-source agent.channels = hdfs-channel agent.sinks = hdfs-sink hive-sink agent.sources.kafka-source.type = org.apache.flume.source.kafka.KafkaSource agent.sources.kafka-source.batchSize = 1000 agent.sources.kafka-source.kafka.bootstrap.servers = localhost:9092 agent.sources.kafka-source.kafka.topics = my-topic agent.sources.kafka-source.kafka.consumer.group.id = my-group agent.channels.hdfs-channel.type = memory agent.channels.hdfs-channel.capacity = 10000 agent.channels.hdfs-channel.transactionCapacity = 100 agent.sinks.hdfs-sink.type = hdfs agent.sinks.hdfs-sink.hdfs.path = hdfs://localhost:9000/flume/kafka agent.sinks.hdfs-sink.hdfs.fileType = DataStream agent.sinks.hdfs-sink.hdfs.writeFormat = Text agent.sinks.hdfs-sink.channel = hdfs-channel agent.sinks.hive-sink.type = hive agent.sinks.hive-sink.hive.metastore = thrift://localhost:9083 agent.sinks.hive-sink.hive.database = my-db agent.sinks.hive-sink.hive.table = my-table agent.sinks.hive-sink.hive.partition = dt=%Y-%m-%d agent.sinks.hive-sink.channel = hdfs-channel ``` 在上面的配置文件中,我们使用Kafka作为Source,将数据写入到HDFS和Hive中。我们使用Memory Channel将数据缓存在内存中,然后将其写入到HDFS和Hive中。在Hive Sink中,我们还定义了一个分区,以便按日期对数据进行分区。 3. 最后,运行Flume代理以开始从Kafka读取数据并将其写入到HDFS和Hive中。您可以使用以下命令来启动Flume代理: ``` $ bin/flume-ng agent -n agent -c conf -f conf/flume-kafka-hdfs-hive.conf ``` 这样,Flume代理就会开始从Kafka读取数据,并将其写入到HDFS和Hive中。 希望这些信息能够帮助您采集Kafka数据到HDFS和Hive中。如果您有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值