使用flume对FTP服务器进行文件的获取解析入库mysql数据库

本文介绍了如何使用Flume从FTP服务器获取文件,解析数据,并将其存储到MySQL数据库中。详细讲解了Flume的基本组件,包括Source、Channel和Sink的原理和类型,特别提到了自定义FTP Source和MySQL Sink的实现方法。

使用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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.us</groupId>
    <artifactId>flumeDemo</artifactId>
    <version>1.0-SNAPSHOT</
### 使用Flume实时捕获MySQL数据库中的记录更新 Apache Flume 是一种分布式、可靠且高可用的日志收集系统,主要用于从各种数据源中高效地采集日志并将其传输到集中式存储系统(如 HDFS 或 Kafka)。然而,Flume 并不直接支持从关系型数据库(如 MySQL)中捕获变更记录的功能。为了实现这一目标,通常需要借助其他工具或技术来完成。 以下是通过 Flume 实现实时捕获 MySQL 数据库中记录更新的一种常见方法: #### 方法概述 1. **启用 MySQL 的 Binlog 功能** 配置 MySQL 启用二进制日志 (Binlog),这是 MySQL 提供的一个功能,用于记录所有的 DDL 和 DML 操作语句。这些日志可以被外部程序读取以获取表结构和数据的变化[^3]。 2. **使用 Canal 工具** Alibaba 开发的 Canal 是一款开源项目,能够模拟 MySQL 主从复制机制,解析 MySQL 的 Binlog 日志并将其中的数据变化事件发送给下游消费者。Canal 可以作为 Flume 的数据源之一[^4]。 3. **配置 Flume 接收来自 Canal 的消息** 将 Canal 解析后的增量数据写入到 Flume 中间件里,再由 Flume 负责后续处理流程,比如存放到文件或者推送至 Kafka 等消息队列服务上进一步分析加工[^5]。 #### 具体实施步骤说明如下: - 安装部署 Canal Server; - 修改 my.cnf 文件开启 binlog,并设置 server-id 参数; - 创建具有 REPLICATION SLAVE 权限的新用户账号授权访问权限; - 编辑 canal.conf 设置监听的目标实例地址端口以及用户名密码等连接参数; - 启动 Canal 应用程序开始同步操作; - 构建自定义 Source 插件让 Flume 支持接收 Canal 输出流; - 测试验证整个链路是否正常工作运行无误; 下面给出一段简单的 Java 代码片段展示如何基于 Avro 协议开发一个兼容 Apache Flume Event Format 的 Source 组件: ```java public class MyCustomSource extends AbstractSource implements Configurable { private String host; private int port; @Override public void configure(Context context) { this.host = context.getString("canal.server.address"); this.port = Integer.parseInt(context.getString("canal.server.port")); } @Override public void start() { new Thread(() -> { try(SocketChannel channel = SocketChannel.open(new InetSocketAddress(host, port))) { while(true){ ByteBuffer buffer = ByteBuffer.allocate(8 * 1024); StringBuilder sbuilder=new StringBuilder(); // Read data from socket and convert it into flume event format getChannelProcessor().processEvent(event); } } catch(IOException e){e.printStackTrace();} }).start(); } } ``` 上述示例仅作参考用途,请根据实际需求调整逻辑细节部分。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值