移动云湖仓一体的探索与实践

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. !"#$ %&'()*+ 移动云湖仓一体的探索与实践 中国移动云能力中心 2021年11月
2. 目录 S 01 湖仓一体概述 02 移动云LakeHouse实践 03 应用前景 目 录
3. 01 湖仓一体概述
4. 关于湖仓一体 “湖仓一体”的概念最早起源于Databricks公司提出的Lakehouse架构,它不是某个产品,而是数据管理领域中的一种开放的技术架构范例。随 着大数据和云原生技术的发展和融合,湖仓一体更能发挥出数据湖的灵活性与生态丰富性,以及数据仓库的成长性(成本、性能、安全、治理等 企业级能力)。 关键点一 湖和仓的数据/元数据在不需要用户人工干预 使 用 成 本 的情况下,可以无缝打通、自由顺畅地流动 (由外向内入湖、由内向外出湖、围绕周边环 云上数据湖 成长性 灵活性 湖) 关键点二 云数据仓库 系统根据特定的规则自动地将数据在湖仓之间 进行缓存和移动,并能与数据科学相关的高级 业务规模 功能打通,进一步实现敏捷分析和深度智能
5. 主要理念 随着业务数据量的爆炸式增长以及业务对高时效性的要求,大数据分析技术经历了从传统数仓到数据湖,再到湖仓一体的演进。传统基于 Hadoop的大数据平台架构也是一种数据湖架构,湖仓一体的核心理念以及与当前Hadoop集群架构的区别大致如下: 统一的存储系统 • 数据传输,逐渐演进到统一存储系统, 降低集群间传输消耗 存储多种格式的原始数据 • 当前根据业务分多个集群,之间大量 当前底层存储单一,主要以 HDFS为主,逐渐演进为支 持多种介质,多种类型数据 的统一存储系统 支持上层多种计算框架 • 当前计算框架以MR/Spark为主,未来 演进为在数据湖上直接构建更多计算框 架和应用场景
6. 02 移动云LakeHouse实践
7. 整体架构 云原生大数据分析LakeHouse采用计算和存储分离架构,基于移动云EOS和内置HDFS提供了支持Hudi存储机制的湖仓一体方案,通过内置 Spark引擎进行交互式查询,可以快速洞察业务数据变化。
8. 核心功能 01 02 03 04 存储和计算分离 • 存储层与计算层分离部署,存储和计算支持独立弹性扩缩容,相互之间没有影响 • 存储支持对象存储和HDFS,HDFS存储结构化数据,提供高性能存储,对象存储存储非结构化、 原始数据、冷数据,提供高性价比 • 计算支持多引擎,Spark、Presto、Flink均实现serverless化,即开即用,满足不同场景 一键入湖 • • • • 支持连接云上云下多种数据库与存储 入湖流程自动化,降低用户的配置成本 降低对数据源的额外负载,控制在10%以内,支持根据数据源的实例规格自动调整连接数 支持增量更新Hudi 智能元数据发现 • • • • 基于规则,智能识别结构化、半结构化文件的元数据,构建数据目录 自动感知元数据变化 统一元数据,提供类HiveMeta API 智能数据路由和权限统一管控 按量计费 • 存储资源按照使用量计费 • 计算资源支持多种计费模式 • 支持弹性调整租户集群资源规格,快速扩缩容
9. 基于RBF的逻辑视图 在基于Hive构造的数据湖体系中,每个Hive db通常对应一个数仓实例,共享统一的存储HDFS,为了实现存储资源的多租户隔离特性,我们借 鉴RBF的统一视图隔离能力,通过不同的Znode来隔离多个数仓实例StateStore,使每个数仓拥有自己独立的逻辑视图,同时利用RBF挂载多NS 的能力来实现NameNode负载均衡的效果。此外,为顺应云原生趋势,我们将RBF服务容器化部署,在创建Hive db时指定由RBF构成的HDFS schema路径,可以实现资源快速的创建、扩展和回收。 Kubernetes ApiServer NameSpace1 RBF Pod1 Hive db 1 RBF Pod2 Hive db 2 NameSpace2 fs.defaultFS=hdfs://rbf1 hdfs dfs -mkdir /tmp fs.defaultFS=hdfs://rbf2 hdfs dfs -mkdir /tmp NameSpace 3 这样,通过为用户提供单独的存储逻辑视图,不仅可以隔离不同数仓实例之间的数据,又能借助RBF对底层HDFS的均衡负载来实现对Hive数据 的负载均衡。例如,对Hive db目录hivedbdir通过RBF方式mount到两个Namespace: $ hdfs dfsrouteradmin -add /hivedbdir ns1,ns2 /data -order HASH_ALL
10. Hive在对象存储的多租户实现 在公有云场景下,不同用户的bucket认证信息不同,需要多次配置并重启HiveServer服务,无法在对象存储上实现Hive多租户的效果。为解决 这个问题,我们通过在表属性tblproperties中添加s3的认证参数,在访问bucket时加载表属性中的认证信息至threadlocal conf变量,来完成 session级别的认证参数传递。这样就在不重启Hive服务的情况下支持了多bucket认证,达到了对象存储上的Hive多租户效果。 Hive Client 1 Hive Client 2 HiveServer2 MetaStore bucket 1 建表语法示例如下: create external table testcephtbl (id int) location 's3a://bucket1/tmp/testlocation' tblproperties ('fs.s3a.access.key'='xxx,'fs.s3a.endpoint'='xxx','fs.s3a.secret.key'='xxx); bucket 2
11. 优化引擎访问对象存储 在大数据生态中,多种计算引擎都可以通过Metastore服务访问Hive中的数据,例如SparkSQL要访问存在对象存储中的Hive数据,需要在提交 作业的Driver模块中根据表的location信息加载对应bucket认证信息,提交命令如下: $SPARK_HOME/bin/beeline -u “jdbc:hive2://host:port/default?fs.s3a.access.key=xxx;fs.s3a.endpoint=xxx ;fs.s3a.endpoint=xxx”-e “select a.id from test1 a join test2 on a.id=b.id” 也就是说,用户需要感知数据是存在对象存储中,并且很难确定一个SQL中的多个表属于哪几个bucket,严重影响了业务开发进度。为此,我们 基于之前的Hive表属性实现了获取对象存储认证参数插件,用户无需感知SQL中的表来自哪个bucket,也无需在提交SQL时指定认证参数,如下: Spark SQL Driver Auth Plugin MetaStore bucket 1 bucket 2 最终提交SQL作业命令如下: $SPARK_HOME/bin/beeline -u “jdbc:hive2://host:port/default”-e “select a.id from test1 a join test2 on a.id=b.id”
12. Serverless实现 这里以Spark为例,通过RBF的多租户实现,Spark进程运行在安全隔离的K8S Namespace中,每个Namespace根据资源规格对应不同的计算 单元(例如:1CU=1 core * 4GB)。对于微批的场景,使用SQL Console每提交一个task,engine模块会启动一个Spark集群,为Driver和 Executor按特定的算法申请相应的计算资源来运行计算任务,任务结束后资源即刻回收;对于即席的场景,可以使用JDBC提交task,engine模 块通过Kyuubi服务启动一个session可配置的spark集群,长驻一段时间后回收资源;所有的SQL task只有在运行成功后按实际的资源规格计费。 SQL Console JDBC/ODBC Spark JAR SQL Parser (Compatible with SparkSQL and HiveSQL) Kubernetes YuniKorn Capacity Management/Job Scheduling Namespace-1 Namespace-N …… Without Serverless With Serverless ① 购买服务器,构建集群 ① 注册移动云账号,订购LakeHouse实例 ② 部署一套开源大数据基础组件:HDFS、Zookeeper、Yarn、Ranger、Hive等 ② 创建数据同步任务 ③ 利用不同工具导入数据 ③ 编写查询SQL计算,输出结果 ④ 编写查询SQL计算,输出结果 ④ 服务全托管,全程无运维 ⑤ 各种繁琐的运维
13. 元数据管理与发现 元数据管理模块基于特定规则,智能识别结构化、半结构化文件的元数据来构建数据目录,通过周期性的元数据爬取实现自动感知元数据变化, 并提供多种优化策略来降低爬取时对数据源的负载;同时,提供类Hive Metastore的API供多种计算引擎直接对表进行访问:
14. Serverless一键入湖 为实现Serverless的入湖创建,我们采用了基于Flink的分布式数据同步框架FlinkX,来满足多种异构数据源之间高效的数据迁移,具备以下特点: • 资源弹性:作业运行在K8S上,资源隔离,支持分布式运行和弹性扩缩容 • 灵活性:将源/目标数据源抽象成Reader/Writer插件,支持双向读写和多种数据源 • 易用性:操作简化,支持批流一体、断点续传,可自动调整数据源连接数,降低侵入性 • 用户通过JobManager创建并提交task配置,通过Quartz调 度task,作业运行时调用Flink K8S客户端访问K8S Master 创建出Flink Master所需要的资源,并启动相应的Container • Flink Master Deployment里面内置一个用户FlinkX Jar,这 时Cluster Entrypoint就会从中去运行main函数,然后产生 JobGraph;之后再提交到Dispatcher,Dispatcher会启动 一个 JobMaster向K8s ResourceManager申请资源,RM发 现没有可用的资源会继续向K8S Master申请资源,请求资源 之后将其发送回去,启动新的TaskManager • TaskManager启动之后再注册回来,此时RM再向它申请 slot提供给JobMaster,最后由 JobMaster将相应的FlinkX Task部署到TaskManager上。这样整个Flink集群的拉起, 到用户提交Jar都完成了
15. JDBC支持 为了提升不同用户的数据分析体验,我们基于Kyuubi来支持多租户、多种计算引擎的JDBC连接服务,Kyuubi具有完整的认证和授权服务,支持 高可用性和负载均衡,并且提供两级弹性资源管理架构,可以有效提高资源利用率。 Spark thrift server kyuubi 多租户 否 是 高可用 否 是 资源占用 永久 通过engine动态申请释放 资源调度 自管理 Yarn&Kubernetes 在使用过程中,为了适配移动云的账号体系以及LakeHouse架构,我们对Kyuubi相应的模块进行了优化和改造,部分如下: • 用户认证:基于移动云AccessKey,SecretKey对接移动云认证体系。 • 资源管理:Kyuubi原生只支持用户指定资源,基于云原生适配后禁止用户指定资源,统一由Lakehouse进行资源调度和分配。 • 权限管控:适配Lakehouse底层权限管理体系,实现细粒度权限的管控。 • 云原生部署:基于Helm3的kyuubi server云原生部署,支持高可用和负载均衡 • 对象存储:支持对象存储表识别和动态ak,sk权限认证
16. 增量更新 我们使用Hudi作为数据存储中间层,能够基于HDFS、对象存储等底层存储,支持ACID语义、实现快速更新能力。常见的流场景如下: • 将Kafka/MySQL binlog中的数据借助DeltaStreamer/CDC通过定时Flink任务写入到Hudi表中 • 通过Flink/Spark任务同步Hive元数据 • 部分源数据修改 • 用户访问和查询数据 权衡 COW MOR 数据延迟 更高 更低 更新代价(I/O) 更高(重写整个parquet文件) 更低(追加到增量日志) Parquet文件大小 更小(高更新代价(I/o)) 更大(低更新代价) 写放大 更高 更低(取决于压缩策略) Ø 对于实时性要求不高的场景尽量使用COW(写时复制)表类型,如果对数 据新鲜度有一定要求则可使用MOR(读写合并) Ø MOR会比COR更容易产生小文件并且对资源需求更高
17. 03 应用前景
18. 构建云原生大数据分析平台 LakeHouse支持多样化数据来源,包括但不限于应用自身产生的数据、采集的各类日志数据、数据库中抽取的各类数据,并提供离线批处理、实 时计算、交互式查询等能力,节省了搭建传统大数据平台需投入的大量软硬件资源、研发成本及运维成本。 DB 转储 SQL交互式分析查 询 上传 对象存储 /HDFS/ Hudi Streaming 实时 离线计算、机器 学习
19. 谢 谢!

首页 - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-24 22:50
浙ICP备14020137号-1 $访客地图$