1)Flume产生背景
如果数据在关系型数据库(RDBMS)里面,可通过Sqoop进行抽取。(Spark SQL可代替)
如果日志在其他机器上,就有了Flume的产生;Flume就是干日志采集的事情。
2)From outside To inside:如何使用集群外的数据,得先抽取到Hadoop集群中。
3)定时收集ng产生的日志到HDFS
传统shell方式 {
1. ng默认会把日志信息写到 access.log 里面 -- 产生日志
2. crontab(定时) cp access.log target-timestamp.log -- 定时复制信息
3. hadoop fs -put target-timestamp.log /hdfspath --上传到HDFS
Q:集群之外的机器是不能访问HDFS的,怎么处理?
A:gateway客户端(就是客户机)
4. shell方式的弊端
-- 时效性问题,肯定有延迟
-- 文件过大,没有压缩
-- 文件格式,不能转到orz,parquet等格式文件
-- shell挂了后的监控
-- 吞吐量不能保障
}
4)pv uv 1000个 webserver
webserver日志类型
-- nginx 与业务无关的,如 access.log 访问日志
-- ugc 与业务相关的
pv uv是通过nginx日志进行计算的,如何计算?
a)将nginx日志写到数据库,再进行查询 -- 缺点:日志量大,server可能扛不住,这种方式不现实
b)写MapReduce/Spark代码发布到所有机器执行,假如没有HDFS?代码写错要全部重新部署?不现实
c)把1000台机器的日志收集到HDFS,再用MapReduce/Spark处理HDFS的文件(*****)
实现方式: 1000 webserver ==> Flume ==> HDFS ==> MapReduce/Spark
拓展:dependency job
Q:a ==> b ==> c 中间的依赖关系,如何进行合适的调度?
A:流行的调度框架:quartz(作业调度框架) Azkaban(Hadoop批处理调度器)但生产还是得自己开发
5)Flume 官方描述
-- distributed,reliable,and available service
collecting,aggregating(聚合), and moving large amounts of log data(移动大规模的数据日志)
分布式的海量日志的高效收集、聚合、移动/传输的框架
-- Agent <== 一个Flume的三大核心组件 {
Source: exec(文件)/Spooling Directory(文件夹)/Taildir Source/NetCat*****
采集数据,负责数据的流入,将数据从产生的源头采集过来,输出到channel中
Channel: Memory*****/File
数据存储池,连接source和sink,类似于一个队列或者缓冲区
Sink: HDFS/Logger/Avro/Kafka
从Channel中获取数据,将数据写到目标目的地
把数据写入到下一个Agent的Source中去总结:Source:源头,数据源 Channel:中间管道,把源头的数据放在这里 Sink:在Channel取数据,输出到某个地方
Agent : Source + Channel + Sink
}
6)扇入:减轻HDFS负担
7)扇出 场景:数据分流、实时离线
8)Flume 常用场景
Flume ==> HDFS ==> BATCH ......(离线处理)
Flume ==> Kafka ==> Streaming/Storm/Flink ..... (实时处理)
都是做同一件事情:源源不断地收集日志
9)Flume 使用
Flume的使用,就是写配置文件,把三大核心组件拼接起来 bind = source + channel + sink
--可配置的、可插拔的、可组装的 一个Agent就是一个配置文件
10)Flume 环境搭建
-- 下载jar包:wget http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0/
-- 解压,配置环境变量
-- flume-env.sh 只需要配置JAVA_HOME,内存不够可配置JAVA_OPTS
-- 配置Agent
11)Flume 启动
./flume-ng agent --name a1 --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/hello.conf -Dflume.root.logger=INFO,console
-- -Dflume.root.logger=INFO,console 日志级别为INFO
Q:为什么有些数据会显示不完全?
A:
12)什么是Event
Event是Flume传输的一个基本单元,Event包括可选的header + body一个 byte array
过程:将数据以Event的形式从source传送到sink所在的目的地
遵循规则:先进先出
13)需求:实时监控一个文件中新增的内容输出到HDFS
Agent: Source=exec Channel=memory Sink=hdfs
疑问:
Cloudera 0.9.2 Flume-OG(老一代) NG(新一代) JIRA:Flume-728
Kafka:消息队列/Stream Platform
同类产品:file beat http://www.elastic.co
tail -F vs -f 区别??