一、前言

Flume作为当下最流行的大数据采集组件之一。其本身拥有分布式/高可靠/高可用等优点,但相比较于Flink/Spark/Kafka等大数据组件,其对于本地调试的功能支持度并不高,如果我们没有掌握Flume的远程调试要领,就只能不停的进行打日志,部署,打日志,部署这样低效的工作,而这对于程序员来说无异于折磨。所以今天小编就和大家一起来探究Flume的远程调试方法。

二、环境准备

  1. flink官网下载上传服务器并解压。

  2. 开发自定义Source,这里以简单的读取mysql表数据为demo,部分代码如下:

package org.bigwinner.flume.sources;

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.PollableSource;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.EventBuilder;
import org.apache.flume.source.AbstractSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.sql.*; /**
* @author: IT大狮兄
* @date: 2021/8/13 下午9:11
* @version: 1.0.0
* @description: 自定义Source--读取MySQL表的数据
*/
public class MysqlSource extends AbstractSource implements PollableSource, Configurable {
private static final Logger LOGGER = LoggerFactory.getLogger(MysqlSource.class); private String mysqlUrl;
private String mysqlUser;
private String mysqlPassword;
private String mysqlTable;
private String mysqlDriver;
private Connection conn = null; public Status process() throws EventDeliveryException {
String sql = "select * from " + mysqlTable;
try {
PreparedStatement statement = conn.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
String id = resultSet.getString(1);
String uuid = resultSet.getString(2);
String iccid = resultSet.getString(3);
byte[] eventBytes = new StringBuilder().append(id).append("--")
.append(uuid).append("--").append(iccid).toString().getBytes();
Event event = EventBuilder.withBody(eventBytes);
getChannelProcessor().processEvent(event);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return Status.READY;
} public long getBackOffSleepIncrement() {
return 0;
} public long getMaxBackOffSleepInterval() {
return 0;
} @Override
/** Flume生命周期开始,可以做一些初始化的工作 */
public void start() {
LOGGER.info("Mysql source start......");
try {
Class.forName(mysqlDriver);
conn = DriverManager.getConnection(mysqlUrl, mysqlUser, mysqlPassword);
} catch (ClassNotFoundException e) {
LOGGER.error("Driver class is not found!");
} catch (SQLException throwables) {
LOGGER.error("get the connection error: {}", throwables);
} } @Override
/** Flume生命周期结束,可以做一些保存等结束前的工作 */
public void stop() {
LOGGER.info("Mysql source stop......");
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
LOGGER.error("连接关闭异常: {}", throwables);
}
}
super.stop();
} /** Flume配置文件读取的方法 */
public void configure(Context context) {
mysqlUrl = context.getString("mysql.url", "");
mysqlUser = context.getString("mysql.user", "");
mysqlPassword = context.getString("mysql.password", "");
mysqlTable = context.getString("mysql.table", "");
LOGGER.info("mysql_driver: {} --> mysql_url: {} --> mysql_user: {} --> mysql_password: {} --> mysql_table: {}",
mysqlDriver, mysqlUrl, mysqlUser, mysqlPassword, mysqlTable);
}
}
  1. 编辑flume agent配置文件,并上传到flume conf目录下
a1.sources = s1
a1.sinks = k1
a1.channels = c1 #############################
# Source
#############################
#自定义MySQL source类
a1.sources.s1.type = org.bigwinner.flume.sources.MysqlSource
a1.sources.s1.mysql.driver = com.mysql.jdbc.Driver
a1.sources.s1.mysql.url = jdbc:mysql://lsl001:3306/redis_temp
a1.sources.s1.mysql.user = superboy
a1.sources.s1.mysql.password = iamsuperboy
a1.sources.s1.mysql.table = redis_temp #############################
# Channel
#############################
#配置file-channel数据管道
a1.channels.c1.type = file
#最小需求空间
a1.channels.c1.minimumRequiredSpace = 3145728
#最大文件大小
a1.channels.c1.maxFileSize = 2146435071
#flume事件指针检查点备份目录
a1.channels.c1.checkpointDir = /opt/soft/flume/flume/data/checkpoint
#file-channel对event备份到本地的文件目录
a1.channels.c1.dataDirs = /opt/soft/flume/data/file-channel-mysql/data
#文件管道中的数据容量,单位条数
a1.channels.c1.capacity = 200
#文件管道中的事务数据容量,单位条数
a1.channels.c1.transactionCapacity = 100
#检查点备份flume时间指针的间隔时间
a1.channels.c1.checkpointInterval=60000 #############################
# Sink
#############################
#本次测试重点在Source,所以sink用null即可,表示不输出到任何地方
a1.sinks.k1.type = null a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1
  1. 打包,打成成宽依赖包,即包含所有依赖。并上传到flume的lib目录下

三、环境配置

  1. 服务器环境配置

    • 修改flume-ng启动命令文件: vim /opt/soft/flume/bin/flume-ng,修改为如下配置:

