flume收集日志到mysql
来源:互联网 发布:xp网络共享打印机设置 编辑:程序博客网 时间:2024/05/16 19:27
flume基本应用请参考:http://blog.csdn.net/liangrui1988/article/details/71774663
下面这个是将收集到的日志写到mysql中
github例子:https://github.com/liangrui1988/flume_mysql
pom:
<?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.flume.dome</groupId> <artifactId>flume_mysql</artifactId> <version>0.0.1</version><!-- <packaging>jar</packaging> --> <name>flume_mysql</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <version.flume>1.7.0</version.flume> </properties> <dependencies> <dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-core</artifactId> <version>${version.flume}</version> </dependency> <dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-configuration</artifactId> <version>${version.flume}</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.42</version> </dependency> <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.2</version><scope>test</scope></dependency> </dependencies></project>
自定义一个sink写入到mysql: java代码
package com.flume.dome.mysink;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.List;import org.apache.flume.Channel;import org.apache.flume.Context;import org.apache.flume.Event;import org.apache.flume.EventDeliveryException;import org.apache.flume.Transaction;import org.apache.flume.conf.Configurable;import org.apache.flume.sink.AbstractSink;import org.mortbay.log.Log;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.google.common.base.Preconditions;import com.google.common.base.Throwables;import com.google.common.collect.Lists;public class MysqlSink extends AbstractSink implements Configurable {private Logger LOG = LoggerFactory.getLogger(MysqlSink.class);private String hostname;private String port;private String databaseName;private String tableName;private String user;private String password;private PreparedStatement preparedStatement;private Connection conn;private int batchSize;// 批处理数量public MysqlSink() {LOG.info("MysqlSink start...");}public Status process() throws EventDeliveryException {Status result = Status.READY;Channel channel = getChannel();Transaction transaction = channel.getTransaction();Event event;String content;// 数据集合List<String> actions = Lists.newArrayList();transaction.begin();try {for (int i = 0; i < batchSize; i++) {event = channel.take();// 从通道中获取数据if (event != null) {content = new String(event.getBody());actions.add(content);} else {result = Status.BACKOFF;break;}}if (actions.size() > 0) {preparedStatement.clearBatch();for (String temp : actions) {Log.info("actions temp:{}", temp);// 对占位符设置值,占位符顺序从1开始,第一个参数是占位符的位置,第二个参数是占位符的值。preparedStatement.setString(1, temp);preparedStatement.setLong(2, System.currentTimeMillis());preparedStatement.addBatch();}preparedStatement.executeBatch();conn.commit();}transaction.commit();} catch (Throwable e) {try {transaction.rollback();} catch (Exception e2) {LOG.error("Exception in rollback. Rollback might not have been"+ "successful.", e2);}LOG.error("Failed to commit transaction."+ "Transaction rolled back.", e);Throwables.propagate(e);} finally {transaction.close();}return result;}public void configure(Context context) {hostname = context.getString("hostname");Preconditions.checkNotNull(hostname, "hostname must be set!!");port = context.getString("port");Preconditions.checkNotNull(port, "port must be set!!");databaseName = context.getString("databaseName");Preconditions.checkNotNull(databaseName, "databaseName must be set!!");tableName = context.getString("tableName");Preconditions.checkNotNull(tableName, "tableName must be set!!");user = context.getString("user");Preconditions.checkNotNull(user, "user must be set!!");password = context.getString("password");Preconditions.checkNotNull(password, "password must be set!!");batchSize = context.getInteger("batchSize", 100);Preconditions.checkNotNull(batchSize > 0,"batchSize must be a positive number!!");}@Overridepublic synchronized void start() {super.start();try {// 调用Class.forName()方法加载驱动程序Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}String url = "jdbc:mysql://" + hostname + ":" + port + "/"+ databaseName;Log.info("mysql start url:{}", url);// 调用DriverManager对象的getConnection()方法,获得一个Connection对象try {conn = DriverManager.getConnection(url, user, password);conn.setAutoCommit(false);// 创建一个Statement对象preparedStatement = conn.prepareStatement("insert into "+ tableName + " (context,time) values (?,?)");} catch (SQLException e) {e.printStackTrace();System.exit(1);}}@Overridepublic synchronized void stop() {super.stop();if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
mvn clean
mvn install
将代码打成jar包后,上传到flume安装目录下的lib文件夹中,同时需要上传MySQL的驱动jar包
-------------测试 Spooling Directory Source--------------------------
conf:mysql_sink.conf
# Name the components on this agenta1.sources = r1a1.sinks = k1a1.channels = c1# Describe/configure the sourcea1.sources.r1.type = spooldira1.sources.r1.spoolDir = /home/rui/log/flumespoola1.sources.r1.fileHeader = truea1.sources.r1.channels = c1# Describe the sinka1.sinks.k1.type = com.flume.dome.mysink.MysqlSinka1.sinks.k1.hostname = 192.168.254.1a1.sinks.k1.port = 3306a1.sinks.k1.databaseName = flume_dba1.sinks.k1.tableName = log_dataa1.sinks.k1.user = lianga1.sinks.k1.password = 123456a1.sinks.k1.channel = c1# Use a channel which buffers events in memorya1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100
启动flume agent al
bin/flume-ng agent --conf conf --conf-file conf/mysql_sink.conf --name a1 -Dflume.root.logger=INFO,console
创间表:
CREATE TABLE `log_data` (`id` int(11) NOT NULL AUTO_INCREMENT ,`context` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL ,`time` bigint(20) NULL DEFAULT NULL ,PRIMARY KEY (`id`))ENGINE=InnoDBDEFAULT CHARACTER SET=latin1 COLLATE=latin1_swedish_ciAUTO_INCREMENT=1ROW_FORMAT=COMPACT;
测试:
cd /home/rui/log/flumespool
echo "hello world" > test.log
数据写入成功!
0 0
- flume收集日志到mysql
- flume 收集日志到HDFS
- Flume 日志收集、使用Flume收集日志到HDFS
- flume-ng 日志收集到hbase
- 从flume到kafka,日志收集
- flume实时收集日志到kafka
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集
- Flume日志收集工具
- 第11章 卷积积分的计算和性质
- 一个最简单的cocos2dx-lua 演示说明
- android技术篇(一)解锁bootloader
- 使用Fetch
- 虚拟设备创建多分区虚拟磁盘(软盘,硬盘)
- flume收集日志到mysql
- Spring声明式事务配置——AOP方式
- win32编程隐藏窗口
- 高质量C++编程-命名风格
- Android 实现单击View,中间出现水波纹效果,在执行点击事件。
- Seek and Destroy(算法)
- 455. Assign Cookies -- 贪心算法
- Linux下如何查看分区文件系统类型
- Gradle 错误