Flink SQL读取Kafka写Hive
简介
Apache Flink是一个开源的流处理框架,可以实现流式数据的实时计算和流转换。Flink提供了Flink SQL来支持使用SQL语句进行流处理和批处理。本文将介绍如何使用Flink SQL读取Kafka数据,然后将数据写入Hive表中。
准备工作
在开始之前,需要安装以下软件:
- Apache Flink
- Apache Kafka
- Apache Hive
步骤
1. 创建Kafka Topic
首先,我们需要创建一个Kafka Topic来存储数据。可以使用以下命令创建一个名为test_topic
的Topic:
kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test_topic
2. 创建Hive表
接下来,我们需要在Hive中创建一个表来存储数据。可以使用以下命令创建一个名为flink_table
的表:
CREATE TABLE flink_table (
id INT,
name STRING,
age INT
) STORED AS PARQUET;
3. 编写Flink SQL代码
现在我们可以编写Flink SQL代码来读取Kafka数据并将其写入Hive表中。
首先,我们需要创建一个Flink Streaming作业。可以使用以下代码创建一个作业:
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.TableEnvironment;
public class KafkaToHiveJob {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
TableEnvironment tEnv = TableEnvironment.create(settings);
// 定义Kafka连接属性
String kafkaBootstrapServers = "localhost:9092";
String kafkaTopic = "test_topic";
String groupId = "flink_group";
// 注册Kafka表
tEnv.executeSql("CREATE TABLE kafka_table (\n" +
" id INT,\n" +
" name STRING,\n" +
" age INT\n" +
") WITH (\n" +
" 'connector' = 'kafka',\n" +
" 'topic' = '" + kafkaTopic + "',\n" +
" 'properties.bootstrap.servers' = '" + kafkaBootstrapServers + "',\n" +
" 'properties.group.id' = '" + groupId + "',\n" +
" 'format' = 'json',\n" +
" 'scan.startup.mode' = 'earliest-offset'\n" +
")");
// 注册Hive表
tEnv.executeSql("CREATE TABLE hive_table (\n" +
" id INT,\n" +
" name STRING,\n" +
" age INT\n" +
") PARTITIONED BY (dt STRING) STORED AS PARQUET TBLPROPERTIES (\n" +
" 'sink.partition-commit.delay' = '0s'\n" +
")");
// 执行SQL语句
tEnv.executeSql("INSERT INTO hive_table SELECT id, name, age, DATE_FORMAT(CURRENT_TIMESTAMP, 'yyyy-MM-dd') AS dt FROM kafka_table");
env.execute("KafkaToHiveJob");
}
}
4. 执行作业
接下来,我们可以编译并执行上述代码。执行作业后,Flink将从Kafka Topic中读取数据,并将数据写入Hive表中。
$ flink run -c KafkaToHiveJob kafka-to-hive-job.jar
结论
通过使用Flink SQL,我们可以方便地读取Kafka数据并将其写入Hive表中。使用Flink SQL可以简化流处理和批处理的开发过程,提高开发效率。
参考链接
- [Flink SQL Documentation](
流程图
st=>start: 开始
op1=>operation: 创建Kafka Topic
op2=>operation: 创建Hive表
op3=>operation: 编写Flink SQL代码
op4=>operation: 执行作业
e=>end: 结束
st->op1->op2->op3->op4->e
表格
字段名 | 类型 |
---|---|
id | INT |
name | STRING |
age | INT |