Flink(Scala版)消费Kafka数据存入Mysql

题目要求:1.使用Flume采集指定日志文件,并将采集到的数据存入kafka
2.将存入kafka的消息,使用Flink进行处理并存入Mysql

第一步 :编写Flume文档

在Flume目录下进入job目录,编写flume-kafka.conf文件
在这里插入图片描述

a.sources = s1
a.channels = c1
a.sinks = k1

a.sources.s1.type = exec			
a.sources.s1.command = tail -F /usr/apps/tmp/redis.log		

a.channels.c1.type = memory
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100

a.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a.sinks.k1.kafka.topic = ssm					
a.sinks.k1.kafka.bootstrap.servers = master:9092,slave1:9092,slave2:9092
a.sinks.k1.kafka.flumeBatchSize = 20
a.sinks.k1.kafka.producer.acks = 1
a.sinks.k1.kafka.producer.linger.ms = 1
a.sinks.k1.kafka.producer.compression.type = snappy

a.sources.s1.channels = c1
a.sinks.k1.channel = c1

对上文个别语句的解释:
a.sources.s1.type = exec //表示监听文件
a.sources.s1.command =tail -F /usr/apps/tmp/redis.log //监听文件的绝对路径
a.sinks.k1.kafka.topic = ssm //存入kafka的主题中,主题名为:ssm
监听的文件自行创建,保证和文档内写的相同就可以。
注意:此处不需要使用kafka提前创建主题,kafka会自动创建
关于Kafka的命令:kafka命令大全

第二步:开启Flume采集

1、jps 检查Kafka和ZK进程是否都开启了!
在这里插入图片描述
确认开启之后,开始Flume采集.
采集命令:
bin/flume-ng agent -c conf/ -n a -f job/flume-kafka.conf -Dflume.root.logger=INFO,console
Flume命令以及详细过程,请参考以下文章:Flume命令详解参考文章

第三步:编写Flink程序

import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.functions.sink.{RichSinkFunction, SinkFunction}
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011
import java.sql.{Connection, DriverManager, PreparedStatement}
import java.util.Properties

case class UVPV(user_id: String, times: Long)

object KafkaToMysql_test1 {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val prop = new Properties()
    prop.setProperty("bootstrap.servers", "192.168.38.147:9092")
    prop.setProperty("group.id", "flink")
    val kafkaSource = env.addSource(new FlinkKafkaConsumer011[String]("ssm", new SimpleStringSchema(), prop))
    val result = kafkaSource.map(data => {
      val arr = data.split(",")
      UVPV(arr(0), arr(1).toLong)
    })
    result.addSink(new MyJdbcSinkFunction())
    env.execute()
  }
}

class MyJdbcSinkFunction() extends RichSinkFunction[UVPV]{

  //定义连接,预编译语句
  var conn:Connection=_
  var insertStmt:PreparedStatement=_
  var updateStmt:PreparedStatement=_
  override def open(parameters: Configuration): Unit = {
    conn=DriverManager.getConnection("jdbc:mysql://ip地址:3306/数据库名称","用户名","密码")
    insertStmt=conn.prepareStatement("insert into uvpv(user_id,times) values (?,?)")
    updateStmt=conn.prepareStatement("update uvpv set times=? where user_id=?")
  }
  override def invoke(value: UVPV, context: SinkFunction.Context[_]): Unit = {
    updateStmt.setLong(1,value.times)
    updateStmt.setString(2,value.user_id)
    updateStmt.execute()

    if (updateStmt.getUpdateCount==0){
      insertStmt.setString(1,value.user_id)
      insertStmt.setLong(2,value.times)
      insertStmt.execute()
    }
  }
  override def close(): Unit = {

    insertStmt.close()
    updateStmt.close()
    conn.close()
  }

}

因为我用的Flink版本过低(1.10.2)并没有提供JdbcSink的包,所以需要自定义SinkFunction来连接Mysql进行交互。
jdbc如果看不懂的可以自行百度,或者说去小破站搜教程即可。

第四步 创建Mysql数据库和表

mysql -uroot -p000
create database test;
use test;
create table uvpv(user_id varchar(255) not null ,times int not null);

捋清楚执行顺序:

Flume采集–>Flink执行程序–>向Flume监听的文件加入数据—>Mysql查询表
第一步
第二步

