Relational Cache是EMR Spark支持的一个重要特性,主要经过对数据进行预组织和预计算加速数据分析,提供了相似传统数据仓库物化视图的功能。除了用于提高数据处理速度,Relational Cache还能够应用于其余不少场景,本文主要介绍如何使用Relational Cache跨集群同步数据表。
经过统一的Data Lake管理全部数据是许多公司追求的目标,可是在现实中,因为多个数据中心,不一样网络Region,甚至不一样部门的存在,不可避免的会存在多个不一样的大数据集群,不一样集群的数据同步需求广泛存在,此外,集群迁移,搬站涉及到的新老数据同步也是一个常见的问题。数据同步的工做一般是一个比较痛苦的过程,迁移工具的开发,增量数据处理,读写的同步,后续的数据比对等等,须要不少的定制开发和人工介入。基于Relational Cache,用户能够简化这部分的工做,以较小的代价实现跨集群的数据同步。
下面咱们以具体示例展现如何经过EMR Spark Relational Cache实现跨集群的数据同步。网络
假设咱们有A,B两个集群,须要把activity_log表的数据从集群A同步到集群B中,且在整个过程当中,会持续有新的数据插入到activity_log表中,A集群中activity_log的建表语句以下:工具
CREATE TABLE activity_log ( user_id STRING, act_type STRING, module_id INT, d_year INT) USING JSON PARTITIONED BY (d_year)
插入两条信息表明历史信息:大数据
INSERT INTO TABLE activity_log PARTITION (d_year = 2017) VALUES("user_001", "NOTIFICATION", 10), ("user_101", "SCAN", 2)
为activity_log表建一个Relational Cache:spa
CACHE TABLE activity_log_sync REFRESH ON COMMIT DISABLE REWRITE USING JSON PARTITIONED BY (d_year) LOCATION "hdfs://192.168.1.36:9000/user/hive/data/activity_log" AS SELECT user_id, act_type, module_id, d_year FROM activity_log
REFRESH ON COMMIT表示当源表数据发生更新时,自动更新cache数据。经过LOCATION能够指定cache的数据的存储地址,咱们把cache的地址指向B集群的HDFS从而实现数据从集群A到集群B的同步。此外Cache的字段和Partition信息均与源表保持一致。code
在集群B中,咱们也建立一个activity_log表,建立语句以下:blog
CREATE TABLE activity_log ( user_id STRING, act_type STRING, module_id INT, d_year INT) USING JSON PARTITIONED BY (d_year) LOCATION "hdfs:///user/hive/data/activity_log"
执行MSCK REPAIR TABLE activity_log自动修复相关meta信息,而后执行查询语句,能够看到在集群B中,已经可以查到以前集群A的表中插入的两条数据。开发
在集群A中继续插入新的数据:get
INSERT INTO TABLE activity_log PARTITION (d_year = 2018) VALUES("user_011", "SUBCRIBE", 24);
而后在集群B中执行MSCK REPAIR TABLE activity_log并再次查询activity_log表,能够发现数据已经自动同步到集群B的activity_log表中,对于分区表,当有新的分区数据加入时,Relational Cache能够增量的同步新的分区数据,而不是从新同步所有数据。同步
若是集群A中activity_log的新增数据不是经过Spark插入的,而是经过Hive或其余方式外部导入到Hive表中,用户能够经过REFRESH TABLE activity_log_sync语句手工或经过脚本触发同步数据,若是新增数据是按照分区批量导入,还能够经过相似REFRESH TABLE activity_log_sync WITH TABLE activity_log PARTITION (d_year=2018)语句增量同步分区数据。数据分析
Relational Cache能够保证集群A和集群B中activity_log表的数据一致性,依赖activity_log表的下游任务或应用能够随时切换到集群B,同时用户也能够随时将写入数据到集群A中activity_log表的应用或服务暂停,指向集群B中的activity_log表并重启服务,从而完成上层应用或服务的迁移。完成后清理集群A中的activity_log和activity_log_sync便可。
本文介绍了如何经过Relational Cache在不一样大数据集群的数据表之间同步数据,很是简单便捷。除此以外,Relational Cache也能够应用到不少其余的场景中,好比构建秒级响应的OLAP平台,交互式的BI,Dashboard应用,加速ETL过程等等,以后咱们也会和你们分享在更多场景中Relational Cache的最佳实践。
原文连接 本文为云栖社区原创内容,未经容许不得转载。