0%

1 Spark 使用

1.1 copy file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.apache.hadoop.fs.{FileAlreadyExistsException, FileSystem, FileUtil, Path}

val srcFileSystem: FileSystem = FileSystemUtil
.apply(spark.sparkContext.hadoopConfiguration)
.getFileSystem(sourceFile)
val dstFileSystem: FileSystem = FileSystemUtil
.apply(spark.sparkContext.hadoopConfiguration)
.getFileSystem(sourceFile)

FileUtil.copy(
srcFileSystem,
new Path(new URI(sourceFile)),
dstFileSystem,
new Path(new URI(targetFile)),
true,
spark.sparkContext.hadoopConfiguration)

hudi源码走读

  • index 用来检索哪部分文件的?
  • Flink dataStream.transform 的作用
  • Flink hudi pipeline
  • hoodie key生成规则:recordKey + partition Key
  • recordKeyField = primary key
  • FileId如何生成的?

km文章-Apache Hudi 快速入门

https://km.woa.com/group/51977/articles/show/510278

  • 增量更新 如何发现变动的数据,定期启动下游任务
  • 增量更新 实时任务如何触发
  • 现有小时粒度更新,如何处理延迟数据
  • 面向应用层的数据每天输出一次,如何确定时机
  • 监管场景 重点需要了解
  • Flink写hudi回放时,如何确保exactly once?
  • timeline 支持的增量查询时间区间如何选择
  • 数据已经cleans了,还能不能找到旧的timeline
  • parquet文件大小与查询性能关系
  • 索引是用来定位文件组,文件组是个啥?
  • record key如何确定?
  • hudi upsert如何添加合并逻辑
  • spark和flink如何指定timeline时间来增量读取
  • 三种视图无法满足业务对同一份数据的多种使用方式吧?数据摄取、查询性能和成本 不可调和,compaction异步也无法解决全部问题
  • 增量视图 为什么只能是cow?
  • mor模式读取时是由presto或者spark来做读时合并?合并过程中新文件如何处理?
  • hudi 与 iceberg 混合查询能否可行?

日期: 5月7日, 08:10

Hudi论文

lessf 收集的材料

hudi, 原名: hoodie, Hadoop Upsert Delete and Incremental

背景

Uber希望在存储上做到流批统一,需要让负责批量写入的存储系统也能支持实时写入,这就产生了update和delete的需求。为什么呢?有多种原因,例如实时计算常有的迟到数据,还有业务时效性要求以及一些合规需求(GDPR要求平台允许用户删除自己的数据)。而众所众知的是,无论是HDFS还是云平台的对象存储(例如aws的s3,阿里云的oss等),都不支持update而只能overwrite,因此要实现update和delete功能,就必须在底层存储之上做文章。Hudi于是应运而生

Upsert - hudi的招牌

如何在一个只能overwrite的文件系统上实现update操作?

hudi的思想:
把一个完整的文件拆分为多个“小文件”,当需要更新其中某条记录时,只要把包含这条记录的“小文件”给重写一遍即可

COW: Copy On Write

RECORDKEY_FIELD_OPT_KEY: 作为recordKey的字段名, 如txn_id

PARTITIONPATH_FIELD_OPT_KEY: 作为partitionPath的字段名, 如 fdate

Upsert的过程整体分为3步(这里省略了很多不太重要的步骤):

  1. 根据partitionPath进行重新分区
  2. Tagging: 根据recordKey确定哪些记录需要插入,哪些记录需要更新。对于需要更新的记录,还需要找到旧的记录所在的文件.
    tagging需要在已有的数据里寻找key相同的record,如果表的数据量比较大时会非常耗时
  3. 把记录写入实际的文件

MOR: Merge On Read

0.3.5版本开始引入

主要是写入性能

