文章目录
Flume和Sqoop
一、Flume的功能与应用
1.功能
数据采集:将数据从一个地方采集到另一个地方
将数据进行了复制
大数据的数据采集:将各种需要处理的数据源复制到大数据仓库中
实现:实时数据流的数据采集,可以将不同各种数据源的数据采集到各种目标地
数据源:文件、网络端口
Flume:实时
目标地:HDFS、Hbase、Hive、Kafka
特点:
功能全面
所有的读取和写入的程序,都已经封装好了
只需要配置从哪读,写入哪里,就要可以实现采集
允许自定义开发
如果功能不能满足实际的业务需求,Flume提供各种接口,允许自定义开发
基于Java开发的应用程序
开发相对简单
所有功能都封装好了,只要调用即可
写一个配置文件:从哪读,都谁,写到哪去
可以实现分布式采集
分布式采集:每一台机器都可以用Flume进行采集
注意:Flume不是分布式架构
2.应用
应用于实时数据流采集场景
基于文件或者网络协议端口的数据流采集
二、Flume的基本组成
Agent:每个Agent就是一个Flume的程序,每个Agent由三部分组成:source、Channel、Sink
Source:负责读取数据,Source会动态监听数据源,将数据源新增的数据实时采集变成Event数据流,将每个Event发送到Channel中
- 每一条数据会变成一个Event
- 实时监听数据源
Channel:临时缓存数据,将source发送过来的event的数据缓存起来 ,供Sink取数据
内存、文件(磁盘)
Sink:负责发送数据,从Channel中读取采集到的数据,将数据写入目标地
sink主动到Channel中读取数据
Event:用于构建每一条数据的对象,每一条数据就会变成一个Event,进行传递,最终写入目标
组成
- head:定义一些KV属性和配置,默认head时空的
- body:数据存在body中
理解:
Event
Map head;
byte[] body; //每一条数据的字节流
三、Flume的开发规则:
step1:开发一个Flume的参数配置文件
properties格式的文件:
#step1:定义一个agent:agent的名称、定义source、channel、sink
#step2:定义source:读什么、读哪
#step3:定义channel:缓存在什么地方
#step4:定义sink:写入什么地方
step2:运行flume的agent程序
flume -ng
Usage:bin/flume-ng <command>[options]...
为什么叫Flume-ng?
- flume-og:老的版本,架构非常麻烦,性能非常差,后不用了
- flume-ng:现在用的版本
flume-ng agent -c <conf> -f <file> -n <name>
agent:表示要运行一个Flume程序
- -c :指定Flume的配置文件目录
- -f :要运行那个文件
- -n :运行的agent的名字是什么
一个程序文件中可以有多个agent程序,通过名字来区别
四、Flume开发测试
需求:采集Hive的日志、临时缓存在内存中、将日志写入Flume的日志中并打印在命令中
source:采集一个文件数据
创建测试目录:
cd /export/server/flume-1.6.0-cdh5.14.0-bin
mkdir usercase
复制官方示例:
cp conf/flume-conf.properties.template usercase/hive-mem-log.properties
hive-mem-log.properties:采集hive的日志临时缓存在内存中最终打印在日志中
Exec Source
- 执行一条Linux的命令来实现采集
- 命令:搭配tail -f动态采集文件最新的内容
Chanel:Flume提供了各种channel应用缓存数据
- memory channel将数据缓存在内存中
Sink:Flume提供很多sink - Logger Sink 日志类型的Sink
开发配置文件hive-mem-log.properties
# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per a1,
# in this case called 'a1'
#define the agent
a1.sources = s1
a1.channels = c1
a1.sinks = k1
#define the source
a1.sources.s1.type = exec
a1.sources.s1.command = tail -f /export/server/hive-1.1.0-cdh5.14.0/logs/hiveserver2.log
#define the channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
#define the sink
a1.sinks.k1.type = logger
#bond
a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1
运行
#1.切换到指定目录
cd /export/server/flume-1.6.0-cdh5.14.0-bin/
#2.运行agent程序
flume-ng agent -c conf/ -f usercase/hive-mem-log.properties -n a1 -Dflume.root.logger=INFO,console
- -Dflume.root.logger=INFO,console:将flume的日志打印在命令行
结果:
五、常用Source
1.Exec
功能:通过执行一条Linux命令来实现数据量动态采集
- 固定搭配tail -F使用
应用场景:实现动态监听采集(单个文件)的数据
2.Taildir
功能:从Apache Flume1.7版本开始支持,动态监听采集多个文件
- 如果用的是1.5或者1.6,遇到这个问题,需要自己手动编译这个功能
测试实现
需求:让Flume动态监听一个文件和一个目录下的所有文件
准备
cd /export/server/flume-1.6.0-cdh5.14.0-bin
mkdir position
mkdir -p /export/data/flume
echo " " >> /export/data/flume/bigdata01.txt
mkdir -p /export/data/flume/bigdata
开发
cp usercase/hive-mem-log.properties usercase/taildir-mem-log.properties
taildir-mem-log.properties
# define sourceName/channelName/sinkName for the agent
a1.sources = s1
a1.channels = c1
a1.sinks = k1
# define the s1
a1.sources.s1.type = TAILDIR
#指定一个元数据记录文件
a1.sources.s1.positionFile = /export/server/flume-1.6.0-cdh5.14.0-bin/position/taildir_position.json
#将所有需要监控的数据源变成一个组,这个组内有两个数据源
a1.sources.s1.filegroups = f1 f2
#指定了f1是谁:监控一个文件
a1.sources.s1.filegroups.f1 = /export/data/flume/bigdata01.txt
#指定f1采集到的数据的header中包含一个KV对
a1.sources.s1.headers.f1.headerKey1 = value1
#指定f2是谁:监控一个目录下的所有文件
a1.sources.s1.filegroups.f2 = /export/data/flume/bigdata/.*
#指定f2采集到的数据的header中包含一个KV对
a1.sources.s1.headers.f2.headerKey1 = value2
a1.sources.s1.fileHeader = true
# define the c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# def the k1
a1.sinks.k1.type = logger
#source、channel、sink bond
a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1
运行
flume-ng agent -