flume收集日志到mysql

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!!");

	}

	@Override
	public 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);
		}
	}

	@Override
	public 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 agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1


# Describe/configure the source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /home/rui/log/flumespool
a1.sources.r1.fileHeader = true
a1.sources.r1.channels = c1


# Describe the sink
a1.sinks.k1.type = com.flume.dome.mysink.MysqlSink
a1.sinks.k1.hostname = 192.168.254.1
a1.sinks.k1.port = 3306
a1.sinks.k1.databaseName = flume_db
a1.sinks.k1.tableName = log_data
a1.sinks.k1.user = liang
a1.sinks.k1.password = 123456
a1.sinks.k1.channel = c1


# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.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=InnoDB
DEFAULT CHARACTER SET=latin1 COLLATE=latin1_swedish_ci
AUTO_INCREMENT=1
ROW_FORMAT=COMPACT
;

测试:
cd /home/rui/log/flumespool
echo "hello world" > test.log

数据写入成功!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用 Java 编写 Flume 采集数据到 MySQL,需要按照以下步骤进行: 1. 配置 Flume 的 agent 在 Flume 的 agent 配置文件中,需要指定 source、channel 和 sink,具体如下: ``` #定义 agent 名称和监听端口 agent1.sources = r1 agent1.channels = c1 agent1.sinks = k1 #配置 source agent1.sources.r1.type = netcat agent1.sources.r1.bind = localhost agent1.sources.r1.port = 44444 #配置 channel agent1.channels.c1.type = memory #配置 sink agent1.sinks.k1.type = org.apache.flume.sink.jdbc.JDBCSink agent1.sinks.k1.channel = c1 agent1.sinks.k1.driver = com.mysql.jdbc.Driver agent1.sinks.k1.url = jdbc:mysql://localhost:3306/testdb agent1.sinks.k1.username = root agent1.sinks.k1.password = root agent1.sinks.k1.batchSize = 100 agent1.sinks.k1.sqlDialect = MYSQL agent1.sinks.k1.table = test_table agent1.sinks.k1.channel = c1 ``` 其中,source 部分的配置需要根据具体情况进行修改,channel 部分使用 memory 类型即可,sink 部分的配置需要指定 MySQL 数据库的连接信息和表名。 2. 编写 Java 程序 编写 Java 程序,用于启动 Flume agent,代码如下: ``` import org.apache.flume.node.Application; public class FlumeApp { public static void main(String[] args) { //指定 Flume 配置文件路径 String confPath = "/path/to/flume/conf/flume-conf.properties"; //启动 Flume agent Application.main(new String[]{"agent", "-f", confPath, "-n", "agent1"}); } } ``` 其中,需要将 `confPath` 修改为实际的 Flume 配置文件路径。 3. 运行程序 运行 Java 程序即可启动 Flume agent,开始采集数据并写入 MySQL 数据库。 以上就是使用 Java 编写 Flume 采集数据到 MySQL 的基本步骤,希望能对你有所帮助。 ### 回答2: 要使用Java编写Flume采集数据到MySQL,你可以按照以下步骤进行操作: 1. 首先,确保你已经在系统中安装了Java和Flume。如果没有安装,你可以在官方网站上下载并按照给定的说明进行安装。 2. 在你的Java代码中,导入Flume的相关包以便使用Flume的功能。这些包可以在Flume的安装目录中找到。 3. 创建Flume的配置文件,例如名为`flume.conf`。在配置文件中,你需要指定Flume的源和目的地。源可以是你要采集数据的来源,比如一个文件或者一个网络源。目的地则是MySQL数据库。你需要提供MySQL的连接信息,包括主机地址、端口号、数据库名、用户名和密码。 4. 在Java代码中,使用Flume的`FlumeConfiguration`类来读取并解析你的配置文件。 5. 创建一个Flume的`Event`对象,它用于包装你要采集的数据。将数据添加到`Event`对象中。 6. 使用`FlumeAgent`对象将`Event`对象发送到Flume代理。Flume会根据你的配置文件将数据传送到MySQL数据库。 7. 在MySQL数据库中验证是否成功采集数据。 以下是一个简单的示例代码,用于将采集的数据发送到MySQL数据库: ```java import org.apache.flume.Event; import org.apache.flume.FlumeAgent; import org.apache.flume.FlumeConfiguration; public class FlumeToMySQL { public static void main(String[] args) { // 读取并解析配置文件 FlumeConfiguration configuration = new FlumeConfiguration("flume.conf"); // 创建Event对象,并添加数据 Event event = new Event(); event.addData("data", "Some data to be collected"); // 创建FlumeAgent对象,并发送Event对象 FlumeAgent agent = new FlumeAgent(configuration); agent.sendEvent(event); // 验证数据是否成功采集MySQL数据库 // TODO: 添加验证数据库的代码 } } ``` 请注意,以上示例只是一个简单的框架,具体的实现可能需要根据你的需求进行调整。你需要根据实际情况修改配置文件和验证数据库的代码。同时,还需要确保你已经正确配置了Flume的相关参数,以确保Flume能够正确连接到MySQL数据库并将数据插入到正确的表中。 ### 回答3: 要用Java编写Flume采集数据到MySQL,您可以按照以下步骤进行操作: 1. 首先,您需要在Java项目中引入Flume的依赖。您可以在项目的pom.xml文件中添加Flume的依赖项,以使其能够在您的项目中使用Flume的相关功能。 2. 接下来,您需要编写一个自定义的Flume拦截器。拦截器是用于过滤和处理采集到的数据的关键组件。您可以根据自己的需求编写一个扩展自Flume的AbstractInterceptor类的自定义拦截器,以实现数据处理的逻辑。 3. 在您的代码中,创建一个Flume的配置文件。这个配置文件将指定Flume从哪个源获取数据,并将数据发送到MySQL数据库中的哪个表。配置文件将包含必要的信息,如源类型、Flume Agent名称、自定义拦截器等。 4. 创建一个Flume Agent并启动它。在Java代码中,您可以通过Flume的Agent对象来实现这一步骤。通过Agent对象,您可以读取Flume配置文件并启动Flume Agent来通过拦截器将数据从源发送到目标。 5. 编写代码来连接到MySQL数据库并将数据插入到数据库表中。您可以使用Java的JDBC API与MySQL数据库建立连接,并使用SQL语句将采集到的数据插入到指定的表中。 6. 最后,您需要编译并执行您的Java代码。当代码执行时,Flume将从源获取数据并通过自定义拦截器将其发送到MySQL数据库中的指定表中。 需要注意的是,以上步骤是一个简单的指导,您可能会根据实际情况进行相应的调整和扩展。此外,Java编写Flume采集数据到MySQL还涉及到Flume的其他概念和组件,您可以通过官方文档或其他相关资源深入了解并应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值