第三步
第四步

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Flink可以通过Kafka Connector来消费Kafka数据,并将数据写入MySQL数据库。具体步骤如下: 1. 在Flink程序中引入Kafka Connector的依赖。 2. 创建一个Kafka Consumer,并设置相关的参数,如Kafka的地址、消费的Topic等。 3. 将Kafka Consumer读取到的数据进行处理,可以使用Flink提供的各种算子进行数据转换、过滤、聚合等操作。 4. 将处理后的数据写入MySQL数据库,可以使用Flink提供的JDBC Sink将数据写入MySQL中。 需要注意的是,Flink消费Kafka数据MySQL时,需要考虑数据的一致性和可靠性,可以使用Flink提供的Checkpoint机制来保证数据的一致性和容错性。同时,还需要考虑MySQL数据库的性能和可用性,可以使用连接池等技术来提高MySQL的性能和可用性。 ### 回答2: Apache Flink是一个流处理框架,可以方便地消费Kafka数据并将其写入MySQL数据库。Flink提供了Kafka数据源API来处理Kafka数据并将其转换为Flink数据流。Flink还提供了MySQL Sink API,可将Flink数据流转换为MySQL查询,并将其写入MySQL表中。 为了使用Kafka数据源API,需要使用以下代码创建KafkaSource: ``` FlinkKafkaConsumer consumer = new FlinkKafkaConsumer( "my-topic", new SimpleStringSchema(), properties); ``` 在上面的代码中,“my-topic”是Kafka主题名称,SimpleStringSchema是序列化程序,properties是Kafka消费者的配置属性。 接下来,您可以使用DataStreamAPI将Kafka数据源转换为DataStream: ``` DataStream<String> stream = env.addSource(consumer); ``` 在上面的代码中,env是Flink执行环境。 一旦您有了一个数据流,您可以使用MySQL Sink API将数据流写入MySQL数据库。使用以下代码创建MySQL Sink: ``` JDBCAppendTableSink sink = JDBCAppendTableSink.builder() .setDrivername("com.mysql.jdbc.Driver") .setDBUrl("jdbc:mysql://localhost:3306/mydatabase") .setUsername("myusername") .setPassword("mypassword") .setQuery("INSERT INTO mytable (id, name) VALUES (?, ?)") .setParameterTypes(Types.INT, Types.STRING) .build(); ``` 在上面的代码中,query是MySQL插入查询,setParameterTypes指定插入的参数类型。 接下来,你可以使用DataStreamAPI将数据写入MySQL Sink: ``` stream.addSink(sink); ``` 在上面的代码中,stream是上面创建的数据流。 最后,您需要启动Flink程序来开始消费Kafka数据并将其写入MySQL数据库: ``` env.execute(); ``` 现在,您已经成功地消耗了来自Kafka数据,并将其写入MySQL数据库。 ### 回答3: Flink是一个分布式实时计算引擎,它能够读取多种数据源,其中包括Kafka消息队列。在Flink消费Kafka数据并将其写入MySQL数据库的步骤如下: 1. 添加依赖库 首先,需要在项目中添加FlinkKafka的依赖库,可以通过Maven或Gradle添加相关依赖库。例如,在Maven项目中添加以下依赖库: ```xml <!-- Flink --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-core</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> <!-- Kafka --> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>${kafka.version}</version> </dependency> ``` 其中,`${flink.version}`和`${kafka.version}`需要根据实际情况替换为对应的本号。 2. 创建Kafka数据源 然后,需要创建FlinkKafka数据源,可以通过以下方式实现: ```java Properties properties = new Properties(); properties.setProperty("bootstrap.servers", "localhost:9092"); properties.setProperty("group.id", "flink-group"); properties.setProperty("auto.offset.reset", "latest"); DataStream<String> stream = env .addSource(new FlinkKafkaConsumer<>( "topic-name", new SimpleStringSchema(), properties)); ``` 以上代码中,我们创建了一个名为`stream`的DataStream对象,并且通过FlinkKafkaConsumer将它和Kafka的消息队列连接起来。其中,`properties`中设置了Kafka的连接参数,`"topic-name"`指定了要消费Kafka主题名,`SimpleStringSchema`表示我们只关注字符串类型的Kafka消息。 3. 解析Kafka数据 接下来,需要对Kafka中的数据进行解析和转换。例如,我们将Kafka消息中的JSON字符串转换为Java对象: ```java DataStream<Message> messages = stream.map(value -> { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(value, Message.class); }); ``` 这里,我们使用了Jackson库来将JSON字符串转换为Java对象,`Message.class`表示要转换成的对象类型。 4. 写入MySQL数据库 最后一步是将解析并转换后的数据写入MySQL数据库,可以通过JDBC实现。以下是简单的JDBC写入数据示例: ```java messages.addSink(new RichSinkFunction<Message>() { private Connection connection = null; private PreparedStatement statement = null; @Override public void open(Configuration parameters) throws Exception { super.open(parameters); Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_name", "user", "password"); statement = connection.prepareStatement("INSERT INTO messages (id, content) VALUES (?, ?)"); } @Override public void close() throws Exception { super.close(); if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } @Override public void invoke(Message message, Context context) throws Exception { statement.setInt(1, message.getId()); statement.setString(2, message.getContent()); statement.executeUpdate(); } }); ``` 以上代码中,`RichSinkFunction`表示数据写入器,`open`方法中创建了JDBC连接对象,`close`方法中关闭了连接对象,`invoke`方法中对每个解析的Message对象执行插入数据的操作。需要注意的是,需要将`jdbc:mysql://localhost:3306/db_name`中的`db_name`、`user`和`password`替换为实际MySQL数据库的值。 同时还需要添加对应的MySQL JDBC依赖库。 通过以上步骤,就可以使用FlinkKafka消息消费并写入MySQL数据库了。同时,还可以进行更多的数据转换和处理操作,例如过滤、分组、聚合等,从而实现更复杂的实时数据分析和计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值