Flume source自定义使用遇到的问题flume无法加载主类Unable to load source type

(针对使用springboot打包的开发者)
记录:Flume source自定义使用遇到的问题flume无法加载主类Unable to load source type,Caused by: java.lang.ClassNotFoundException: com.zxd.testflume.flumetest

[ERROR-org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:143)] Failed to load configuration data. Exception follows.
org.apache.flume.FlumeException: Unable to load source type: com.zxd.testflume.flumetest, class: com.zxd.testflume.flumetest
        at org.apache.flume.source.DefaultSourceFactory.getClass(DefaultSourceFactory.java:68)
        at org.apache.flume.source.DefaultSourceFactory.create(DefaultSourceFactory.java:42)
        at org.apache.flume.node.AbstractConfigurationProvider.loadSources(AbstractConfigurationProvider.java:322)
        at org.apache.flume.node.AbstractConfigurationProvider.getConfiguration(AbstractConfigurationProvider.java:101)
        at org.apache.flume.node.PollingPropertie
### 自定义 Flume JDBC Source 示例教程 #### 准备工作 为了创建自定义Flume JDBC Source,需先准备好开发环境。这包括但不限于安装 JDK 和 IDE(如 IntelliJ IDEA),以及配置 Maven 或 Gradle 构建工具来管理依赖项。 对于项目结构,在 `pom.xml` 文件中应加入必要的依赖库以支持与 MySQL 数据库交互的功能[^1]: ```xml <dependencies> <!-- Apache Flume NG SDK --> <dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-sdk</artifactId> <version>${flume.version}</version> </dependency> <!-- MySQL Connector/J --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.connector.version}</version> </dependency> </dependencies> ``` #### 创建自定义 Source 继承 `AbstractSource` 并实现 `Configurable`, `PollableSource` 接口可以构建一个轮询式的 JDBC Source。此负责周期性查询数据库并将结果作为事件发送给下游组件处理。 ```java public class JdbcPollingSource extends AbstractSource implements Configurable, PollableSource { private static final Logger logger = LoggerFactory.getLogger(JdbcPollingSource.class); private DataSource dataSource; private String querySql; @Override public void configure(Context context) { // 配置数据源连接参数和 SQL 查询语句 Properties props = new Properties(); props.setProperty("user", "root"); props.setProperty("password", "your_password"); try { dataSource = new DriverManagerDataSource( "jdbc:mysql://localhost:3306/testdb", props ); querySql = "SELECT * FROM your_table WHERE processed_flag=0"; } catch (Exception e) { throw new FlumeException("Failed to initialize database connection.", e); } } @Override public Status process() throws EventDeliveryException { List<Event> events = Lists.newArrayList(); Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { conn = dataSource.getConnection(); stmt = conn.prepareStatement(querySql); rs = stmt.executeQuery(); while(rs.next()){ Map<String, Object> rowMap = Maps.newHashMap(); for(int i=1;i<=rs.getMetaData().getColumnCount();i++){ rowMap.put(rs.getMetaData().getColumnName(i), rs.getObject(i)); } byte[] bodyBytes = JsonMapper.getInstance().writeValueAsBytes(rowMap); Event event = new SimpleEvent(); event.setBody(bodyBytes); events.add(event); } getChannelProcessor().processEventBatch(events); return Status.READY; } catch (SQLException | IOException ex){ logger.error(ex.getMessage(),ex); return Status.BACKOFF; } finally{ closeQuietly(conn,stmt,rs); } } private void closeQuietly(Connection c, Statement s, ResultSet r){ if(r!=null){try{r.close();}catch(Exception ignored){}} if(s!=null){try{s.close();}catch(Exception ignored){}} if(c!=null){try{c.close();}catch(Exception ignored){}} } } ``` 上述代码展示了如何通过 Java 反射机制读取表中的记录并将其转换成 JSON 字符串形式存入 Flume 事件体中。注意这里假设每条记录都对应于单个 Flume 事件;实际应用时可根据业务逻辑调整这一映射关系。 #### 注册插件路径 为了让 Flume 能够识别新创建的数据源型,还需要修改 `$FLUME_HOME/conf/flume-env.sh` 文件,添加如下内容指向包含自定义 source jar 包的位置: ```bash export FLUME_CLASSPATH=/path/to/your/custom-source.jar:$FLUME_CLASSPATH ``` 最后一步是在 Flume Agent 的配置文件里声明使用自定义 source,并提供相应的初始化参数: ```properties agent.sources = jdbc_source agent.channels = memory_channel agent.sinks = logger_sink agent.sources.jdbc_source.type = com.example.JdbcPollingSource agent.sources.jdbc_source.query_sql = SELECT id,name,value FROM mytable LIMIT 100 OFFSET ${offset} agent.channels.memory_channel.type = memory agent.sinks.logger_sink.type = logger agent.sources.jdbc_source.channels = memory_channel agent.sinks.logger_sink.channel = memory_channel ``` 以上即为完整的自定义 Flume JDBC Source 开发指南。希望这些信息能够帮助理解整个过程和技术细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值