【Flink实时数仓】数据仓库项目实战 《三》 维表数据写入到HBase【DIM】

这里写自定义目录标题

  • 【Flink实时数仓】数据仓库项目实战 《三》 维表数据写入到HBase【DIM】
    • 1.配置表设计
      • **主流程 流程图**:
      • **主流数据 和 广播流数据处理流程图**:
      • **写入HBase(Phoenix)**
    • 2.代码实现
    • 3.结果展示

【Flink实时数仓】数据仓库项目实战 《三》 维表数据写入到HBase【DIM】

DIM层设计要点:
(1)DIM层的设计依据是维度建模理论,该层存储维度模型的维度表。
(2)DIM层的数据存储在 HBase 表中
DIM 层表是用于维度关联的,要通过主键去获取相关维度信息,这种场景下 K-V 类型数据库的效率较高。常见的 K-V 类型数据库有 Redis、HBase,而 Redis 的数据常驻内存,会给内存造成较大压力,因而选用 HBase 存储维度数据。
(3)DIM层表名的命名规范为dim_表名

1.配置表设计

我们将为配置表设计五个字段
source_table:作为数据源的业务数据表名
sink_table:作为数据目的地的 Phoenix 表名
sink_columns:Phoenix 表字段
sink_pk:Phoenix 表主键
sink_extend:Phoenix 建表扩展,即建表时一些额外的配置语句
source_table 作为配置表的主键,可以通过它获取唯一的目标表名、字段、主键和建表扩展,从而得到完整的 Phoenix 建表语句。

主流程 流程图

【Flink实时数仓】数据仓库项目实战 《三》 维表数据写入到HBase【DIM】_第1张图片

主流数据 和 广播流数据处理流程图

【Flink实时数仓】数据仓库项目实战 《三》 维表数据写入到HBase【DIM】_第2张图片

写入HBase(Phoenix)

【Flink实时数仓】数据仓库项目实战 《三》 维表数据写入到HBase【DIM】_第3张图片

2.代码实现

代码来自尚硅谷,微信关注尚硅谷公众号 回复: 大数据 即可获取源码及资料。

展示主流程代码。具体工具类及实现请下载源码。

public class DimApp {
    public static void main(String[] args) throws Exception {
        //TODO 1.获取执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1); //生产环境中设置为Kafka主题的分区数
        //1.1 开启CheckPoint
        //env.enableCheckpointing(5 * 60000L, CheckpointingMode.EXACTLY_ONCE);
        //env.getCheckpointConfig().setCheckpointTimeout(10 * 60000L);
        //env.getCheckpointConfig().setMaxConcurrentCheckpoints(2);
        //env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3, 5000L));
        //1.2 设置状态后端
        //env.setStateBackend(new HashMapStateBackend());
        //env.getCheckpointConfig().setCheckpointStorage("hdfs://hadoop102:8020/211126/ck");
        //System.setProperty("HADOOP_USER_NAME", "atguigu");

        //TODO 2.读取kafka topic_db主题数据创建主流
        String topic = "topic_db";
        String groupId = "dim_app_211126";
        DataStreamSource kafkaDS = env.addSource(MyKafkaUtil.getFlinkKafkaConsumer(topic, groupId));
        //TODO 3.过滤掉非josn数据&保留新增、变化及初始化数据
        SingleOutputStreamOperator filterJsonObjDS = kafkaDS.flatMap(new FlatMapFunction() {
            @Override
            public void flatMap(String value, Collector out) throws Exception {
                try {
                    //将数据转换为JSON格式
                    JSONObject jsonObject = JSON.parseObject(value);

                    //获取数据中的操作类型字段
                    String type = jsonObject.getString("type");

                    //保留新增、变化以及初始化数据
                    if ("insert".equals(type) || "update".equals(type) || "bootstrap-insert".equals(type)) {
                        out.collect(jsonObject);
                    }
                } catch (Exception e) {
                    System.out.println("发现脏数据:" + value);
                }
            }
        });

        //TODO 4.使用flinkcdc读取mysql配置表创建配置流
        MySqlSource mySqlSource = MySqlSource.builder()
                .hostname("hadoop102")
                .port(3306)
                .username("root")
                .password("123456")
                .databaseList("gmall-211126-config")
                .tableList("gmall-211126-config.table_process")
                .startupOptions(StartupOptions.initial())
                .deserializer(new JsonDebeziumDeserializationSchema())
                .build();
        DataStreamSource mysqlSourceDS = env.fromSource(mySqlSource,
                WatermarkStrategy.noWatermarks(),
                "MysqlSource");

        //TODO 5.将配置流处理为广播流
        MapStateDescriptor mapStateDescriptor = new MapStateDescriptor<>("map-state", String.class, TableProcess.class);
        BroadcastStream broadcastStream = mysqlSourceDS.broadcast(mapStateDescriptor);
        //TODO 6.连接主流与广播流
        BroadcastConnectedStream connectedStream = filterJsonObjDS.connect(broadcastStream);
        //TODO 7.处理连接流,根据配置信息处理主流数据
        SingleOutputStreamOperator dimDS = connectedStream.process(new TableProcessFunction(mapStateDescriptor));
        //TODO 8.将数据写出到Phoenix
        dimDS.print(">>>>>>>>>>>>");
        dimDS.addSink(new DimSinkFunction());
        //TODO 9.启动任务
        env.execute("DimApp");
    }
}

3.结果展示

启动后查询Hbase中维表创建成功

0: jdbc:phoenix:> select * from GMALL211126_REALTIME.DIM_BASE_TRADEMARK;
+-----+----------+
| ID  | TM_NAME  |
+-----+----------+
+-----+----------+
No rows selected (0.016 seconds)

添加数据
【Flink实时数仓】数据仓库项目实战 《三》 维表数据写入到HBase【DIM】_第4张图片

添加后查询数据

0: jdbc:phoenix:> select * from GMALL211126_REALTIME.DIM_BASE_TRADEMARK;
+-----+----------+
| ID  | TM_NAME  |
+-----+----------+
| 12  | 尚硅谷真香    |
+-----+----------+
1 row selected (0.041 seconds)

你可能感兴趣的:(hbase,flink,数据仓库)