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