浅谈数据湖
ai和数据湖
https://developer.aliyun.com/article/772905

在华为云是否支持hudi,,是否能虚拟机中再docker?目标:1 和hive的底层schema index和计算区别 2 读 写分离? 3 和presto怎么结合(对于1小时批处理业务) 4 和spark stream的结合?类实时业务 5 是否能替换oltp mongo? 6 历史数据如何兼容

  • Upsert:这个主要是解决批式模型中,数据不能插入、更新的问题,有了这个特性,我们可以往 Hive 中写入增量数据,而不是每次进行完全的覆盖。(Hudi 自身维护了 key->file 的映射,所以当 upsert 时很容易找到 key 对应的文件)
  • Incremental Query:增量查询,减少计算的原始数据量。以 Uber 中司机和乘客的数据流 Join 为例,每次抓取两条数据流中的增量数据进行批式的 Join 即可,相比流式数据而言,成本要降低几个数量级。

对于 Copy-On-Write Table,用户的 update 会重写数据所在的文件,所以是一个写放大很高,但是读放大为 0,适合写少读多的场景。

对于 Merge-On-Read Table,整体的结构有点像 LSM-Tree,用户的写入先写入到 delta data 中,这部分数据使用行存,这部分 delta data 可以手动 merge 到存量文件中,整理为 parquet 的列存结构(一定时候触发最终写)。对于这类 Tabel,提供了三种查询:

  • Snapshot Query: 查询最近一次 snapshot 的数据,也就是最新的数据。这里是一个行列数据混合的查询。
  • Incrementabl Query:用户需要指定一个 commit time,然后 Hudi 会扫描文件中的记录,过滤出 commit_time > 用户指定的 commit time 的记录。这里是一个行列数据混合的查询。
  • Read Optimized Query: 只查存量数据,不查增量数据,因为使用的都是列式文件格式,所以效率较高。

    Iceberg 的初衷是解决 Netflix 内部文件格式混乱的问题,

https://zhuanlan.zhihu.com/p/149706105

Hudi是一个开源Spark库,用于在Hadoop上执行诸如更新,插入和删除之类的操作。它还允许用户仅摄取更改的数据,从而提高查询效率。

image.png
HDFS上的分析数据集通过两种类型的表提供服务:
读优化表(Read Optimized Table),通过列式存储提供查询性能
近实时表(Near-Real-Time Table),提供实时(基于行的存储和列式存储的组合)查询。

image.png

这两种原语分别是:

  • Update/Delete记录:Hudi使用细粒度的文件/记录级别索引来支持Update/Delete记录,同时还提供写操作的事务保证。查询会处理最后一个提交的快照,并基于此输出结果。
  • 变更流:Hudi对获取数据变更提供了一流的支持:可以从给定的时间点获取给定表中已updated/inserted/deleted的所有记录的增量流,并解锁新的查询姿势(类别)。

自管理:Hudi注意到用户可能对数据新鲜度(写友好)与查询性能(读/查询友好)有不同的期望,它支持了三种查询类型,这些类型提供实时快照,增量流以及稍早的纯列数据(ggg)。在每一步,Hudi都努力做到自我管理(例如自动优化编写程序的并行性,保持文件大小)和自我修复(例如:自动回滚失败的提交),即使这样做会稍微增加运行时成本(例如:在内存中缓存输入数据已分析工作负载)。如果没有这些内置的操作杠杆/自我管理功能,这些大型流水线的运营成本通常会翻倍。

会在支持DFS的存储上生成代表Hudi表的一组文件。然后,在具有一定保证的情况下,诸如Apache Spark、Presto、Apache Hive之类的查询引擎可以查询该表。Hudi表的三个主要组件:1)有序的时间轴元数据。??类似于数据库事务日志。2)分层布局的数据文件:实际写入表中的数据。3)索引(多种实现方式):映射包含指定记录的数据集。

image.png

Hudi使用上述机制以及“precombine_key”机制来保证不会存在重复的记录。

时间轴类似于数据库的redo/transaction日志,由一组时间轴实例组成。Hudi保证在时间轴上执行的操作的原子性和基于即时时间的时间轴一致性。时间轴被实现为表基础路径下.hoodie元数据文件夹下的一组文件。

Hudi将表组织成DFS上基本路径下的文件夹结构中。在每个分区内,文件被组织成文件组,由文件ID唯一标识。其中每个切片包含在某个提交/压缩即时时间生成的基本列文件(.parquet)以及一组日志文件(.log*),该文件包含自生成基本文件以来对基本文件的插入/更新。Hudi采用了MVCC设计,压缩操作会将日志和基本文件合并以产生新的文件片

Hudi索引可以根据其查询分区记录的能力进行分类:1)全局索引 ?? 不需要分区信息即可查询记录键映射的文件ID。比如,写程序可以传入null或者任何字符串作为分区路径(partitionPath),但索引仍然会查找到该记录的位置。全局索引在记录键在整张表中保证唯一的情况下非常有用,但是查询的消耗随着表的大小呈函数式增加。2)非全局索引:与全局索引不同,非全局索引依赖分区路径(partitionPath),对于给定的记录键,它只会在给定分区路径下查找该记录。这比较适合总是同时生成分区路径和记录键的场景,同时还能享受到更好的扩展性,因为查询索引的消耗只与写入到该分区下数据集大小有关系。