COW表每次在写入时,会把新写入的数据和老数据合并以后,再写成新的文件。 单单是写入的过程(不包含前期的repartition和tagging过程),就包含至少三个步骤:

  1. 读取老数据的parquet文件(涉及对parquet文件解码,不轻松
  2. 将老数据和新数据合并
  3. 将合并后的数据重新写成parquet文件(又涉及parquet文件编码,也不轻松

upsert时把变更内容写入log文件,然后定期合并log文件和base文件。 这样的好处是避免了写入时读取老数据,也就避免了parquet文件不轻松的编解码过程,只需要把变更记录写入一个文件即可(而且是顺序写入)。显然是 轻松了不少

1
2
3
4
5
6
7
8
9
warehouse
├── .hoodie
├── 20220101
│ ├── fileId1_001.parquet
│ ├── .fileId1_20220312163419285.log
│ └── .fileId1_20220312172212361.log
└── 20220102
├── fileId2_001.parquet
└── .fileId2_20220312163512913.log

MOR表在更新时只会把更新的那部分数据写入一个.log文件,因为.log文件不包含老数据,也不涉及tagging,又是顺序写入的,所以写入会非常快。而当客户端要读取数据时,会有两种选择:

读取时merge,同时定期地compact

  1. 读取时动态地把.log文件和原始数据文件(称为base文件)进行merge
    • 数据保证最新,缺点是读取的性能较差
  2. 异步地把.log文件和base文件merge,如果merge还没完成,只能读到上个版本的数据
  • 异步merge(称为compaction)有一定的延迟

Merge on read: Hudi的读取过程是实时地把base数据和log数据合并起来,并返回给用户

实时合并的实现方式是把所有log文件读入内存,放在一个HashMap里,然后遍历base文件,把base数据和缓存在内存里的log数据进行join,最后才得到合并后的结果。难免会影响到读取效率。

对于MOR表,Hudi支持3种query类型,分别是:

  1. Snapshot Query
  2. Incremental Query
  3. Read Optimized Query

其中: 1和3就是为了平衡读和写之间的取舍。这两者的区别是:
Snapshot Query和上文所说的一样,读取时进行“实时合并”;
Read Optimized Query则不同,只读取base文件,不读取log文件,因此读取效率和COW表相同,但读到的数据可能不是最新的。

Index

Tagging过程中,需要使用Index判断一条数据是否已经插入过。

Bloom Index:实现原理是bloom filter。优点是效率高,缺点是bloom filter固有的假阳性问题,所以Hudi对bloom filter里存在的key,还需要回溯原文件再查找一遍。Hudi默认使用的是Bloom Index

Simple Index:实现原理是把新数据和老数据进行join。优点是实现最简单,无需额外的资源。缺点是性能比较差。

HBase Index:实现原理是把index存放在HBase里面。优点是性能最高,缺点是需要外部的系统,增加了运维压力。

global index里面存放了一张表里所有record的key,而non-global index是每个partition都有一个对应的index,里面只存放了本partition的key。如果用户使用non-global index,就必须保证同一个key的record不会出现在多个partition里面
non-global index主要是出于index的维护成本和写入性能考虑。因为维护一个global index的难度更大,对写入性能的影响也更大。

事务: Transactional

Timeline

特性 功能
原子性 写入即使失败,也不会造成数据损坏
隔离性 读写分离,写入不影响读取,不会读到写入中途的数据
回滚 可以回滚变更,把数据恢复到旧版本
时间旅行 可以读取旧版本的数据(但太老的版本会被清理掉)
存档 可以长期保存旧版本数据(存档的版本不会被自动清理)
增量读取 可以读取任意两个版本之间的差分数据

Hudi在这张表的timeline里(实际存放在.hoodie目录下)会记录下v1和v2对应的文件列表。当client读取数据时,首先会查看timeline里最新的commit是哪个,从最新的commit里获得对应的文件列表,再去这些文件读取真正的数据。

多版本隔离的能力。当一个client正在读取v1的数据时,另一个client可以同时写入新的数据,新的数据会被写入新的文件里,不影响v1用到的数据文件。只有当数据全部写完以后,v2才会被commit到timeline里面。后续的client再读取时,读到的就是v2的数据。

顺带一提的是,尽管Hudi具备多版本数据管理的能力,但旧版本的数据不会无限制地保留下去。Hudi会在新的commit完成时开始清理旧的数据,默认的策略是“清理早于10个commit前的数据”。

Incremental Query(增量查询

其实Hudi对每一条数据,都有一个隐藏字段_hoodie_commit_time用于记录commit时间,这个字段会和其他数据字段一起保存在parquet文件里
Hudi在读取parquet文件时,会同时用这个字段对结果进行过滤,把不属于时间范围内的记录都过滤掉。


不仅仅是 表格式

表格式 包括表的布局、表的Schema和对表更高的元数据跟踪

Hudi 使用 Avro 格式来存储、管理和演进表的schema
Hudi 强制执行 schema-on-write

timeline

索引时间线

索引机制

[[hudi-indexing-mechanisms]]

并发控制

集成Presto

https://prestodb.io/blog/2020/08/04/prestodb-and-hudi


【参考文献】

Apache Hudi落地解读

  1. 字节跳动基于Apache Hudi的数据湖集成实践
    https://mp.weixin.qq.com/s/LzgN3IlSplCxmWdhJyQz7Q

  2. 字节跳动数据湖技术选型的思考
    https://mp.weixin.qq.com/s/X3e9SFYzIPAQb72YiN3SOw

  3. 基于Apache Hudi + Flink的亿级数据入湖实践
    https://mp.weixin.qq.com/s/sqDjyCRaXxDhQuVxzup02w

  4. OnZoom基于Apache Hudi的流批一体架构实践
    https://mp.weixin.qq.com/s/QYyq6skUc7Yz_Xow3qUd5g

  5. 移动云基于Apache Hudi湖仓一体的探索与实践
    https://mp.weixin.qq.com/s/Ukw2mYyT6gAaBJ8RO7zWGA

  6. Apache Kyuubi + Hudi在 T3 出行的深度实践
    https://mp.weixin.qq.com/s/9hDu2DHvL_61gxqMSQ_Tzg

  7. 字节跳动基于Apache Hudi构建实时数据湖平台实践
    https://mp.weixin.qq.com/s/CplrGCZKIaSEa5MauWm8-Q

  8. 顺丰科技 Hudi on Flink 实时数仓实践
    https://mp.weixin.qq.com/s/vCWWcWBsy6no1MmN2fQYCQ

  9. 37 手游基于 Flink CDC + Hudi 湖仓一体方案实践
    https://mp.weixin.qq.com/s/HJ-6ahtDGPr-OgHex4sdwA

  10. Apache Hudi在华米科技的应用-湖仓一体化改造
    https://mp.weixin.qq.com/s/TJj-2yGySglHgE57vz_ZfA

  11. Apache Hudi 在 B 站构建实时数据湖的实践
    https://mp.weixin.qq.com/s/RpupQivuIbvn0k2Kn9lUDg

  12. 基于Apache Hudi 的CDC数据入湖
    https://mp.weixin.qq.com/s/HejVDANLi7zCZnR606OQ3g

  13. 内附PPT下载|万字干货!阿里云基于Apache Hudi构建Lakehouse实践探索
    https://mp.weixin.qq.com/s/fGZdpEECynGWnPJJRgxspw

  14. 字节跳动基于Apache Hudi构建EB级数据湖实践
    https://mp.weixin.qq.com/s/oZz_2HzPCWgzxwZO0nuDUQ

  15. 快手基于Apache Hudi的实践
    https://mp.weixin.qq.com/s/aE0OadGV1P8HB5_Ski1VGQ

  16. 触宝科技基于Apache Hudi的流批一体架构实践
    https://mp.weixin.qq.com/s/LPcWr-o1KWVa-xpAiOwjig

  17. 基于 Apache Hudi 构建实时数据湖在百信银行的实践
    https://mp.weixin.qq.com/s/teFKWFYFbyD1yM2d1uyh-g

  18. Apache Hudi在Linkflow构建实时数据湖的生产实践
    https://mp.weixin.qq.com/s/u--0XnVGXnSK9E7NvrbzuA

  19. 数仓实时化改造:Hudi on Flink 在顺丰的实践应用
    https://mp.weixin.qq.com/s/H17GXC_ucC6oVLSrv6VBQQ

  20. 最佳实践 | 通过Apache Hudi和Alluxio建设高性能数据湖
    https://mp.weixin.qq.com/s/OdzM5uphMsVWGvNxJ36l9w

  21. 使用Apache Hudi + Amazon EMR进行变化数据捕获(CDC
    https://mp.weixin.qq.com/s/GdWIGOoMmYRZcBYtOmYBHA

  22. T3 出行构建数据湖上低延迟数据 Pipeline 的实践
    https://mp.weixin.qq.com/s/jfDDsdHV-qfouz-NlK_ZFQ

  23. 使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖
    https://mp.weixin.qq.com/s/1GdAbZkslByHgT5KO0Ek-A

  24. 印度最大在线食品杂货公司Grofers的数据湖建设之路
    https://mp.weixin.qq.com/s/U7HH0xK2p48AjlCY5yQ-4g

  25. Apache Hudi助力nClouds加速数据交付
    https://mp.weixin.qq.com/s/kzxgZHjSUQ2stcKrqaUpoQ

  26. Apache Hudi:统一批和近实时分析的存储和服务
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484493&idx=1&sn=66ba1de318960b2ea50f7db95aea3f4b&chksm=e81f513bdf68d82d9b656feb267787c1b74cbc03499ffddecf18ece9f6f15cc9678b7c80b74f&token=1688466117&lang=zh_CN#rd

  27. 贝壳找房利用Hudi构建准实时数仓的实践与挑战
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484149&idx=1&sn=3f222357c7ad844291d0fa29c1c0956a&chksm=e81f5783df68de95e19753910fa793399385217a39312885e48ab78e83d3e9f00689e9194928&token=1889807326&lang=zh_CN#rd

  28. Uber如何使用Apache Hudi近实时分析全球网络
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484384&idx=1&sn=4237093d9405c81f457a3e3886b1178c&chksm=e81f5696df68df8074bc23fc5c8cd4a10e062ce5d9592781f0a885a94fdf210644ae4b0db156&token=1688466117&lang=zh_CN#rd

  29. 使用Apache Hudi和Debezium构建健壮的CDC管道
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484456&idx=1&sn=fcb720042833eb92d57ec8c221173521&chksm=e81f515edf68d8484f870dce27aeceef297003eaaf096920f1dd110f1887fb30196fad91f9a9&token=1688466117&lang=zh_CN#rd

  30. Yotpo基于Apache Hudi构建零延迟数据湖实践
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484287&idx=1&sn=90cfff67d335fe2a5d4974a10c545119&chksm=e81f5609df68df1fef79068550153d8d51025a15a7963f41677a261c7adb31bfccfc7b6a496a&token=1688466117&lang=zh_CN#rd

  31. 电商公司Drop数据湖实践
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484731&idx=1&sn=cf5737be378318e080945d50a1e56368&chksm=e81f504ddf68d95bb9a6aed35f2884ec95da468e9d9ea79d06dd690a6e3bd2d9b727175fd567&token=1688466117&lang=zh_CN#rd

  32. 在线房产公司Zillow数据迁移至数据湖实践
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484713&idx=1&sn=d4af25ff7c3e0e20d3c3320d76b4d264&chksm=e81f505fdf68d949568ab4b1794cd09a41bc583eacf34fcd68a783f9c17fd60fbbc328a17108&token=1688466117&lang=zh_CN#rd

  33. Apache Hudi在医疗大数据中的应用
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484921&idx=1&sn=b625cbac007c9cb8b9e1c911f140906e&chksm=e81f508fdf68d999507211b76f057eec5d601399590471dc92e03b834eec99b1ef7c7d441b6a&token=1688466117&lang=zh_CN#rd

  34. Uber基于Apache Hudi构建PB级数据湖实践
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484948&idx=1&sn=c6f2a8381f339f8a6fbc8c9570a219f5&chksm=e81f5362df68da74634b8269a97a8bbd837bd48a6a1a9715850972ab5f0e1c0910ebac624589&token=1875876260&lang=zh_CN#rd

  35. Apache Hudi丨数据服务实时化利器(在金融场景应用
    https://mp.weixin.qq.com/s/XX9lKWMdAAjGAUG9jLDh1g

Apache Hudi社区

  1. Onehouse 对Apache Hudi开源社区的承诺
    https://mp.weixin.qq.com/s/Mh6nCzeybFeOcTSq83VcGg

  2. 重磅!基于Apache Hudi的商业公司Onehouse成立
    https://mp.weixin.qq.com/s/v1l8y8mIAwoHXajr46RWyA

  3. 来自Apache Hudi PMC Chair的新年大礼包,请注意查收!(附带2021年精选文章集合)
    https://mp.weixin.qq.com/s/zQfyHl7Ux8KPSobRHa3Mjw

  4. Apache Hudi 0.10.0版本重磅发布!
    https://mp.weixin.qq.com/s/UMca2QqGc2eTM3RcKh_SuA

  5. Apache Hudi PMC畅谈Hudi未来演进之路
    https://mp.weixin.qq.com/s/ZNn1xLPHyso2uHaLg1icxQ

  6. Apache Hudi 0.9.0版本重磅发布!更强大的流式数据湖平台
    https://mp.weixin.qq.com/s/_5cFgA5y-fk3b50z8XRYZg

  7. Apache Hudi:新一代流式数据湖平台
    https://mp.weixin.qq.com/s/NKPPDsdk85XJe6w4-kwx9A

  8. 恭喜!Apache Hudi社区新晋多名顶级互联网公司Committer
    https://mp.weixin.qq.com/s/d9r63-4XWr2g1L8Nn_JNpg

  9. 对话Apache Hudi VP,洞悉数据湖的过去现在和未来
    https://mp.weixin.qq.com/s/bTG5fF93o7NE8DqwuaKCtA

  10. 恭喜!Apache Hudi社区新晋顶级互联网公司的PMC和Committer
    https://mp.weixin.qq.com/s/4YsZKViWJrLBWa84d-aY5Q

  11. 致广大数据湖用户的一封信
    https://mp.weixin.qq.com/s/nxDN15v2cf7evo-vktnh0Q

  12. Apache Hudi 0.8.0版本重磅发布
    https://mp.weixin.qq.com/s/VDRr7UzpFPC7cLPmyxrGCw

  13. 恭喜!Apache Hudi社区新晋两位Committer
    https://mp.weixin.qq.com/s/bsRFuW9kGPrU68qwdZ6_yg

  14. Apache Hudi 0.7.0版本重磅发布
    https://mp.weixin.qq.com/s/g8wn6rWUeQ6ID97YyUYoSg

  15. Apache Hudi 0.5.1版本重磅发布
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484532&idx=1&sn=e8f029e5f52fc689397ef2c45dc5bc4d&chksm=e81f5102df68d81420b8b0ebfdb8ed3579c4328b733cfd609c9974f72e7ac58702c822c9ff42&token=1688466117&lang=zh_CN#rd

  16. 终于!Apache Hudi 0.5.2版本正式发布
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484753&idx=1&sn=84062160260ae20f68bb61a254781e0f&chksm=e81f5027df68d9316a8d9b10e2a54804110e7af1e0dcadf1060cfadc0a55acb741a19c990af0&token=1688466117&lang=zh_CN#rd

  17. 特性速览 | Apache Hudi 0.5.3版本正式发布
    https://mp.weixin.qq.com/s/JzDgbbUlrfeQlvtrSJnnVg

  18. Apache Hudi 0.6.0版本重磅发布
    https://mp.weixin.qq.com/s/S0qWaxRtJw9v6ikBVyfylw

  19. 恭喜!Apache Hudi社区新晋多位Committer
    https://mp.weixin.qq.com/s/Hcl4bgcbGpbCxax3dVAf-g

  20. 快速参与下一代数据湖顶级项目ApacheHudi
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484278&idx=1&sn=59f916b6e6a7dfcd36ee88fca21c5442&chksm=e81f5600df68df16e27ad013295eaf858a5d141d55659ccc9dd42817ec34e21b7c34252878e8&token=1688466117&lang=zh_CN#rd

  21. 一行代码成为Apache Contributor
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484782&idx=3&sn=e1c121710c14680e0bf69349eb68424c&chksm=e81f5018df68d90e81b98beb10ff47bc0217774799126abb5ac4a04e25ebb26cf0342aef7016&token=1688466117&lang=zh_CN#rd

  22. 揭秘!Apache Hudi社区发展数据盘点
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484745&idx=1&sn=87ea91750f73067210d6c0a8a29981c9&chksm=e81f503fdf68d92913e494e1cce47a6a63d82ce6440651f2f92737aeeae8282a8442abc373e5&token=1688466117&lang=zh_CN#rd

  23. 首次!Apache Hudi在Apache官方Blog出镜
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484749&idx=1&sn=85d2f9b0cea440aaf4504538d1105729&chksm=e81f503bdf68d92d6732df3cdb6f28b5553387091ff7607ed891fdce408387dde07683dec196&token=1688466117&lang=zh_CN#rd

  24. 一个月增长4倍!数据揭示当下增长势头最猛的开源数据湖框架!
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484871&idx=1&sn=8cf1bbc4fed470f0d52c275e150ce273&chksm=e81f50b1df68d9a7cd577a3f99de08b80e57dab13e6011a01e292bb03fc6b7ecdf039a6248b5&token=1889807326&lang=zh_CN#rd

  25. 官宣!ASF官方正式宣布Apache Hudi成为顶级项目
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484935&idx=1&sn=328222565584a2f3fd5f2ad650bc02bc&chksm=e81f5371df68da672e4cccbad0aea046177696199e6a3330c814d0c2e231d9955d38c5fccbc6&token=1688466117&lang=zh_CN#rd

  26. Apache Hudi:云数据湖解决方案
    https://mp.weixin.qq.com/s/p3uM_wBuYAgyBMk4zmkCdw

Apache Hudi入门系列

  1. 重磅!Vertica集成Apache Hudi指南
    https://mp.weixin.qq.com/s/pIsT_XKaWuLSZrzYING6Vg

  2. 超硬核!详解Apache Hudi灵活的Payload机制
    https://mp.weixin.qq.com/s/xhZCVHw5WhePDUPKns6J_g

  3. 一文带你了解Lakehouse的并发控制:我们是否过于乐观?
    https://mp.weixin.qq.com/s/CqfCx_HCiob0nDNn-ALkCQ

  4. Apache Hudi与Hive集成手册
    https://mp.weixin.qq.com/s/TksSvRC1Hof1Io1iuEpJzQ

  5. 一文彻底弄懂Apache Hudi不同表类型
    https://mp.weixin.qq.com/s/xvjgHc27KOvr68Sq1RB59g

  6. 如何将数据更快导入Apache Hudi?
    https://mp.weixin.qq.com/s/yez2xHnw3iB7chripozY0w

  7. 一文彻底掌握Apache Hudi异步Clustering部署
    https://mp.weixin.qq.com/s/xYtPSTxCmYofe_i2cVHwxQ

  8. Apache Hudi内核之文件标记机制深入解析
    https://mp.weixin.qq.com/s/pEO9lFyVFpvKk5cl-vF83w

  9. 更进一步节省空间!Apache Hudi支持虚拟键
    https://mp.weixin.qq.com/s/E7IfnqYJ2IIMjKefVFpkpQ

  10. 基于Apache Hudi构建数据湖的典型应用场景介绍
    https://mp.weixin.qq.com/s/pT9iXtGS4xUOzIkD7rIXJw

  11. Apache Hudi测试、运维操作万字总结
    https://mp.weixin.qq.com/s/pjBc2pi3MFgr2Bta7k0XDw

  12. Streaming与Hudi、Hive湖仓一体!
    https://mp.weixin.qq.com/s/JG75IFnEg3XIa_yhsJCRuw

  13. 通过Z-Order技术加速Hudi大规模数据集分析方案
    https://mp.weixin.qq.com/s/qos-QGfJbP36qwq9h1lUkQ

  14. 一文彻底理解Apache Hudi的清理服务
    https://mp.weixin.qq.com/s/jIm0P6GnYXMdG6kyg_8bjA

  15. 17张图带你彻底理解Hudi Upsert原理
    https://mp.weixin.qq.com/s/BYHwv16A7LAKZMnOZ8y6mA

  16. Apache Hudi集成Spark SQL抢先体验
    https://mp.weixin.qq.com/s/1ElF9fh5k7j7HD_3HKRDqQ

  17. 提升50%+!Presto如何提升Hudi表查询性能?
    https://mp.weixin.qq.com/s/ZnoME7YXRXhYhgq-qbtyMA

  18. 一文彻底掌握Apache Hudi的主键和分区配置
    https://mp.weixin.qq.com/s/A59QDz7W06uCM_yZkmkYQw

  19. Apache Hudi核心概念一网打尽
    https://mp.weixin.qq.com/s/fSweg0XkFcOvsD3q8tKiNg

  20. Apache Hudi:CDC的黄金搭档
    https://mp.weixin.qq.com/s/Y7aQxkNgnfnvpgwF7dJIUg

  21. 使用Apache Hudi构建下一代Lakehouse
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247485669&idx=2&sn=e002ff5805715e7435e8510c4bf9dab3&chksm=e81f5d93df68d485d73faf7375f81dc9e7d5b1cce5b23d60fce5244953a8c05c5105551a0217&token=1639107443&lang=zh_CN#rd

  22. 查询时间降低60%!Apache Hudi数据布局黑科技了解下
    https://mp.weixin.qq.com/s/5JdOrI8HpJJS-xkVG296iw

  23. Apache Hudi:不一样的存储、不一样的计算
    https://mp.weixin.qq.com/s/B3qMjqzI_U20wQmE0NSsrQ

  24. 只会数仓?数据湖与Apache Hudi有必要了解一下
    https://mp.weixin.qq.com/s/Y70PI1kFt1JQ5jKatvCSTw

  25. Hi, Data Lakers!这里有一份来自PMC Chair的新年礼包,请注意查收!
    https://mp.weixin.qq.com/s/A00schLliJDQAIAq0AxSLA

  26. 数据湖框架选型很纠结?一文了解Apache Hudi核心优势
    https://mp.weixin.qq.com/s/74BPBr-KC2wUn5cqorm-wQ

  27. Apache Hudi初学者指南
    https://mp.weixin.qq.com/s/RpwPhtVFwyT34pX-PgMzOQ

  28. 什么是Apache Hudi
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484017&idx=1&sn=bb49c45012e76d871225055736afc0db&chksm=e81f5707df68de11f810c4e6b006770ba6a9f05853b907de38ee87e2713725ac9bb988d8e30c&token=1688466117&lang=zh_CN#rd

  29. 查询Hudi数据集
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484025&idx=1&sn=4fee9f81e0ca5e3e1a41db2cde978051&chksm=e81f570fdf68de19912bdf2acc3e213f1f8879180525238da1b7e1b37eaad304ea5ea7445718&token=1688466117&lang=zh_CN#rd

  30. Hudi性能测试
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484044&idx=1&sn=84c4b01e0b50422a957cdd4dcb763bb5&chksm=e81f57fadf68deec184c725c5ebcf866d3258147eb81ae716a381a63c58bc33e5f41a303c25b&token=1688466117&lang=zh_CN#rd

  31. Hudi运维与管理
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484181&idx=1&sn=1186492f303c0cefce6a5b3acc43f902&chksm=e81f5663df68df758e91b67995d814b44a1093555a5fd6fe1ce2c98aecd089b146afc020177c&token=1688466117&lang=zh_CN#rd

  32. Hudi常见问题汇总
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484317&idx=1&sn=d5d12509ec1a8d8fffe04cb10fbebde4&chksm=e81f56ebdf68dffdb31cb8f9e77df7e9158525bc3fd4b767ea51408e806165d1ec648820dc4d&token=1688466117&lang=zh_CN#rd

  33. Hudi使用问题汇总1
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484326&idx=1&sn=074443acf90c01b11541b21f9ccf29f1&chksm=e81f56d0df68dfc6cbeddebbaa96d0d5376df2ca6b0b1254c2177c42b8671aa2361a215bce07&token=1688466117&lang=zh_CN#rd

  34. Hudi使用问题汇总2
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484331&idx=1&sn=71bb945ec48015c8ab6eedc53571c9b1&chksm=e81f56dddf68dfcb6cb34af4c36d200348aa7b5ca56240fb972752b062a7cccffe5a2453310a&token=1688466117&lang=zh_CN#rd

  35. Hudi与其他类似系统比较
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484312&idx=1&sn=945d7a1d108a1ebca8aaae970aa097b8&chksm=e81f56eedf68dff818677f59f10ff0f7fa256af825ea6124465972837dfa29b46aa2e12b6eb0&token=1688466117&lang=zh_CN#rd

  36. 一文了解Apache Hudi架构、工具和最佳实践
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484429&idx=1&sn=5b964860be5796f5516e131308fbb970&chksm=e81f517bdf68d86db844453d9d858c7166ebdbf86f657471c5886f20b00efbfae68af430efeb&token=1688466117&lang=zh_CN#rd

  37. Apache Hudi与Delta Lake对比
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484636&idx=1&sn=f219238e88aa0236a03c4a8136f558c8&chksm=e81f51aadf68d8bc3d16c80fd5d5bc4b20dcda71754ef90b82984ac781134d9734f3f5db319f&token=1688466117&lang=zh_CN#rd

  38. Apache Hudi 设计与架构最强解读
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484778&idx=1&sn=1a52540f24c641ac17ec647fa241fbe9&chksm=e81f501cdf68d90a35e0277bc053274d8a2b0f36c639949c5e87ff7256b7b6e07388bbd39bf5&token=1889807326&lang=zh_CN#rd

  39. 使用Apache Hudi构建大规模、事务性数据湖
    https://mp.weixin.qq.com/s/u_POo_VIRXAdwamE9NA0Pw

  40. Apache Hudi重磅特性解读之全局索引
    https://mp.weixin.qq.com/s/Moehs1Ch3j7IVANJQ1mfNw

  41. Apache Hudi重磅特性解读之存量表高效迁移机制
    https://mp.weixin.qq.com/s/-A_1xNQCw0hJPB561u05rw

  42. Apache Hudi + AWS S3 + Athena实战
    https://mp.weixin.qq.com/s/M0Fa0lxUJX-hCIQc9toZsg

  43. 详解Apache Hudi如何配置各种类型分区
    https://mp.weixin.qq.com/s/LUXhVmk2l0xO_cDzbD3fLA

Apache Hudi实战

  1. 使用Apache RocketMQ + Hudi 快速构建 Lakehouse
    https://mp.weixin.qq.com/s/NZxfY2gUWLu8744AX9TeOA

  2. 查询性能提升3倍!Apache Hudi 查询优化了解下?
    https://mp.weixin.qq.com/s/ZjFJaH20y0n-xz_VXt5bxw

  3. 基于Apache Hudi构建智能湖仓实践(附亚马逊工程师代码)
    https://mp.weixin.qq.com/s/x2qVK0lhx9PsqI2SPFn1Iw

  4. Hudi实战 | 在CDH 6.3.0上运行HoodieDeltaStreamer
    https://mp.weixin.qq.com/s/YVzcLBUfrsCZFZYNSmKMZw

  5. Flink CDC + Hudi + Hive + Presto构建实时数据湖最佳实践
    https://mp.weixin.qq.com/s/evHkDPlw9UQ0PFxQnZpZ3g

  6. 超详细步骤!整合Apache Hudi + Flink + CDH
    https://mp.weixin.qq.com/s/FYPdx3y0nJDA7ErFMqJVZA

  7. 硬核!Apache Hudi中自定义序列化和数据写入逻辑
    https://mp.weixin.qq.com/s/ZmFZVM1XGEEIpmdpONMHTA

  8. 基于Hudi的流式CDC实践一:听说你准备了面试题?
    https://mp.weixin.qq.com/s/l7K2gVgMtCgvak8WKsKbqQ

  9. Flink + Hudi,构架仓湖一体化解决方案
    https://mp.weixin.qq.com/s/duPhdr2zMmUUCYUPATX1oQ

  10. 使用 Flink Hudi 构建流式数据湖
    https://mp.weixin.qq.com/s/dENepO21H3r5IOrdk7BuSw

  11. Apache Hudi数据不知道怎么删除?多种方式快来Get!
    https://mp.weixin.qq.com/s/Fww-y1W-56t5B_a81-YAsA

  12. Apache Hudi实时入湖之DeltaStreamer最佳实践
    https://mp.weixin.qq.com/s/mHuGE452PzTrFp7-IDNihw

  13. 实时数据湖:Flink CDC流式写入Hudi
    https://mp.weixin.qq.com/s/JkCbvfJhdz9gT-Tw1pUBIA

  14. Debezium-Flink-Hudi:实时流式CDC
    https://mp.weixin.qq.com/s/l5XzXv5lXyfEryG2rk2Wdg

  15. 在AWS Glue中使用Apache Hudi
    https://mp.weixin.qq.com/s/9z4rmokVJJpc14qosXLU8g

  16. Apache Flink 1.12.2集成Hudi 0.9.0运行指南
    https://mp.weixin.qq.com/s/TKFZYwPbGSKSo29EDeaPIw

  17. 重磅!解锁Apache Flink读写Apache Hudi新姿势
    https://mp.weixin.qq.com/s/cG4KQdcjd98s8h0Ini7CWw

  18. 集成才是硬道理! 用它构建一个完整的Hadoop
    https://mp.weixin.qq.com/s/Wjk6XnjyaPQrrWWPf0UlUQ

  19. 实战 | Apache Hudi回调功能简介及使用示例
    https://mp.weixin.qq.com/s/M-ptQ3olf14IxaAPu9t5ww

  20. Apache Hudi + Flink作业运行指南
    https://mp.weixin.qq.com/s/d1GI1AYHUpKwz_VHd41CeA

  21. Apache Hudi异步Compaction的不同部署模型全面汇总
    https://mp.weixin.qq.com/s/OEM61L3FhdLAeTghtGAeUA

  22. 解锁Apache Hudi删除记录新姿势
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484537&idx=1&sn=9c5b3dbe69f774cf0f8b031143e329ee&chksm=e81f510fdf68d819720cb66102b386b3a19a537a45c40ee0cdc8e7f2bc6fa4ad469549dce8bb&token=1688466117&lang=zh_CN#rd

  23. Apache Hudi入门指南(含代码示例
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484661&idx=1&sn=175da977c9772cece04117878da78247&chksm=e81f5183df68d8951f589bcb86b4d3b9e8b3c25139041bd5e8c5ae9d2b2e8835662bb66d1fbb&token=1688466117&lang=zh_CN#rd

  24. 真香!PySpark整合Apache Hudi实战
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484853&idx=1&sn=7e13d8d99c430a1d1f06aeb3f1641085&chksm=e81f50c3df68d9d58edf9a408120899aecdd8a5833a7f754a95f3c6c2a78aece82d63110b134&token=1688466117&lang=zh_CN#rd

  25. 实战|使用Spark Struct Streaming写入Hudi
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484788&idx=1&sn=414463f7a693e05cd627b9ee85574449&chksm=e81f5002df68d9149f3a10db41ba032264a43726593f516f243dc2c68ee993b1dd30a44cb0da&token=1688466117&lang=zh_CN#rd

  26. 实战|将Apache Hudi数据集写入阿里云OSS
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484795&idx=1&sn=7188640c658e671f9228a3b4184c1d94&chksm=e81f500ddf68d91b506ac2543cfd2cac0227c1df06170e26a43352056f56a3d43585817424aa&token=1688466117&lang=zh_CN#rd

  27. 实战!使用Apache Hudi DeltaStreamer将数据流写入OSS
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484869&idx=2&sn=bb6f1f456f88bc253922a59010370177&chksm=e81f50b3df68d9a514d346e9cd2ff2512d9ef7d2339b1c4011701f41a41687f45a5cab06cd85&token=1889807326&lang=zh_CN#rd

  28. 使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484067&idx=1&sn=8bd4962eb228f43bce04195131a67fb5&chksm=e81f57d5df68dec336f1ba5c294b891abf1959da967797788272cb434b7b3a6e4531c60e05a0&token=1688466117&lang=zh_CN#rd

  29. 官宣!Apache Hudi与AWS Database Migration Service深度集成
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484556&idx=1&sn=1cd85bfaede42c5ba13623a65bd66390&chksm=e81f51fadf68d8ec19c79bae0dcecf87095c4d02863184fce4ab7db950195211c40bdf3fcc98&token=1688466117&lang=zh_CN#rd

  30. Delta Lake 和 Apache Hudi 两种数据湖产品全方面对比
    https://mp.weixin.qq.com/s/Z8YLr5jmkm7u5WgHQZk1MQ

  31. 最强指南!数据湖Apache Hudi、Iceberg、Delta环境搭建
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484688&idx=1&sn=2b337511eb0f6761372c3d83638d3464&chksm=e81f5066df68d97005e4f154c0f7ccac2fc6701fab98c1820570f84f2459c1d301b5b54b68a2&token=1688466117&lang=zh_CN#rd

  32. 实战 | 将Kafka流式数据摄取至Hudi
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484810&idx=1&sn=b844d07c4497ed98d269772ab92538e0&chksm=e81f50fcdf68d9eacc28edb9e597f6bd8cadef96db7dcdbb7fa421c93e5ced0fbd4e268216f1&token=1889807326&lang=zh_CN#rd

  33. Apache Hudi数据备份与转储利器:HoodieSnapshotExporter
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484758&idx=1&sn=eeed11357e072c21d205db7c2d638ea0&chksm=e81f5020df68d936ed24d6a05c9b6874ea6fa809960b16950fa7c8d0d19170e72e14f74ab49d&token=1688466117&lang=zh_CN#rd

  34. 实战!配置DataDog监控Apache Hudi应用指标
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484926&idx=1&sn=f2e965cb626c37bde868c286004b3208&chksm=e81f5088df68d99e199c96f3a77db69f48982746e5b07ebe93bd75bceb485dc010d502a862e2&token=1688466117&lang=zh_CN#rd

  35. 调优 | Apache Hudi应用调优指南
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484939&idx=1&sn=5af5f3893242820bb91f3e5ea0e9e81b&chksm=e81f537ddf68da6b79123fab084a6b618f2769ca149774d28e488bf7f507a7c35471449470e9&token=1688466117&lang=zh_CN#rd

  36. 填坑 | 线上Presto查询Hudi表异常排查
    https://mp.weixin.qq.com/s/ik_AKz82G8jPbVq9Q02umg

  37. Apache Hudi表自动同步至阿里云数据湖分析DLA
    https://mp.weixin.qq.com/s/zBAYJlsnbbFAjWnmOqjTlQ

数据湖扩展

  1. Apache Hudi助力Uber低成本构建开源大数据平台
    https://mp.weixin.qq.com/s/P-tYGLl5Gv8QBUrJ12Q-0Q

  2. Lakehouse元数据管理技术深度解析
    https://mp.weixin.qq.com/s/8GknnV6AYH5Mk83rCII7TQ

  3. 大数据技术变革正当时,Apache Hudi了解下?
    https://mp.weixin.qq.com/s/JCrnpACBbhSrrscqgto5HA

  4. Lakehouse: 统一数据仓库和高级分析的新一代开放平台
    https://mp.weixin.qq.com/s/2lFPPZYabBc3C77HJbIvzQ

  5. 什么是LakeHouse
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484542&idx=1&sn=4616da2eeb37d15d891b298787a6999b&chksm=e81f5108df68d81e18aac88511d728ba39e36f9d36f9defe23c462a826c8c16f46b27b53be15&token=1688466117&lang=zh_CN#rd

  6. Data Lake架构揭秘
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484655&idx=1&sn=f130b356b77027779a6fcb6801f33290&chksm=e81f5199df68d88f72bae107f5749a8ce395c59dabd237daedd831690477886d0a5983537fb6&token=1688466117&lang=zh_CN#rd

Apache Hudi生态

  1. 数据湖正当时!华为云MRS重磅集成Apache Hudi
    https://mp.weixin.qq.com/s/uPdFB2tVXkjBxJvx25YhQQ

  2. 重磅!AWS升级对Apache Hudi的集成
    https://mp.weixin.qq.com/s/LM6h0hydr0pCQiSJfBFYSw

  3. Apache Hudi在Hopsworks机器学习的应用
    https://mp.weixin.qq.com/s/LBZVeOXdR4t4X6aj6X_Lsg

  4. 基于Apache Hudi 湖仓一体的大数据生态体系
    https://mp.weixin.qq.com/s/eNPKXJHeUR2dE1lTyL7d6w

  5. KIP-5:Apache Kylin深度集成Hudi
    https://mp.weixin.qq.com/s/pbMU_B8P0R6A9Utuhkivnw

  6. 使用Apache Pulsar + Hudi 构建Lakehouse方案了解下?
    https://mp.weixin.qq.com/s/6lGicldAz0eeDYGWnDtfJg

  7. Apache Hudi C位!云计算一哥AWS EMR 2020年度回顾
    https://mp.weixin.qq.com/s/9Dy5NUgJ-vm386VjOQf0Rw

  8. Apache Hudi与Apache Flink更好地集成,最新方案了解下?
    https://mp.weixin.qq.com/s/91tQFCW3hi7YJR3qIi3ARg

  9. 数据湖风暴来袭!阿里云EMR重磅发布Apache Hudi
    https://mp.weixin.qq.com/s/i4IYvMeUj_wFu1kkCvoOJg

  10. CDH 6.3.0安装Apache Hudi指南
    https://mp.weixin.qq.com/s/Uh8p8wAjUPSja1mxgpYbsQ

  11. 假期结束还没缓过神?Hudi on Flink最新进展了解下?
    https://mp.weixin.qq.com/s/LvKaj5ytk6imEU5Dc1Sr5Q

  12. 划重点!AWS的湖仓一体使用哪种数据湖格式进行衔接?
    https://mp.weixin.qq.com/s/WIZLdGkbGpDFM2yfc5f64w

  13. 速度!Apache Hudi又双叕被国内顶级云服务提供商集成了!
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484817&idx=1&sn=7e00c3270bfee162315e91de92a6506a&chksm=e81f50e7df68d9f1e1e8657dc5b3066c21033a334c5c5c81ef1e9fb645231a95a368b64b0efd&token=1889807326&lang=zh_CN#rd

  14. 终于!Apache Hudi与Impala完成整合
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484588&idx=1&sn=1e879cfed15e88aa7ea6473fc7eef199&chksm=e81f51dadf68d8ccf4b34bf491904a98ed5aa65eadd25d9de25729dd08f0565c4394edd45c5e&token=1688466117&lang=zh_CN#rd

  15. 如何将Apache Hudi应用于机器学习
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484696&idx=2&sn=eeaaac04d14c9d0a90729e245f4a6d39&chksm=e81f506edf68d978a8c57f0089d1ba927ab760d828546e87ae463c9909a912c319c29297270b&token=1688466117&lang=zh_CN#rd

  16. Apache Hudi与机器学习特征存储
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484696&idx=1&sn=68a5fe0e716f4977c77d9c29497ee324&chksm=e81f506edf68d978328534805ce160d85e0022382e206bcd8e0b4860a146ea45a4fec662ff0b&token=1688466117&lang=zh_CN#rd

  17. 生态|Apache Hudi集成Apache Zeppelin
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484806&idx=1&sn=3c77ce46da5abb0d475ad2c771624cfe&chksm=e81f50f0df68d9e605bd8f23fe60108e28cc305e27e6411f8543268eefe1454530ba983c80a5&token=1688466117&lang=zh_CN#rd

  18. 基于Apache Hudi 和 Kylin 构建准实时高性能数据仓库
    https://mp.weixin.qq.com/s/KafqWfAJOJGV3tVOTAo-hA

  19. 生态 | Apache Hudi插上Alluxio的翅膀
    https://mp.weixin.qq.com/s/C_hIhyD7swCcrglR5aiQkQ

  20. 官宣!AWS Athena正式可查Apache Hudi数据集
    https://mp.weixin.qq.com/s/u_W9VWH4JuBC0hLYBZCPAQ

Apache Hudi源码解读

  1. Bloom Filter在Hudi中的应用
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484157&idx=1&sn=dc836ddd9b264939144543b21852a15b&chksm=e81f578bdf68de9d1325ee7c40844ea06f9c22196f6e4abc76543bae75b534e7ea3b3dd12023&token=1688466117&lang=zh_CN#rd

  2. Upsert在Hudi中的实现分析
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484162&idx=1&sn=1090086c32838ca0b671c5658cf13d2c&chksm=e81f5674df68df62727aecfe3a7d33d659e5fababb82fb1cfc19120863d510a9e0aeb6152170&token=1688466117&lang=zh_CN#rd

  3. 生产者-消费者模型在Hudi中的应用
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484174&idx=1&sn=5189aee1083dcbb4b7fcfff7812a6e08&chksm=e81f5678df68df6e88c3f11a7c0d82f0edbc3d8406ef4d6a7be587ad14bf6ad3ad0b932fdb35&token=1688466117&lang=zh_CN#rd

  4. Hudi Log日志文件格式分析(一)
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484245&idx=1&sn=2a15fe761eed4da9a7dd68f5fcf673af&chksm=e81f5623df68df3592ab883e7450cd74181effcec3ef7ac9c2a9285acb47eb33e8a0ae0543ac&token=1688466117&lang=zh_CN#rd

  5. Hudi Log日志文件写入分析(二)
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484251&idx=1&sn=27b10b6562afd99078d9b2517061871a&chksm=e81f562ddf68df3b9fe3048b5dc7d2471e6bbfc7a90312a831bdf4fc5d7e483ddb3204e95ef4&token=1688466117&lang=zh_CN#rd

  6. Hudi Log日志文件读取分析(三)
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484291&idx=1&sn=85027ef17c4c5111db534d88c6c0efcb&chksm=e81f56f5df68dfe3ef3653ecf1a86ba16b4dcf361fe3674062c62b50d1e3cf6d1aedf5c2b13a&token=1688466117&lang=zh_CN#rd

  7. ApacheHudi Archive(归档)实现分析
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484336&idx=1&sn=a8bf90045f97e6daead7f2d8492da344&chksm=e81f56c6df68dfd04208b9c94f3e6c86fceba5bbe299ce172ca4efc72f71cb130429e7da1b92&token=1688466117&lang=zh_CN#rd

  8. Apache Hudi Savepoint实现分析
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484461&idx=1&sn=a52208ede2f805369734c4339892cd1f&chksm=e81f515bdf68d84d5c4f4a0ca158aa0295a9916e97b4fe1d36c1d8aacf131716e22f1156c55e&token=1688466117&lang=zh_CN#rd

  9. Apache Hudi Rollback实现分析
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484498&idx=1&sn=9d2fa358354de87a45fed552927c1fa6&chksm=e81f5124df68d8320e5d069c6acdc2fde76bd059c84baa55749e7168ad82bb00235814934224&token=1688466117&lang=zh_CN#rd

  10. Hudi Timeline(时间轴)分析
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484187&idx=1&sn=54d6d988e77528e3381d76c6f9d629ea&chksm=e81f566ddf68df7b616276d29ec47382a297888590d521a7e283016b285c71c726f65e389dc2&token=1688466117&lang=zh_CN#rd

  11. Hudi MergeOnRead存储类型时Upsert分析
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484233&idx=1&sn=aad81de05436b7f9e1b34b363964160a&chksm=e81f563fdf68df297c242f961bec8c7dc647f3972aef03e005c2cdb6081feb83f3f9ff879d99&token=1688466117&lang=zh_CN#rd

  12. Hudi 压缩(Compaction实现分析
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484238&idx=1&sn=f7d60a0361daefb6a55c44e4ad163eba&chksm=e81f5638df68df2ea1d64677553963291ffabc48d0747325e48885b71e1e412dcb64ee714183&token=1688466117&lang=zh_CN#rd

  13. 揭秘ApacheHudi数据湖的文件管理
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484306&idx=1&sn=1d853469159a600d82050c17e6a2a075&chksm=e81f56e4df68dff2da417109c4a971aef54f056bc0519558c58e23fe60b90dc6e4f8d7e92774&token=1688466117&lang=zh_CN#rd

  14. Spark读取变更Hudi数据集Schema实现分析
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484513&idx=1&sn=8914cdda4cd49e6cdbb139b3f31c6a6f&chksm=e81f5117df68d80137b57a9aabddd195f76dccc3845bbef35188e362be28cbdcfa277ee6e98c&token=1688466117&lang=zh_CN#rd

  15. Apache Hudi索引实现分析(一)之HoodieBloomIndex
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484567&idx=1&sn=f47964aa32915f54b30da75e75d4120d&chksm=e81f51e1df68d8f7d45773e219ea3d38815f3ff6123cc412576eaad00cfdadc23e35479ee414&token=1688466117&lang=zh_CN#rd

  16. Apache Hudi索引实现分析(二)之HoodieGlobalBloomIndex
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484576&idx=1&sn=10ca56b1d8c22cd61e832377327c2680&chksm=e81f51d6df68d8c0cf5d9abf7d96b43dd6e1a11aa5ff3126d065ba51c37f53a1176de7c4c97e&token=1688466117&lang=zh_CN#rd

  17. Apache Hudi索引实现分析(三)之HBaseIndex
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484592&idx=1&sn=fecec276c9477a8f365f54649fe26a69&chksm=e81f51c6df68d8d0d8109a93181e8a6bf89b6492691bdd1a56800695a4a729a1480c98a6f0cb&token=1688466117&lang=zh_CN#rd

  18. Apache Hudi索引实现分析(四)之基于Tree的IndexFileFilter
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484597&idx=1&sn=35e073fcec36b4616ce05d67c63ce934&chksm=e81f51c3df68d8d546e7109afc5ccc81072aae5604d568513e22de5db2df17ea4c181c64039c&token=1688466117&lang=zh_CN#rd

  19. Apache Hudi索引实现分析(五)之基于List的IndexFileFilter
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484736&idx=1&sn=123efc79e714f988c63318cae696941d&chksm=e81f5036df68d9207a299ad65a0458ea36b7203a6471a7071fe13b3c4d8053ec821058b16789&token=1688466117&lang=zh_CN#rd

  20. 详解ApacheHudi如何节约宝贵的存储空间
    https://mp.weixin.qq.com/s?__biz=MzIyMzQ0NjA0MQ==&mid=2247484301&idx=1&sn=79cdd0894a9a3af797fdfba7f7656b45&chksm=e81f56fbdf68dfed66c71afcf2dd7026848ce99b24460278387cf4187d2f722ba570b9f26b11&token=1688466117&lang=zh_CN#rd

1 yarn

2 组件

角色 职责
ResourceManager (RM) 集群资源总管,负责接收应用、分配资源(Container)
NodeManager (NM) 单机资源代理,负责启动/监控 Container,汇报资源使用情况
ApplicationMaster (AM) 每个应用(如 Spark job)的“管家”,向 RM 申请资源,协调任务执行

3 流程

通信双方有一端是 Client,另一端为 Server,且 Client 总 是主动连接 Server 的

通信模型: pull-model

  • 步骤1: 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
  • 步骤2: ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
  • 步骤3: ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
  • 步骤4: ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
  • 步骤5: 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
  • 步骤6: NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
  • 步骤7: 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。
  • 步骤8: 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

Avro 是 Hadoop 生态系统中的 RPC 框架,具有平台无关、支持动态 模式(无需编译)等优点

4 调度器

4.1 FIFO

4.2 CapacityScheduler

4.3 FairScheduler

5 Yarn 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
grep -A2 -B1 cg yarn-site.xml 
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.delete-timeout-ms</name>
<value>30000</value>
</property>
--
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.memory-control.enabled</name>
<value>true</value>
</property>
--
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.oom.policy</name>
<value>true</value>
</property>
--
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.hierarchy</name>
<value>/hadoop-yarn</value>
</property>
--
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.mount</name>
<value>true</value>
</property>
--
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.mount-path</name>
<value>/cgroup</value>
</property>

--
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name>
<value>false</value>
</property>

Yarn使用Cgroup实现任务资源限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
> cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
2

# 查看每个物理CPU中core的个数(即核数)
> cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 24

# 查看逻辑CPU的个数
> cat /proc/cpuinfo| grep "processor"| wc -l
96

Yarn 默认统计是用的物理核来计算CPU资源的,
我们的yarn配置里面没有指定yarn.nodemanager.resource.count-logical-processors-as-cores 为 true,

1
2
3
4
5
6
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>80</value>
<final>false</final>
<source>yarn-site.xml</source>
</property>

例如这台机器的逻辑CPU是96核,物理cpu是2个×24核=48核,yarn配置最大使用是80物理核[捂脸]

不清楚是否有问题?

6 Yarn rest api

6.1 查询运行中的任务id:

1
curl 'http://<host>:8080/ws/v1/cluster/apps?queue=<queue>&state=RUNNING'  | jq '.apps.app[] | .id' | less

6.2 kill掉任务

1
curl -v -X PUT -H "Content-Type: application/json" -d '{"state": "KILLED"}' 'http://<host>:8080/ws/v1/cluster/apps/<app_id>/state'

01.MySQL

修改 root 密码 不成功

1
2
3
4
5
6
7
8
9
Open & Edit /etc/my.cnf or /etc/mysql/my.cnf, depending on your distro.
Add skip-grant-tables under [mysqld]
Restart Mysql
You should be able to login to mysql now using the below command mysql -u root -p
Run mysql> flush privileges;
Set new password by ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
Go back to /etc/my.cnf and remove/comment skip-grant-tables
Restart Mysql
Now you will be able to login with the new password mysql -u root -p
1
2
3
4
5
6
7
8
9
10
11
12
mysql> drop user root@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> create user root@localhost identified by 'abc.123';
Query OK, 0 rows affected (0.02 sec)

grant all privileges on *.* to root@localhost;

flush privileges;

mac brew 重装 不成功

1
2
3
4
5
brew uninstall mysql --ignore-dependencies
sudo rm -rf /usr/local/Cellar/mysql
brew cleanup
sudo rm -rf /usr/local/var/mysql
brew install mysql

索引

创建索引

1
2
alter table t_zxg_hot_news_result add index
idx_hot_news_cnt (ftype,fcnt,ftime,fnews_id,fmsg_type);

删除索引

1
alter table t_zxg_hot_news_result drop index idx_hot_news_cnt ;

查询索引

1
2
3
4
5
6
7
8
9
10
11
show index from t_zxg_hot_news_result;
+-----------------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t_zxg_hot_news_result | 0 | PRIMARY | 1 | fid | A | 765715 | <null> | <null> | | BTREE | | |
| t_zxg_hot_news_result | 1 | idx_hot_news_cnt | 1 | ftype | A | 5 | <null> | <null> | | BTREE | | |
| t_zxg_hot_news_result | 1 | idx_hot_news_cnt | 2 | fcnt | A | 4072 | <null> | <null> | | BTREE | | |
| t_zxg_hot_news_result | 1 | idx_hot_news_cnt | 3 | ftime | A | 49236 | <null> | <null> | YES | BTREE | | |
| t_zxg_hot_news_result | 1 | idx_hot_news_cnt | 4 | fnews_id | A | 800020 | <null> | <null> | | BTREE | | |
| t_zxg_hot_news_result | 1 | idx_hot_news_cnt | 5 | fmsg_type | A | 792176 | <null> | <null> | | BTREE | | |
+-----------------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

InnoDB 中的锁机制

获取锁争用情况

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql root@localhost:dlock> show status like 'innodb_row_lock%'

+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
+-------------------------------+-------+
5 rows in set
Time: 0.012s

antigeneral (公众号:大数据羊说): 
问题1:为什么flink 要用到java序列化机制。和flink类型系统的数据序列化机制的用途有啥区别

问题2:变量没有继承 serializable为啥就不报错,实例化就报错?

问题3:为啥加 transient 就不报错?

flink datastream api 强调 function 实现时,实例化的变量要继承 serializable接口,如果没实现借口的话需要添加 transient 字段,否则会报不可序列化异常。

antigeneral (公众号:大数据羊说): 
每日一题:状态,状态后端,CK三者之间的区别及关系

antigeneral (公众号:大数据羊说): 
每日一题:一个 Flink任务使用了周期性watermark生成器+事件时间窗口。这个Flink 任务在任务failover时能保障事件时间窗口输出结果和之前一样吗?

antigeneral (公众号:大数据羊说): 
每日一题:watermark到底是干啥的?应用场景?

antigeneral (公众号:大数据羊说): 
每日一题:为什么flink datastream api 在函数入参或者出参有泛型时,不能使用 lambda 表达式

JStack

寻找问题线程的过程

1
top -Hp  1704

![top thread](_v_images/20190728100942815_354006932.png =690x)

  1. 目标线程的id转换为16进制
  2. jstack dump线程栈
1
2
3
4
5
6
7
8
9
10
11
[deploy@centos ~]$ printf '%x' 1721
6b9
[deploy@centos ~]$ jstack -l 1704 | grep 6b9 -A 20
"handler-0" #9 prio=5 os_prio=0 tid=0x00007fa21c14e000 nid=0x6b9 waiting on condition [0x00007fa1f2884000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.lk.optimization.demo.Worker.run(DemoTest.java:34)
at java.lang.Thread.run(Thread.java:748)

Locked ownable synchronizers:
- None
1
2
3
4
5
6
jstack [ option ] pid
基本参数:
-F 当’jstack [-l] pid’没有响应的时候强制打印栈信息
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有栈信息. -h | -help打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps工具查询.
1
kill -3 <pid>

线程的状态

RUNNABLE

为了把runnable打出来,写了个死循环

1
2
3
4
5
6
7
8
9
10
11
12
new Thread(){
public void run(){
int i=0;
while(true){
i++;
if(i>100000000){
i=0;
System.out.println("hha");
}
}
}
}.start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"Thread-0" #19 prio=5 os_prio=0 tid=0x00007f2810152000 nid=0x7aa runnable [0x00007f27f8a73000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
- locked <0x00000000e0c1d7e8> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:482)
- locked <0x00000000e0c02988> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
- locked <0x00000000e0c02940> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.newLine(PrintStream.java:546)
- eliminated <0x00000000e0c02988> (a java.io.PrintStream)
at java.io.PrintStream.println(PrintStream.java:807)
- locked <0x00000000e0c02988> (a java.io.PrintStream)
at com.lk.optimization.demo.DemoTest$1.run(DemoTest.java:14)

Locked ownable synchronizers:
- None

TIMED_WAITING

1
2
3
4
5
6
7
8
9
10
11
12
class Worker implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
1
2
3
4
5
6
7
8
"handler-0" #9 prio=5 os_prio=0 tid=0x00007fa21c14e000 nid=0x6b9 waiting on condition [0x00007fa1f2884000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.lk.optimization.demo.Worker.run(DemoTest.java:34)
at java.lang.Thread.run(Thread.java:748)

Locked ownable synchronizers:
- None

JVM线程对应的系统线程, 16进制的
正等待<0x00007fa1f2884000>

Blocked

多线程竞争synchronized锁

![stack-blocked](_v_images/20190728105849426_741235393.png =778x)

很明显:线程1获取到锁,处于RUNNABLE状态,线程2处于BLOCK状态
1、locked <0x000000076bf62208>说明线程1对地址为0x000000076bf62208对象进行了加锁;
2、waiting to lock <0x000000076bf62208> 说明线程2在等待地址为0x000000076bf62208对象上的锁;
3、waiting for monitor entry [0x000000001e21f000]说明线程1是通过synchronized关键字进入了监视器的临界区,并处于”Entry Set”队列,等待monitor,具体实现可以参考深入分析synchronized的JVM实现

通过wait挂起线程

1
2
3
4
5
6
7
8
9
10
11
12
13
static class Task implements Runnable {
@Override
public void run() {
synchronized (lock) {
try {
lock.wait();
//TimeUnit.SECONDS.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

![stack wait](_v_images/20190728110132556_948612836.png =778x)

线程1和2都处于WAITING状态
1、线程1和2都是先locked <0x000000076bf62500>,再waiting on <0x000000076bf62500>,之所以先锁再等同一个对象,是因为wait方法需要先通过synchronized获得该地址对象的monitor;
2、waiting on <0x000000076bf62500>说明线程执行了wait方法之后,释放了monitor,进入到”Wait Set”队列,等待其它线程执行地址为0x000000076bf62500对象的notify方法,并唤醒自己,具体实现可以参考深入分析Object.wait/notify实现机制

Wait on condition

该状态出现在线程等待某个条件的发生。具体是什么原因,可以结合stacktrace来分析。最常见的情况是线程在等待网络的读写,比如当网络数据没有准备好读时,线程处于这种等待状态,而一旦有数据准备好读之后,线程会重新激活,读取并处理数据。在 Java引入 NIO之前,对于每个网络连接,都有一个对应的线程来处理网络的读写操作,即使没有可读写的数据,线程仍然阻塞在读写操作上,这样有可能造成资源浪费,而且给操作系统的线程调度也带来压力。在 NIO里采用了新的机制,编写的服务器程序的性能和可扩展性都得到提高。

如果发现有大量的线程都在处在 Wait on condition,从线程 stack看, 正等待网络读写,这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。一种情况是网络非常忙,几乎消耗了所有的带宽,仍然有大量数据等待网络读写;另一种情况也可能是网络空闲,但由于路由等问题,导致包无法正常的到达。所以要结合系统的一些性能观察工具来综合分析,比如 netstat统计单位时间的发送包的数目,如果很明显超过了所在网络带宽的限制 ; 观察 cpu的利用率,如果系统态的 CPU时间,相对于用户态的 CPU时间比例较高;如果程序运行在 Solaris 10平台上,可以用 dtrace工具看系统调用的情况,如果观察到 read/write的系统调用的次数或者运行时间遥遥领先;这些都指向由于网络带宽所限导致的网络瓶颈。

另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒

Waitingfor monitor entry 和 in Object.wait()

在多线程的 JAVA程序中,实现线程之间的同步,就要说说Monitor。Monitor是Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 monitor。下面这个图,描述了线程和 Monitor之间关系,以及线程的状态转换图

a Java monitor

从图中可以看出,每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitorentry”,而在 “Wait Set”中等待的线程状态是“in Object.wait()”。

先看 “Entry Set”里面的线程。我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set”队列。对应的 code就像:

1
2
3
4
5
synchronized(obj){ 

.........

}

这时有两种可能性:

  • 该 monitor不被其它线程拥有,Entry Set里面也没有其它等待线程。本线程即成为相应类或者对象的 Monitor的 Owner,执行临界区的代码 。此时线程将处于Runnable状态;

  • 该 monitor被其它线程拥有,本线程在 Entry Set队列中等待。此时dump的信息显示“waiting for monitor entry”。

1
2
3
4
5
6
"Thread-0" prio=10 tid=0x08222eb0 nid=0x9 waiting for monitor entry [0xf927b000..0xf927bdb8] 

at testthread.WaitThread.run(WaitThread.java:39)
- waiting to lock <0xef63bf08> (a java.lang.Object)
- locked <0xef63beb8> (a java.util.ArrayList)
at java.lang.Thread.run(Thread.java:595)

临界区的设置,是为了保证其内部的代码执行的原子性和完整性。但是因为临界区在任何时间只允许线程串行通过,这和我们多线程的程序的初衷是相反的。如果在多线程的程序中,大量使用 synchronized,或者不适当的使用了它,会造成大量线程在临界区的入口等待,造成系统的性能大幅下降。如果在线程 DUMP中发现了这个情况,应该审查源码,改进程序。

现在我们再来看现在线程为什么会进入 “Wait Set”。当线程获得了 Monitor,进入了临界区之后,如果发现线程继续运行的条件没有满足,它则调用对象(一般就是被 synchronized 的对象)的 wait() 方法,放弃了 Monitor,进入 “Wait Set”队列。只有当别的线程在该对象上调用了 notify() 或者 notifyAll() , “ Wait Set”队列中线程才得到机会去竞争,但是只有一个线程获得对象的Monitor,恢复到运行态。在 “Wait Set”中的线程, DUMP中表现为: in Object.wait(),类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
"Thread-1" prio=10 tid=0x08223250 nid=0xa in Object.wait() [0xef47a000..0xef47aa38] 

at java.lang.Object.wait(Native Method)

- waiting on <0xef63beb8> (a java.util.ArrayList)

at java.lang.Object.wait(Object.java:474)

at testthread.MyWaitThread.run(MyWaitThread.java:40)

- locked <0xef63beb8> (a java.util.ArrayList)

at java.lang.Thread.run(Thread.java:595)

仔细观察上面的 DUMP信息,你会发现它有以下两行:

² locked <0xef63beb8> (ajava.util.ArrayList)

² waiting on <0xef63beb8> (ajava.util.ArrayList)

这里需要解释一下,为什么先 lock了这个对象,然后又 waiting on同一个对象呢?让我们看看这个线程对应的代码:

1
2
3
4
5
6
7
8
9
synchronized(obj){

.........

obj.wait();

.........

}

线程的执行中,先用 synchronized 获得了这个对象的 Monitor(对应于 locked <0xef63beb8> )。当执行到 obj.wait(), 线程即放弃了 Monitor的所有权,进入 “wait set”队列(对应于 waiting on<0xef63beb8> )。

往在你的程序中,会出现多个类似的线程,他们都有相似的 dump也可能是正常的。比如,在程序中有多个服务线程,设计成从一个队列里面读取请求数据。这个队列就是 lock以及 waiting on的对象。当队列为空的时候,这些线程都会在这个队列上等待,直到队列有了数据,这些线程被notify,当然只有一个线程获得了 lock,继续执行,而其它线程继续等待。

JVM的一些重要线程

Attach Listener

JVM

Attach Listener 线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version、jmap、jstack等等。 如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。

Signal Dispatcher

JVM

前面我们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather 线程去进行分发到各个不同的模块处理命令,并且返回处理结果。 signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工作。

CompilerThread0

JVM

用来调用JITing,实时编译装卸class 。 通常,jvm会启动多个线程来处理这部分工作,线程名称后面的数字也会累加,例如:CompilerThread1

Concurrent Mark-Sweep GC Thread

JVM

并发标记清除垃圾回收器(就是通常所说的CMS GC)线程, 该线程主要针对于老年代垃圾回收。ps:启用该垃圾回收器,需要在jvm启动参数中加上: -XX:+UseConcMarkSweepGC

DestroyJavaVM

JVM

执行main()的线程在main执行完后调用JNI中的 jni_DestroyJavaVM() 方法唤起DestroyJavaVM 线程。

ps:

扩展一下:

1.如果线程退出时判断自己不为最后一个非deamon线程,那么调用thread->exit(false) ,并在其中抛出thread_end事件,jvm不退出。

2.如果线程退出时判断自己为最后一个非deamon线程,那么调用before_exit() 方法,抛出两个事件:

事件1:thread_end 线程结束事件;

事件2:VM的death事件。

然后调用thread->exit(true) 方法,接下来把线程从active list卸下,删除线程等等一系列工作执行完成后,则通知正在等待的DestroyJavaVM 线程执行卸载JVM操作。

Dispatcher-Thread-3 线程

Log4j

Log4j具有异步打印日志的功能,需要异步打印日志的Appender都需要注册到 AsyncAppender对象里面去,由AsyncAppender进行监听,决定何时触发日志打印操作。
AsyncAppender如果监听到它管辖范围内的Appender有打印日志的操作,则给这个Appender生成一个相应的event,并将该event保存在一个buffuer区域内。

Dispatcher-Thread-3线程负责判断这个event缓存区是否已经满了,如果已经满了,则将缓存区内的所有event分发到Appender容器里面去,那些注册上来的Appender收到自己的event后,则开始处理自己的日志打印工作。 Dispatcher-Thread-3线程是一个守护线程。

Finalizer线程

JVM

这个线程也是在main线程之后创建的,其优先级为10,主要用于在垃圾收集前,调用对象的finalize()方法;关于Finalizer线程的几点:

  1. 只有当开始一轮垃圾收集时,才会开始调用finalize()方法;因此并不是所有对象的finalize()方法都会被执行;

  2. 该线程也是daemon线程,因此如果虚拟机中没有其他非daemon线程,不管该线程有没有执行完finalize()方法,JVM也会退出;

  3. JVM在垃圾收集时会将失去引用的对象包装成Finalizer对象(Reference的实现),并放入ReferenceQueue,由Finalizer线程来处理;最后将该Finalizer对象的引用置为null,由垃圾收集器来回收;

  4. JVM为什么要单独用一个线程来执行finalize()方法呢?如果JVM的垃圾收集线程自己来做,很有可能由于在finalize()方法中误操作导致GC线程停止或不可控,这对GC线程来说是一种灾难;

Gang worker#0

JVM

JVM 用于做新生代垃圾回收(monir gc)的一个线程。#号后面是线程编号,例如:Gang worker#1

GC Daemon

JVM

GC Daemon 线程是JVM为RMI提供远程分布式GC使用的,GC Daemon线程里面会主动调用System.gc()方法,对服务器进行Full GC。 其初衷是当 RMI 服务器返回一个对象到其客户机(远程方法的调用方)时,其跟踪远程对象在客户机中的使用。当再没有更多的对客户机上远程对象的引用时,或者如果引用的“租借”过期并且没有更新,服务器将垃圾回收远程对象。

不过,我们现在jvm启动参数都加上了-XX:+DisableExplicitGC配置,所以,这个线程只有打酱油的份了。

Java2D Disposer

JVM

这个线程主要服务于awt的各个组件。 说起该线程的主要工作职责前,需要先介绍一下Disposer类是干嘛的。 Disposer提供一个addRecord方法。 如果你想在一个对象被销毁前再做一些善后工作,那么,你可以调用Disposer#addRecord方法,将这个对象和一个自定义的DisposerRecord接口实现类,一起传入进去,进行注册。

Disposer类会唤起“Java2D Disposer”线程,该线程会扫描已注册的这些对象是否要被回收了,如果是,则调用该对象对应的DisposerRecord实现类里面的dispose方法。

Disposer实际上不限于在awt应用场景,只是awt里面的很多组件需要访问很多操作系统资源,所以,这些组件在被回收时,需要先释放这些资源。

InsttoolCacheScheduler_QuartzSchedulerThread

Quartz

InsttoolCacheScheduler_QuartzSchedulerThread是Quartz的主线程,它主要负责实时的获取下一个时间点要触发的触发器,然后执行触发器相关联的作业 。

原理大致如下:

Spring和Quartz结合使用的场景下,Spring IOC容器初始化时会创建并初始化Quartz线程池(TreadPool),并启动它。刚启动时线程池中每个线程都处于等待状态,等待外界给他分配Runnable(持有作业对象的线程)。

继而接着初始化并启动Quartz的主线程

(InsttoolCacheScheduler_QuartzSchedulerThread),该线程自启动后就会处于等待状态。等待外界给出工作信号之后,该主线程的run方法才实质上开始工作。run中会获取JobStore中下一次要触发的作业,拿到之后会一直等待到该作业的真正触发时间,然后将该作业包装成一个JobRunShell对象(该对象实现了Runnable接口,其实看是上面TreadPool中等待外界分配给他的Runnable),然后将刚创建的JobRunShell交给线程池,由线程池负责执行作业。

线程池收到Runnable后,从线程池一个线程启动Runnable,反射调用JobRunShell中的run方法,run方法执行完成之后, TreadPool将该线程回收至空闲线程中。

InsttoolCacheScheduler_Worker-2

Quartz

InsttoolCacheScheduler_Worker-2线程就是ThreadPool线程的一个简单实现,它主要负责分配线程资源去执行

InsttoolCacheScheduler_QuartzSchedulerThread线程交给它的调度任务(也就是JobRunShell)。

JBossLifeThread

Jboss

Jboss主线程启动成功,应用程序部署完毕之后将JBossLifeThread线程实例化并且start,JBossLifeThread线程启动成功之后就处于等待状态,以保持Jboss Java进程处于存活中。 所得比较通俗一点,就是Jboss启动流程执行完毕之后,为什么没有结束? 就是因为有这个线程hold主了它。

JDWP Event Helper Thread

JVM

JDWP是通讯交互协议,它定义了调试器和被调试程序之间传递信息的格式。它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的JVMTI和JDI的通信通畅。 该线程主要负责将JDI事件映射成JVMTI信号,以达到调试过程中操作JVM的目的。

JDWP Transport Listener:

dt_socket

JVM

该线程是一个Java Debugger的监听器线程,负责受理客户端的debug请求。 通常我们习惯将它的监听端口设置为8787。

Low Memory Detector

JVM

这个线程是负责对可使用内存进行检测,如果发现可用内存低,分配新的内存空间。

process reaper

JVM

该线程负责去执行一个 OS 命令行的操作。

Reference Handler

JVM

JVM在创建main线程后就创建Reference Handler线程,其优先级最高,为10,它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题 。

Surrogate Locker Thread (CMS)

JVM

这个线程主要用于配合CMS垃圾回收器使用,它是一个守护线程,其主要负责处理GC过程中,Java层的Reference(指软引用、弱引用等等)与jvm 内部层面的对象状态同步。 这里对它们的实现稍微做一下介绍:这里拿 WeakHashMap做例子,将一些关键点先列出来(我们后面会将这些关键点全部串起来):

1.我们知道HashMap用Entry[]数组来存储数据的,WeakHashMap也不例外, 内部有一个Entry[]数组。

  1. WeakHashMap的Entry比较特殊,它的继承体系结构为

Entry->WeakReference->Reference 。

3.Reference 里面有一个全局锁对象:Lock,

它也被称为pending_lock.注意:它是静态对象。

  1. Reference 里面有一个静态变量:pending。

  2. Reference里面有一个静态内部类:ReferenceHandler的线程,它在static块里面被初始化并且启动,启动完成后处于wait状态,它在一个Lock同步锁模块中等待。

6.另外,WeakHashMap里面还实例化了一个ReferenceQueue列队,这个列队的作用,后面会提到。

7.上面关键点就介绍完毕了,下面我们把他们串起来。

假设,WeakHashMap对象里面已经保存了很多对象的引用。

JVM 在进行CMS GC的时候,会创建一个ConcurrentMarkSweepThread(简称CMST)线程去进行GC,ConcurrentMarkSweepThread线程被创建的同时会创建一个SurrogateLockerThread(简称SLT)线程并且启动它,SLT启动之后,处于等待阶段。CMST开始GC时,会发一个消息给SLT让它去获取Java层Reference对象的全局锁:Lock。 直到CMS GC完毕之后,JVM 会将WeakHashMap中所有被回收的对象所属的WeakReference容器对象放入到Reference 的pending属性当中(每次GC完毕之后,pending属性基本上都不会为null了),然后通知SLT释放并且notify全局锁:Lock。此时激活了ReferenceHandler线程的run方法,使其脱离wait状态,开始工作了。ReferenceHandler这个线程会将pending中的所有WeakReference对象都移动到它们各自的列队当中,比如当前这个WeakReference属于某个WeakHashMap对象,那么它就会被放入相应的ReferenceQueue列队里面(该列队是链表结构)。 当我们下次从WeakHashMap对象里面get、put数据或者调用size方法的时候,WeakHashMap就会将ReferenceQueue列队中的WeakReference依依poll出来去和Entry[]数据做比较,如果发现相同的,则说明这个Entry所保存的对象已经被GC掉了,那么将Entry[]内的Entry对象剔除掉。

taskObjectTimerFactory

JVM

顾名思义,该线程就是用来执行任务的。 当我们把一个认为交给Timer对象,并且告诉它执行时间,周期时间后,Timer就会将该任务放入任务列队,并且通知taskObjectTimerFactory线程去处理任务,taskObjectTimerFactory线程会将状态为取消的任务从任务列队中移除,如果任务是非重复执行类型的,则在执行完该任务后,将它从任务列队中移除,如果该任务是需要重复执行的,则计算出它下一次执行的时间点。

VM Periodic Task Thread

JVM

该线程是JVM周期性任务调度的线程,它由WatcherThread创建,是一个单例对象。 该线程在JVM内使用得比较频繁,比如:定期的内存监控、JVM运行状况监控,还有我们经常需要去执行一些jstat 这类命令查看gc的情况,如下:

jstat -gcutil 23483 250 7 这个命令告诉jvm在控制台打印PID为:23483的gc情况,间隔250毫秒打印一次,一共打印7次。

VM Thread

JVM

这个线程就比较牛b了,是jvm里面的线程母体,根据hotspot源码(vmThread.hpp)里面的注释,它是一个单例的对象(最原始的线程)会产生或触发所有其他的线程,这个单个的VM线程是会被其他线程所使用来做一些VM操作(如,清扫垃圾等)。

在 VMThread 的结构体里有一个VMOperationQueue列队,所有的VM线程操作(vm_operation)都会被保存到这个列队当中,VMThread 本身就是一个线程,它的线程负责执行一个自轮询的loop函数(具体可以参考:

VMThread.cpp里面的

void VMThread::loop()) ,该loop函数从VMOperationQueue列队中按照优先级取出当前需要执行的操作对象(VM_Operation),

并且调用VM_Operation->evaluate函数去执行该操作类型本身的业务逻辑。

ps:VM操作类型被定义在

vm_operations.hpp文件内,列举几个:ThreadStop、ThreadDump、PrintThreads、GenCollectFull、GenCollectFullConcurrent、CMS_Initial_Mark、CMS_Final_Remark…..

1
2
3
4
SecurityManager securityManager = new SecurityManager();
ThreadInfo[] infos = ManagementFactory.getThreadMXBean().dumpAllThreads(true,true);
Stream.of(infos).forEach(info->{ System.out.println(info.getThreadName()+"\t"+info.getThreadId()+"\t"+info.getThreadState());
});

[参考文献]

  1. Java线程与内核线程