// 端口默认8000
JAVA_OPTS="-Xmx500m -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y"
  • 如果flume-env.sh文件在使用,需要注释掉flume-env.sh的JAVA_OPTS配置:vim /opt/soft/flume/conf/flume-env.sh,没有使用则可忽略。

  1. 本地IDE(本例以Idea为准)环境配置

    • 编辑配置界面,添加remote

  • 配置remote

四、验证

  1. 启动flume agent,结果如下图所示,即代表配置没有问题:

  1. 启动debug程序,查看是否正常debug:

由上,我们看到程序正确的进入了断点,并查询到了mysql的记录。

五、总结

以上就是今天和大家分享的Flume的远程调试方法,如果不知道的小伙伴赶紧实践起来吧,提升效率,珍爱自己!

案例代码参考:flume_demo

如何远程调试自定义开发的Flume应用的更多相关文章

  1. CLion远程调试嵌入式开发板程序

    CLion远程调试嵌入式开发板程序 目录 CLion远程调试嵌入式开发板程序 1. 目的 2. 前提条件 3. CLion设置 3.1 设置一个Deployment 3.2 上传需要的目录到目标板子 ...

  2. pycharm远程调试、开发(详细操作)

    如果仅是远程开发,新建 ssh Interpreter 并 apply tools -> deployment -> browser remote host 即可 1.服务器侧准备 准备调 ...

  3. MC java 远程调试 plugin 开发

    @ECHO OFF SET CATALINA_OPTS= -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,se ...

  4. 移动应用调试之Inspect远程调试

    移动应用调试之Inspect远程调试 一.准备工作 chrome浏览器,建议最新版本 如果你点击inspect打开的DevTools窗口一片空白,且刷新无效时,那极有可能是由于被墙的缘故. 二.Ins ...

  5. VS远程调试亲历

    背景: 很多情况下本地开发没有问题,可放到服务器就有问题(更气人的是测试环境时也行可就是生产环境不行!) 1.想到可能是服务器环境不对,Web服务器版本不对 2.有文件读写是不是文件夹权限 3.Web ...

  6. 图文并茂教你学会使用 IntelliJ IDEA 进行远程调试

    1. 前言 今天线上出现了个 Bug ,而且比较坑的是涉及到微信相关的东西不能线下调试.传统方式是在代码中各种的日志 log 埋点然后重新部署进行调试,再根据 log 中的信息进行分析.如果你的 lo ...

  7. flume远程调试

    项目开发的时候,出现问题的时候,通常在IDE里面直接进行调试,但有时候我们可能用的是另外的一些开源框架,甚至运行程序里面没有一行代码是我们自己写的,如果出现一些较复杂的问题,那么我们可能就会用到远程调 ...

  8. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  9. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

随机推荐

  1. vue elementui table 内按钮跳转页面

    vue : <el-table-column label="操作" v-if="isColumOperate"> <template slot ...

  2. SonarQube插件

    关于插件我本身使用不多,如果看不惯英文界面,那么就先装个中文插件吧. 或者上微软的官方网站进行下载 将下载的插件上传到自己的sonarqube的服务的机器上,放置插件目录下,重启sonarqube即可 ...

  3. 我通过调试ConcurrentLinkedQueue发现一个IDEA的小虫子(bug), vscode复现, eclipse毫无问题

    前言: 本渣渣想分析分析Doug Lea大佬对高并发代码编写思路, 于是找到了我们今天的小主角ConcurrentLinkedQueue进行鞭打, 说实话草稿我都打好了, 就差临门一脚, 给踢折了 直 ...

  4. php漏洞 sha1函数

    0x01: 绕过技巧是传入的是数组时,会报错,返回为NULL,当传入的两个参数都是数组直接相等

  5. Java 内存泄漏知多少?

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 面试的时候内存管理是不是很多面 ...

  6. java 语言知识

    1.javase 标准版主要用于桌面应用.控制台:javaee 企业版主要用于web应用:javame微缩版主要用于嵌入式. 2.jre是java程序的运行环境,包含jvm(java虚拟机).jdk是 ...

  7. spring boot框架相关知识

    1.spring:一个轻量级的控制反转和面向切面的容器,专业的开发Web项目的开源框架.    spring mvc:是基于spring的mvc框架,属于一个企业WEB开发的MVC框架,涵盖面包括前端 ...

  8. Python使用笔记27--mysql操作封装类

    1.面向过程 1 import pymysql 2 3 #面向过程 4 mysql_info = {'host':'127.0.0.1', 5 'port':3306, 6 'user':'root' ...

  9. C语言:字符型数据(常量)

    字符型数据就是字符. 字符型数据的表示 字符型数据是用单引号括起来的一个字符.例如:'a'.'b'.'='.'+'.'?'都是合法字符型数据.在C语言中,字符型数据有以下特点: 字符型数据只能用单引号 ...

  10. c语言字符串存储方式

    #include <stdio.h> // C 语言中,任何数据类型都不可以直接存储一个字符串.那么字符串如何存储? //在 C 语言中,字符串有两种存储方式,一种是通过字符数组存储,另一 ...