使用flume对FTP服务器进行文件的获取解析入库mysql数据库
- flume的基本介绍
- flume的搭建和启动
- FTP做source的插件使用
- 自定义sink将数据导入mysql中
flume的基本介绍
系统描述:
Flume是一个分布式的、可靠的、高可用的海量日志采集、聚合和传输的系统。
数据流模型:Source-Channel-Sink。
当 Flume 来源收到事件后,它会将这些事件存储在一个或多个通道 中。通道是一种被动存储,它将事件保留到被 Flume 接收器 使用为止。例如,一个文件通道使用了本地文件系统;接收器从通道提取事件,并将它放在一个外部存储库(比如 HDFS)中,或者将它转发到流中下一个 Flume 代理(下一个跃点)的 Flume 来源;给定代理中的来源和接收器与暂存在通道中的事件同步运行。
架构图:
网上很多关于flume的介绍我就不多说了。
Flume基本组件:
Event:消息的基本单位,有header和body组成
Agent:JVM进程,负责将一端外部来源产生的消息转 发到另一端外部的目的地
Source:从外部来源读入event,并写入channel
Channel:event暂存组件,source写入后,event将会一直保存,
Sink:从channel读入event,并写入目的地
1.3.1Source意为来源、源头。
主要作用:从外界采集各种类型的数据,将数据传递给Channel。
比如:监控某个文件只要增加数据就立即采集新增的数据、监控某个目录一旦有新文件产生就采集新文件的内容、监控某个端口等等。
常见采集的数据类型:
Exec Source、Avro Source、NetCat Source、Spooling Directory Source等
Source具体作用:
- **AvroSource:监听一个avro服务端口,采集Avro数据序列化后的数据;
- **Thrift Source:监听一个Thrift 服务端口,采集Thrift数据序列化后的数据;
- **Exec Source:基于Unix的command在标准输出上采集数据;tail -F 和tail -f 区别。基于log4j切割文件时的能否读取问题。
- **JMS Source:Java消息服务数据源,Java消息服务是一个与具体平台无关的API,这是支持jms规范的数据源采集;
- **Spooling Directory Source:通过文件夹里的新增的文件作为数据源的采集;
- **Kafka Source:从kafka服务中采集数据。
- **NetCat Source: 绑定的端口(tcp、udp),将流经端口的每一个文本行数据作为Event输入
- **HTTP Source:监听HTTP POST和 GET产生的数据的采集
Channel:
一个数据的存储池,中间通道。
主要作用:接受source传出的数据,向sink指定的目的地传输。Channel中的数据直到进入到下一个channel中或者进入终端才会被删除。当sink写入失败后,可以自动重写,不会造成数据丢失,因此很可靠。
channel的类型很多比如:内存中、jdbc数据源中、文件形式存储等。
常见采集的数据类型:
- **Memory Channel
- **File Channel
- **Spillable Memory Channel等
Channel具体作用:
- **Memory Channel:使用内存作为数据的存储。速度快
- **File Channel:使用文件来作为数据的存储。安全可靠
- **Spillable Memory Channel:使用内存和文件作为数据的存储,即:先存在内存中,如果内存中数据达到阀值则flush到文件中。
- **JDBC Channel:使用jdbc数据源来作为数据的存储。
- **Kafka Channel:使用kafka服务来作为数据的存储。
Sink:
主要作用:接受channel写入的数据以指定的形式表现出来(或存储或展示)。
sink的表现形式很多比如:打印到控制台、hdfs上、avro服务中、文件中等。
常见采集的数据类型:
HDFS Sink
Hive Sink
Logger Sink
Avro Sink
Thrift Sink
File Roll Sink
HBaseSink
Kafka Sink等
详细查看:
HDFSSink需要有hdfs的配置文件和类库。一般采取多个sink汇聚到一台采集机器负责推送到hdfs。
Sink具体作用:
Logger Sink:将数据作为日志处理(根据flume中的设置的日志的级别显示)。
HDFS Sink:将数据传输到hdfs集群中。
Avro Sink:数据被转换成Avro Event,然后发送到指定的服务端口上。
Thrift Sink:数据被转换成Thrift Event,然后发送到指定的的服务端口上。
File Roll Sink:数据传输到本地文件中。
Hive Sink:将数据传输到hive的表中。
IRC Sink:数据向指定的IRC服务和端口中发送。
Null Sink:取消数据的传输,即不发送到任何目的地。
HBaseSink:将数据发往hbase数据库中。
MorphlineSolrSink:数据发送到Solr搜索服务器(集群)。
ElasticSearchSink:数据发送到Elastic Search搜索服务器(集群)。
Kafka Sink:将数据发送到kafka服务中。(注意依赖类库)
Flume搭建和启动
首先官网下载二进制的安装包
http://flume.apache.org/download.html
直接解压 运行需要有jdk的环境,根据flume的版本不同所需要的jdk版本也不一样 1.7的flume至少需要的是1.7以上的jdk
然后到flume的bin目录下面就可以启动flume了
如:./flume-ng agent -c ../conf -f ../conf/g01-taildir-avro-sink.conf -n agent1 -Dflume.root.logger=INFO,console
-c/–conf 后跟配置目录,-f/–conf-file 后跟具体的配置文件,-n/–name 指定agent的名称
使用FTP做source
因为我的需求是从客户的ftp服务器中获取需要的文件数据所以需要有一个source从ftp获取,但是由于flime内置的souce中没有ftp,所以我们从github中down一个frp做source的插件使用
https://github.com/keedio/flume-ftp-source
!!!!感谢大神提供的插件啊!
下载之后解压然后打包生成jar包并且把另外两个依赖包
commons-net-3.3.jar和jsch-0.1.54.jar 加入之前解压的flume中的lib 中
然后编写配置文件 按照 插件里面的配置文件模板编写自己的soure的配置
如:
agent.sources.ftp2.type = org.keedio.flume.source.ftp.source.Source
agent.sources.ftp2.client.source = ftp
agent.sources.ftp2.name.server = 172.168.27.98 //ftp服务地址
agent.sources.ftp2.port = 21 //端口
agent.sources.ftp2.user = ftp_huge //ftp用户名
agent.sources.ftp2.password = 2970667 //密码
agent.sources.ftp2.working.directory = /OCS/CRM/bill/in //文件所在目录 (相对于根目录)
agent.sources.ftp2.filter.pattern = .+\.unl //文件的名称匹配 (java正则表达式)
agent.sources.ftp2.folder = /home/ftp_test //ftp的根目录
agent.sources.ftp2.file.name = ftp2-status-file.ser
agent.sources.ftp2.run.discover.delay=5000
agent.sources.ftp2.flushlines = true
agent.sources.ftp2.search.recursive = true
agent.sources.ftp2.processInUse = false
agent.sources.ftp2.processInUseTimeout = 30
agent.sources.ftp2.channels = ch2
自定义sink将数据导入mysql中
有了之前ftp插件引用的经验 现在我们需要自己定义一个sink将数据存入MySQL中
首先新建maven 项目,pom.xml 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org