了解Hudi数据源或者deltastreamer工具提供的3种不同写操作:
1)upsert操作:这是默认操作,在该操作中,首先通过查询索引将数据记录标记为插入或更新,然后再运行试探法确定如何最好地将他们打包到存储,以对文件大小进行优化,最终将记录写入。对于诸如数据库更改捕获之类的用例,建议在输入几乎肯定包含更新的情况下使用此操作。2)insert操作:与upsert相比,insert操作也会运行试探法确定打包方式,优化文件大小,但会完全跳过索引查询。因此对于诸如日志重复数据删除(结合下面提到的过滤重复项选项)的用例而言,它比upsert的速度快得多。这也适用于数据集可以容忍重复项,但只需要Hudi具有事务性写/增量拉取/存储管理功能的用例。3)bulk insert操作:upsert 和insert操作都会将输入记录保留在内存中,以加快存储启发式计算速度,因此对于最初加载/引导Hudi数据集的用例而言可能会很麻烦。Bulk insert提供了与insert相同的语义,同时实现了基于排序的数据写入算法,该算法可以很好的扩展数百TB的初始负载。但是这只是在调整文件大小方面进行的最大努力,而不是像insert/update那样保证文件大小。

压缩是一个 instant操作,它将一组文件片作为输入,将每个文件切片中的所有日志文件与其basefile文件(parquet文件)合并,以生成新的压缩文件片,并写为时间轴上的一个commit。
Hudi DeltaStreamer之类的工具支持边界的连续模式,其中的压缩和写入操作就是以异步压缩方式在单个Spark运行时集群中进行的。

Hudi支持两种清理方式:1)按commits / deltacommits清理
2)按保留的文件片清理???:这是一种更为简单的清理方式,这里我们仅保存每个文件组中的最后N个文件片。诸如Apache Hive之类的某些查询引擎会处理非常大的查询,这些查询可能需要几个小时才能完成,在这种情况下,将N设置为足够大以至于不会删除查询仍然可以访问的文件片是很有用的。

在DFS上存储数据的关键是管理文件大小和计数以及回收存储空间。例如,HDFS在处理小文件问题上臭名昭著—在NameNode上施加内存/RPC压力,可能破坏整个集群的稳定性。通常,查询引擎可在适当大小的列文件上提供更好的性能,因为它们可以有效地摊销获取列统计信息等的成本。即使在某些云数据存储上,列出包含大量小文件的目录也会产生成本。下面是一些Hudi高效写,管理数据存储的方法:1)小文件处理特性会剖析输入的工作负载,并将内容分配到现有的文件组,而不是创建新文件组(这会导致生成小文件)。2)在writer中使用一个时间轴缓存,这样只要Spark集群不每次都重启,后续的写操作就不需要列出DFS目录来获取指定分区路径下的文件片列表。3)用户还可以调整基本文件和日志文件大小之间的比值系数以及期望的压缩率,以便将足够数量的insert分到统一文件组,从而生成大小合适的基本文件。4)智能调整bulk insert并行度,可以再次调整大小合适的初始文件组。实际上,正确执行此操作非常关键,因为文件组一旦创建就不能被删除,而只能如前面所述对其进行扩展。

Hudi能够支持三种不同的查询表方式,具体取决于表的类型。

https://zhuanlan.zhihu.com/p/131210053

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。.MVCC多版本并发控制指的是 “维持一个数据的多个版本,使得读写操作没有冲突” 这么一个概念。仅仅是一个理想概念
https://www.jianshu.com/p/8845ddca3b23

https://codechina.csdn.net/mirrors/hj2016/hudi-test?

https://blog.csdn.net/h335146502/article/details/104485494

https://github.com/XuQianJin-Stars/hudi-demos

https://github.com/XDSZJ/spark-hudi

https://hudi.apache.org/docs/0.8.0-docker_demo.html

https://github.com/oliversavio/hudi-data-lake-example
https://olivermascarenhas.com/2020-04-13-building-analytical-datalake-with-apache-spark-and-apache-hudi/

实验

upsert操作 insert操作 bulk insert操作
全局索引 和非全局索引
快照查询 增量查询 读优化查询

udi提供了以下功能来对基础数据进行写入、查询,这使其成为大型数据湖的重要模块:1)支持快速,可插拔索引的upsert();2)高效、只扫描新数据的增量查询;3)原子性的数据发布和回滚,支持恢复的Savepoint;4)使用mvcc(多版本并发控制)风格设计的读和写快照隔离;5)使用统计信息管理文件大小;6)已有记录update/delta的自管理压缩;7)审核数据修改的时间轴元数据;8)满足GDPR(通用数据保护条例)、数据删除功能。

主要为数据清洗包括对数据进行过滤、去重、格式转换、数据校验等操作,生成满足标准及质量的数据;数据提取包括,从源格式数据提取出目标格式数据,包括人脸结构化、车牌结构化、归属地、经纬度等;数据关联是根据业务的关联规则或算法,将数据和其它知识数据、业务数据等进行关联,并输出关联信息,以提升数据的关联及价值

问题

1 支持存储各种类型和格式的源数据保持支持?

2 数据池优化

3 内存数据池

4 数据的提取、清洗、脱敏、对比和关联用模板

???业务层和大数据层业务分开;k8s调度时,怎么统一规划调度

EB级数据,元数据也很大,需要解决
https://blog.csdn.net/qq_45401061/article/details/103782542