Flume自定义Source实现从MySQL数据库获取数据

本文档详细介绍了如何自定义Flume Source来从MySQL数据库中获取数据,并将其传输到其他存储系统。首先,创建MySQL数据库表,接着通过Maven工程添加相关依赖,配置文件设置,然后编写代码,包括查询MySQL的工具类和自定义的mysqlSource类。最后,将编译后的jar包放入Flume的lib目录,配置Flume配置文件并启动Flume服务。
摘要由CSDN通过智能技术生成

目录

需求说明

代码开发步骤

第一步:创建mysql数据库表

第二步:创建maven工程,添加依赖

第三步:添加配置文件

第四步:代码开发

1. 定义查询mysql的工具类

2. 自定义mysqlSource类

第五步:打包上传到flume的lib目录下

第六步:开发flume的配置文件

第七步:启动flume


官方提供的source类型已经很多,但是有时候并不能满足实际开发当中的需求,此时我们就需要根据实际需求自定义某些source。

如:实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架,所以此时需要我们自己实现MySQLSource。

官方也提供了自定义source的接口:

官网说明:https://flume.apache.org/FlumeDeveloperGuide.html#source

需求说明

  • 自定义flume的source,实现从mysql数据库当中获取数据,将数据打印到控制台上面来

代码开发步骤

根据官方说明自定义mysqlsource需要继承AbstractSource类并实现Configurable和PollableSource接口。

实现对应的方法:

  1. configure(Context context)

    初始化context

  2. process()

    从mysql表中获取数据,然后把数据封装成event对象写入到channel,该方法被一直调用

  3. stop()

    关闭相关资源

第一步:创建mysql数据库表

--创建一个数据库
CREATE DATABASE IF NOT EXISTS mysqlsource DEFAULT CHARACTER SET utf8;

use mysqlsource;

--创建一个表,保存从目标表已经读取数据的位置信息
CREATE TABLE mysqlsource.flume_meta (
  source_tab varchar(255) NOT NULL,
  currentIndex varchar(255) NOT NULL,
  PRIMARY KEY (source_tab)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--插入数据
insert  into mysqlsource.flume_meta(source_tab,currentIndex) values ('student','1');

select * from mysqlsource.flume_meta;

--创建要拉取数据的表
CREATE TABLE mysqlsource.student(
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

--向student表中添加测试数据
insert  into mysqlsource.student(id,name) values (1,'zhangsan'),(2,'lisi'),(3,'wangwu'),(4,'zhaoliu');

select * from mysqlsource.student;

第二步:创建maven工程,添加依赖

<dependencies>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.38</version>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
		<version>3.6</version>
	</dependency>
</dependencies>

第三步:添加配置文件

  • 在我们工程的resources目录下,添加jdbc.properties

  • 以下属性的值,根据自己的实际情况修改

dbDriver=com.mysql.jdbc.Driver
dbUrl=jdbc:mysql://node03:3306/mysqlsource?useUnicode=true&characterEncoding=utf-8
dbUser=root
dbPassword=123456

第四步:代码开发

1. 定义查询mysql的工具类

package com.xsluo.flume.custominterceptor;

import org.apache.flume.Context;
import org.apache.flume.conf.ConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.*;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class QueryMysql {
    private static final Logger LOG = LoggerFactory.getLogger(QueryMysql.class);

    private int runQueryDelay,   //两次查询的时间间隔
            startFrom,            //开始id
            currentIndex,       //当前id
            recordSixe = 0,        //每次查询返回结果的条数
            maxRow;                //每次查询的最大条数

    private String table,          //要操作的表
            columnsToSelect,       //用户传入的查询的列
            customQuery,          //用户传入的查询语句
            query,    
Flume自定义Source实现PollableSource后,可以通过实现 `configure(Context context)` 方法来获取配置信息,然后在 `process()` 方法中控制采集间隔。 具体来说,可以在 `configure(Context context)` 方法中获取配置的采集间隔时间,然后将其转换成毫秒数,保存到一个变量中。然后在 `process()` 方法中,使用 `Thread.sleep()` 方法控制采集间隔时间。 以下是一个示例代码: ```java public class MySource extends AbstractPollableSource { private long pollInterval; @Override public void configure(Context context) { // 从配置文件中获取采集间隔时间,单位为秒 pollInterval = context.getLong("pollInterval", 60); pollInterval *= 1000; // 转换成毫秒数 } @Override protected Status doProcess() throws EventDeliveryException { try { // 采集数据 List<Event> events = pollData(); // 发送事件 getChannelProcessor().processEventBatch(events); // 控制采集间隔时间 Thread.sleep(pollInterval); return Status.READY; } catch (InterruptedException e) { return Status.BACKOFF; } } private List<Event> pollData() { // 采集数据的实现 // ... } } ``` 在上面的示例代码中,我们首先在 `configure(Context context)` 方法中获取配置的采集间隔时间,然后在 `process()` 方法中使用 `Thread.sleep()` 方法控制采集间隔时间。 需要注意的是,由于 `Thread.sleep()` 方法会阻塞当前线程,因此在 `process()` 方法中需要处理 `InterruptedException` 异常,并返回 `Status.BACKOFF` 以避免无限重试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值