
随着大数据时代的到来,数据量动辄PB级,因此亟需一种低成本、高稳定性的实时数仓解决方案来支持海量数据的OLAP查询需求,Apache Hudi[1]应运而生。Hudi借助与存放在廉价的分布式文件系统之中列式存储文件,并将其元数据信息存放在Hive元数据库中与传统查询引擎Hive、Presto、Spark等整合,完美地实现了计算与存储的分离。Hudi数据湖方案比传统的Hive数仓的优势是加入了数据实时同步功能, 可以通过最新的Flink流计算引擎来以最小的成实现数据实时同步。本质来说Hudi是整合现有的技术方案实现的,属于新瓶装旧酒,Hudi内部需要整合各种组件(存储、Indexer、Compaction,文件分区),为了达到通用及灵活性,每个组件会有大量的配置参数需要设置,且各种组件 的配置是有关联性的,所以对与新手来说要构建一个生产环境中可用的数据库方案,面对一大堆配置往往会望而却步。本文就向大家介绍如何通过TIS来改善Hudi数据湖实例构建流程,从而大幅提高工作效率。
TIS将Hudi中的各组件进行优雅地封装,并且基于TIS的数据字典组件自动生成Hudi DeltaStreamer[2]及 Flink Stream API[3]运行所需要 配置,Hudi数据表相关的配置都是在TIS的UI界面上完成操作,实现了轻点鼠标完成构建流程,实现开箱即用从而大幅提高构建Hudi数据湖的效率。
TIS采用两种方式实现数据入湖:
DeltaStreamer: 该方法实现批量数据导入,通过DataX将数据表中数据以avro格式导入到HDFS中,之后启动DeltaStreamer通过Spark RDD消费HDFS中的原始数据进行数据入湖。该种方式适合历史数据导入,优点是速度快吞吐率大。不足是无法提供Hudi表增量同步功能。推荐用户在实际生产环境中将以上两种方式结合使用,初次构建Hudi,数据湖表需要导入历史全量数据,这时采用第一种DeltaStreamer批量导入历史全量数据。等待构建完成,继续开启Flink增量同步任务(以Flink CDC MySQL Connector[5]为例,消费游标使用Latest策略消费,消费最新Binlog增量数据) 这样就可以规避Flink Job由于读取全量历史数据因数据量大导致的Job失败的故障产生。
实现原理如下图所示:

