flink(十二):Table&Sql实现kafka输入输出

分享

说明

  • 本博客每周五更新一次。
  • 实时计算处理中,kafka是重要的分布式消息队列,常作为 Flink 计算的输入和输出,本博客将使用 Flink 1.2实现 kafka 对数据的输入和输出操作。

资料

过程

  • 从kafka:input_kafka主题消费数据并生成Table,然后过滤状态为success的数据再写回到kafka:outpu_kafak主题

代码

  • 代码开发基于java1.8+flink1.12,kafka等环境搭建过程参照前几篇博客。
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.TableResult;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;

/***
 * 
 * @author wangzonghui
 * @date 2021-06-15 10:34:14
 * @Description Table API And SQl实例四:从kafka:input_kafka主题消费数据并生成Table,然后过滤状态为success的数据再写回到kafka:outpu_kafak主题
 * 文档地址:https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/dev/table/connectors/kafka.html
 * 	
 *  
 */
public class KafkaDeamo {
	
	public static void main(String[] args) throws Exception {
		//TODO 1. env环境准备
		StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
		EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
		StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env,settings);
		
		//TODO 2. source
		TableResult inputTable = tableEnv.executeSql("CREATE TABLE input_kafka (\n"
				+ " `user_id` BIGINT,\n"
				+ " `page_id` BIGINT,\n"
				+ " `status` STRING\n"
				+ " ) WITH (\n"
				+ " 'connector' = 'kafka',\n"
				+ " 'topic' = 'input_kafka',\n"
				+ " 'properties.bootstrap.servers' = 'localhost:9092',\n"
				+ " 'properties.group.id' = 'testGroup',\n"
				+ " 'scan.startup.mode' = 'latest-offset',\n"
				+ " 'format' = 'json'\n"
				+ ")"
			);
		
		//TODO 3. transformation 将DataStream数转换Table和View,然后查询
		String sql="select * from input_kafka where status='success'";
		Table tableResult=tableEnv.sqlQuery(sql);
		
		//TODO 4. sink
		DataStream<Tuple2<Boolean, Row>> resultDs=tableEnv.toRetractStream(tableResult, Row.class);
		resultDs.print();
		
		TableResult outputTable = tableEnv.executeSql("CREATE TABLE output_kafka (\n"
				+ " `user_id` BIGINT,\n"
				+ " `page_id` BIGINT,\n"
				+ " `status` STRING\n"
				+ " ) WITH (\n"
				+ " 'connector' = 'kafka',\n"
				+ " 'topic' = 'output_kafka',\n"
				+ " 'properties.bootstrap.servers' = 'localhost:9092',\n"
				+ " 'format' = 'json',\n"
				+ " 'sink.partitioner'= 'round-robin'\n"   //分期放手
				+ ")"
			);
		
		tableEnv.executeSql("insert into output_kafka select * from "+tableResult);  //从结果表查数据,转存到输出表
		//TODO 5. execute
		env.execute("");
	}

}

kafka操作

  • 创建输入和输出topic
    • inputkafka:bin\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic input_kafka
    • outputkafka:bin\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic output_kafka
  • 进入输入topic:kafka-console-producer.bat --broker-list localhost:9092 --topic input_kafka
    • 添加数据:{“user_id”:“1”,“page_id”:“1”,“status”:“success”}
  • 打印输出topic:kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic output_kafka --from-beginning

总结

  • Table API 定制型强,但接口变动快,适配性查,如果要满足版本更替,建议使用 SQL 开发。
  • 选择好方向,争取成为某领域专家。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink SQL是Apache Flink的一种查询语言,用于在Flink中进行实时数据处理和分析。要实现Kafka中的数据落盘到HDFS,可以使用Flink SQL的相关功能。 首先,我们需要在Flink的配置文件中设置Kafka和HDFS的连接信息。在Flink的conf/flink-conf.yaml文件中,配置以下属性: ``` state.backend: filesystem state.checkpoints.dir: hdfs://<HDFS_HOST>:<HDFS_PORT>/checkpoints state.savepoints.dir: hdfs://<HDFS_HOST>:<HDFS_PORT>/savepoints ``` 其中,<HDFS_HOST>是HDFS的主机地址,<HDFS_PORT>是HDFS的端口号。这样配置后,Flink将会将检查点和保存点存储到HDFS中。 接下来,在Flink SQL中创建一个表来读取Kafka中的数据,并将数据入到HDFS中。可以使用以下SQL语句实现: ```sql CREATE TABLE kafka_source ( key STRING, value STRING ) WITH ( 'connector' = 'kafka', 'topic' = '<KAFKA_TOPIC>', 'properties.bootstrap.servers' = '<KAFKA_BOOTSTRAP_SERVERS>', 'properties.group.id' = '<KAFKA_GROUP_ID>', 'format' = 'json' ); CREATE TABLE hdfs_sink ( key STRING, value STRING ) WITH ( 'connector' = 'filesystem', 'path' = 'hdfs://<HDFS_HOST>:<HDFS_PORT>/output', 'format' = 'csv', 'csv.field-delimiter' = ',' ); INSERT INTO hdfs_sink SELECT key, value FROM kafka_source; ``` 这里,'<KAFKA_TOPIC>'是Kafka中的主题名称,'<KAFKA_BOOTSTRAP_SERVERS>'是Kafka的启动服务器地址,'<KAFKA_GROUP_ID>'是Kafka消费者组的ID。'json'和'csv'是数据的格式,可以根据实际情况进行调整。 以上SQL语句创建了一个名为kafka_source的输入表,将Kafka中的数据源与之关联。同时,创建了一个名为hdfs_sink的输出表,将数据入到HDFS中。最后,通过INSERT INTO语句,将kafka_source中的数据入到hdfs_sink中。 通过以上的配置和操作,Flink SQL就可以实现Kafka中的数据落盘到HDFS。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值