什么漂移同步
在解释漂移同步之前,首先简单说明以下数据漂移的概念。
数据漂移,简单来说,就是数据存放时间分区错误。在数据仓库的源数据表分区中,同一业务日期数据下包含了不属于该天的数据或者丢失了该天的变更数据。这个一般是时间戳不准确导致的,而时间戳不准确的原因有很多,这里不做过多说明,可以自行查询资料了解。
漂移同步,就是解决数据漂移这个问题的,根据构建的策略,将数据同步到正确的表中。
Hive漂移同步解决方案,是StreamSets提供的一整套解决方案,可以将输入数据实时同步到相应的Hive表中。这个方案除了解决数据漂移的问题,还有一个强大的功能是可以同步多库多表。
环境和设置
环境
服务 | 版本 |
操作系统 | CentOS Linux release 7.8.2003 (Core) |
CDH | 6.3.2 |
StreamSets Data Collector (简称SDC) | 3.16.1 |
由于CDH启用了Kerberos和Sentry,在通过SDC构建Hive漂移同步的Pipeline之前,需要做一些配置。
SDC启用Kerberos之后,默认主体是sdc,下面也是以这个用户进行配置。
设置
HDFS设置
我希望SDC写入Hive warehouse的目录和文件所属是hive用户,要实现这个目的,需要使用SDC的模拟用户配置,同时需要在HDFS中配置sdc的代理配置。
使用管理员登录Cloudera Manger,在HDFS服务的配置中,搜索 core-site.xml 的群集范围高级配置代码段(安全阀),添加如下配置:
配置 | 值 | 说明 |
hadoop.proxyuser.sdc.hosts | * | 允许sdc用户在所有主机上模拟其他用户。 |
hadoop.proxyuser.sdc.groups | * | 允许sdc用户模拟所有用户组的用户。 |
Hive设置
假设SDC向Hive ods数据库写数据,需要为sdc用户进行授权。
SDC可以自动创建不存在的表,没有测试成功,这里使用手动创建表的方法。
手动创建表,不需要将全部字段创建出来,只需要满足创建表的最小语法要求就行,建完表之后,漂移同步会将其他字段创建出来。
Hive漂移同步方案支持Avro和Parqurt两种存储格式,默认支持Avro,如果要使用Parquet,需要增加一个Avro转Parquet的步骤,这里使用Avro格式。
假设目标表名为 ods_user,拥有字段userid,user_name等,使用userid字段建表,建表语句如下:
CREATE TABLE ods_user (
userid INT)
PARTITIONED BY(dt STRING)
STORED AS AVRO;
注意,用于建表的字段类型要和源数据相应字段的类型保持一致,否则sdc会报错。
接下来是权限配置,最低权限配置如下:
对象 | 权限 |
ods | SELECT,INSERT |
ods.* | ALL |
Hive漂移同步解决方案
要点说明
Hive漂移同步解决方案主要通过Hive Metadata processor,Hive Metastore destination,和Hadoop FS 或 MapR FS destination 实现。
另外漂移同步不支持嵌套域,如果有嵌套域,需要增加Field Flattener来展开记录,如下:
主要配置说明
我用到的核心的Stages是Hive Metadata processor,Hive Metastore destination,和Hadoop FS destination。这里对其主要配置进行一些说明,
Hive Metadata processor
General
配置 | 值 |
Stage Library | CDH 6.3.0 |
Hive
配置 | 值 |
JDBC URL | jdbc:hive2://gateway01.bigdata.zxxk.com:10000/default;principal=hive/gateway01.bigdata.zxxk.com@BIGDATA.ZXXK.COM |
Hadoop Configuration Directory | /etc/hive/conf |
Table
配置 | 值 | 说明 |
Database Expression | ods | 多库多表时,从header属性获取 |
Table Name | ods_user | 多库多表时,从header属性获取 |
Partition Configuration | 表分区配置 | |
Decimal Scale Expression | 小数规模。可以使用表达式或常数。 | |
Decimal Precision Expression | 小数精度。可以使用表达式或常数。 |
两个Decimal配置的默认值是针对JDBC Query Consumer 或 JDBC Multitable Consumer产生的数据的。
Advance
配置 | 值 | 说明 |
Data Time Zone | +8:00 CT (Asia/Chongqing) | 时区。 |
Data Format
配置 | 值 |
Data Format | Avro |
Hive Metastore destination
General
配置 | 值 |
Stage Library | CDH 6.3.0 |
Hive
配置 | 值 |
JDBC URL | jdbc:hive2://gateway01.bigdata.zxxk.com:10000/default;principal=hive/gateway01.bigdata.zxxk.com@BIGDATA.ZXXK.COM |
Hadoop Configuration Directory | /etc/hive/conf |
Hadoop FS destination
General
配置 | 值 |
Stage Library | CDH 6.3.0 |
Connection
配置 | 值 | 说明 |
Impersonation User | hive | 模拟用户。 |
Kerberos Authentication | True | 使用Kerberos认证。 |
Configuration Files Directory | /etc/hadoop/conf |
Output Files
配置 | 值 | 说明 |
Directory in Header | 通用。如果True,则从header属性的targetDirectory中读取。如果False,则使用Directory Template配置。 | |
Directory Template | /user/hive/warehouse/ods.db/ods_user | 适用于单库单表,可以指定固定的值。 |
Data Time Zone | +8:00 CT (Asia/Chongqing) | 时区。 |
Use Roll Attribute | True | 使用滚动属性。 |
Roll Attribute Name | roll | 固定值。不要使用其他值。 |
Data Format
配置 | 值 |
Data Format | Avro |
Avro Schema Location | In Record Header |