通过在TIS平台中定义Hudi数据湖实例,可以选择由DeltaStreamer来执行数据批量导入Hudi表,或者由Flink Job来执行增量Hudi表数据同步任务。
TIS的安装非常方便,只需三个步骤:下载一个tar压缩包,解压,最后启动即可。详细请查看 TIS安装说明[6]](http://tis.pub/docs/install/uber/))
TIS是基于微内核架构来实现的,初始安装包只有200兆,其他具体执行逻辑相关的执行逻辑都封装在了TIS的插件系统中,
本文相关的Hudi和MySQL以及Flink增量同步、DataX批量同步相关的功能插件都是在TIS运行时按需加载并热部署生效的。
本示例依赖如下组件版本:
组件名称 | 版本 |
|---|---|
Apache Hudi | 0.10.1 |
Apache Spark | spark-2.4.4-bin-hadoop2.7 |
Apache Hive | 2.1.1 以上 |
Apache Hadoop | 2.7.3 |
Apache Flink | tis-1.13.1(基于Flink 1.13.1 定制,解决不同组件Source,Sink之间可能存在的三方依赖包冲突) |
sparkmaster与spark-worker-1上添加一个hosts配置文件可以避免DeltatStreamer执行过程中提交任务端Hostname不能识别的错误:添加项:
extra_hosts:
- "baisui-test-1:192.168.28.200"添加后效果:
sparkmaster:
image: apachehudi/hudi-hadoop_2.8.4-hive_2.3.3-sparkmaster_2.4.4:latest
hostname: sparkmaster
container_name: sparkmaster
env_file:
- ./hadoop.env
ports:
- "8080:8080"
- "7077:7077"
extra_hosts:
- "baisui-test-1:192.168.28.200"
environment:
- INIT_DAEMON_STEP=setup_spark
links:
- "hivemetastore"
- "hiveserver"
- "hive-metastore-postgresql"
- "namenode"
spark-worker-1:
image: apachehudi/hudi-hadoop_2.8.4-hive_2.3.3-sparkworker_2.4.4:latest
hostname: spark-worker-1
container_name: spark-worker-1
env_file:
- ./hadoop.env
depends_on:
- sparkmaster
ports:
- "8081:8081"
extra_hosts:
- "baisui-test-1:192.168.28.200"
environment:
- "SPARK_MASTER=spark://sparkmaster:7077"
links:
- "hivemetastore"
- "hiveserver"
- "hive-metastore-postgresql"
- "namenode"然后就可以启动Hudi docker-compose了
# 启动
sh hudi-0.10.1/docker/setup_demo.sh
# 停止
sh hudi-0.10.1/docker/stop_demo.sh 实例链接

添加下拉按钮中的数据管道,进行MySQL端到Hudi端的数据同步通道构建


添加按钮,安装插件

tis-ds-mysql-plugin,tis-datax-hudi-plugin两个插件进行安装

插件管理页面关闭

MySQL,Writer端选择Hudi,点击下一步按钮,进行MySQL Reader的设置

8. 在Reader设置页面,点击数据库名项右侧配置下拉框中MySqlV5 数据源,完成表单填写,点击保存按钮,其他输入项目使用默认值即可,然后再点击下一步选取Reader端中需要处理的表

设置按钮,对目标Hudi表设置,设置目标表的目标列、分区、主键等属性设置.
点击保存按钮,然后点击下一步,进入Hudi Writer表单设置

Hudi Writer表单
sparkConn项右侧管理下拉框中添加按钮,添加SparkMaster源
hiveConn项右侧 数据源管理下拉框添加按钮,添加hiveConn源
fsName项右侧 FS管理 下拉框添加按钮,添加分布式文件系统源

创建按钮完成数据流通道定义

2. 由于TIS系统初次安装,还未安装触发器插件,请按照只是先安装,成功之后再触发批量导入


接下来开通实时增量通道

重启策略、checkpoint、stateBackend相关属性
保存&下一步按钮进入下一步Sink,Source相关属性设置
该步骤添加Flink SourceFunction对应的flink-connector-mysql-cdc[12]](https://github.com/ververica/flink-cdc-connectors/tree/master/flink-connector-mysql-cdc))插件 和 Fink Sink对应的Hudi 插件


部署按钮,进入向Flink Cluster中部署流处理逻辑
等待片刻,跳转到创建成功的页面

通过以上流程介绍,我们发现通过使用TIS[13]](http://tis.pub))来实现MySQL与Hudi表同步有如下优势:
还等什么呢?赶快试用一下吧
本次是TIS与数据湖产品Hudi的整合的初次尝试,Hudi的配置项比较繁杂,且各个配置项之间又存在各种依赖关系。TIS对Hudi的封装过程中还没有将Hudi的所有配置项(例如:Indexer的配置相关)开放给用户配置,后续会陆续完善。假如您TIS有功能需求,请在Github的Issue栏中添加:https://github.com/qlangtech/tis/issues[14]
[1] Apache Hudi: [https://hudi.apache.org/
[2] Hudi DeltaStreamer: https://hudi.apache.org/docs/next/hoodie_deltastreamer#deltastreamer
[3] Flink Stream API: https://github.com/apache/hudi/blob/master/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/streamer/HoodieFlinkStreamer.java
[4] Flink Stream API: https://github.com/apache/hudi/blob/master/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/streamer/HoodieFlinkStreamer.java
[5] Flink CDC MySQL Connector: https://github.com/ververica/flink-cdc-connectors/tree/master/flink-connector-mysql-cdc
[6] TIS安装说明: [http://tis.pub/docs/install/uber/
[7] Source包: https://www.apache.org/dyn/closer.lua/hudi/0.10.1/hudi-0.10.1.src.tgz
[8] docker compose: https://www.cnblogs.com/yang-qiu/p/15726821.html
[9] tis-flink: [http://tis.pub/docs/install/flink-cluster/standalone/
[10] 安装单机版tis: http://tis.pub/docs/install/uber/
[11] 安装说明: [http://tis.pub/docs/install/flink-cluster/standalone/
[12] flink-connector-mysql-cdc: [https://github.com/ververica/flink-cdc-connectors/tree/master/flink-connector-mysql-cdc
[13] TIS: [http://tis.pub
[14] https://github.com/qlangtech/tis/issues: https://github.com/qlangtech/tis/issues](https://github.com/qlangtech/tis/issues)