我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Apache Hudi数据布局的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Apache Hudi数据布局的方法

这篇文章主要介绍“Apache Hudi数据布局的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Apache Hudi数据布局的方法”文章能帮助大家解决问题。

    1. 背景

    Apache Hudi将流处理带到大数据,相比传统批处理效率高一个数量级,提供了更新鲜的数据。在数据湖/仓库中,需要在摄取速度和查询性能之间进行权衡,数据摄取通常更喜欢小文件以改善并行性并使数据尽快可用于查询,但很多小文件会导致查询性能下降。在摄取过程中通常会根据时间在同一位置放置数据,但如果把查询频繁的数据放在一起时,查询引擎的性能会更好,大多数系统都倾向于支持独立的优化来提高性能,以解决未优化的数据布局的限制。本博客介绍了一种称为Clustering[RFC-19]的服务,该服务可重新组织数据以提高查询性能,也不会影响摄取速度。

    2. Clustering架构

    Hudi通过其写入客户端API提供了不同的操作,如insert/upsert/bulk_insert来将数据写入Hudi表。为了能够在文件大小和摄取速度之间进行权衡,Hudi提供了一个hoodie.parquet.small.file.limit配置来设置最小文件大小。用户可以将该配置设置为0以强制新数据写入新的文件组,或设置为更高的值以确保新数据被"填充"到现有小的文件组中,直到达到指定大小为止,但其会增加摄取延迟。

    为能够支持快速摄取的同时不影响查询性能,我们引入了Clustering服务来重写数据以优化Hudi数据湖文件的布局。

    Clustering服务可以异步或同步运行,Clustering会添加了一种新的REPLACE操作类型,该操作类型将在Hudi元数据时间轴中标记Clustering操作。

    总体而言Clustering分为两个部分:

    •调度Clustering:使用可插拔的Clustering策略创建Clustering计划。•执行Clustering:使用执行策略处理计划以创建新文件并替换旧文件。

    2.1 调度Clustering

    调度Clustering会有如下步骤

    •识别符合Clustering条件的文件:根据所选的Clustering策略,调度逻辑将识别符合Clustering条件的文件。•根据特定条件对符合Clustering条件的文件进行分组。每个组的数据大小应为targetFileSize的倍数。分组是计划中定义的"策略"的一部分。此外还有一个选项可以限制组大小,以改善并行性并避免混排大量数据。•最后将Clustering计划以avro元数据格式保存到时间线。

    2.2 运行Clustering

    •读取Clustering计划,并获得clusteringGroups,其标记了需要进行Clustering的文件组。•对于每个组使用strategyParams实例化适当的策略类(例如:sortColumns),然后应用该策略重写数据。•创建一个REPLACE提交,并更新HoodieReplaceCommitMetadata中的元数据。

    Clustering服务基于Hudi的MVCC设计,允许继续插入新数据,而Clustering操作在后台运行以重新格式化数据布局,从而确保并发读写者之间的快照隔离。

    注意:现在对表进行Clustering时还不支持更新,将来会支持并发更新。

    Apache Hudi数据布局的方法

    2.3 Clustering配置

    使用Spark可以轻松设置内联Clustering,参考如下示例

    import org.apache.hudi.QuickstartUtils._</code><code>import scala.collection.JavaConversions._</code><code>import org.apache.spark.sql.SaveMode._</code><code>import org.apache.hudi.DataSourceReadOptions._</code><code>import org.apache.hudi.DataSourceWriteOptions._</code><code>import org.apache.hudi.config.HoodieWriteConfig._</code><code>val df =  //generate data frame</code><code>df.write.format("org.apache.hudi").</code><code>        options(getQuickstartWriteConfigs).</code><code>        option(PRECOMBINE_FIELD_OPT_KEY, "ts").</code><code>        option(RECORDKEY_FIELD_OPT_KEY, "uuid").</code><code>        option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").</code><code>        option(TABLE_NAME, "tableName").</code><code>        option("hoodie.parquet.small.file.limit", "0").</code><code>        option("hoodie.clustering.inline", "true").</code><code>        option("hoodie.clustering.inline.max.commits", "4").</code><code>        option("hoodie.clustering.plan.strategy.target.file.max.bytes", "1073741824").</code><code>        option("hoodie.clustering.plan.strategy.small.file.limit", "629145600").</code><code>        option("hoodie.clustering.plan.strategy.sort.columns", "column1,column2"). //optional, if sorting is needed as part of rewriting data</code><code>        mode(Append).</code><code>        save("dfs://location");

    对于设置更高级的异步Clustering管道,参考此处示例。

    3. 表查询性能

    我们使用生产环境表的一个分区创建了一个数据集,该表具有约2000万条记录,约200GB,数据集具有多个session_id的行。用户始终使用会话谓词查询数据,单个会话的数据会分布在多个数据文件中,因为数据摄取会根据到达时间对数据进行分组。下面实验表明通过对会话进行Clustering可以改善数据局部性并将查询执行时间减少50%以上。

    查询SQL如下

    spark.sql("select  *  from table where session_id=123")

    3.1 进行Clustering之前

    查询花费了2.2分钟。请注意查询计划的"扫描parquet"部分中的输出行数包括表中的所有2000W行。

    Apache Hudi数据布局的方法

    3.2 进行Clustering之后

    查询计划与上面类似,但由于改进了数据局部性和谓词下推,Spark可以修剪很多行。进行Clustering后,相同的查询在扫描parquet文件时仅输出11万行(2000万行中的),这将查询时间从2.2分钟减少到不到一分钟。

    Apache Hudi数据布局的方法

    下表总结了使用Spark3运行的实验对查询性能的改进

    Table StateQuery runtimeNum Records ProcessedNum files on diskSize of each file
    Unclustered130,673 ms~20M13642~150 MB
    Clustered55,963 ms~110K294~600 MB

    Clustering后查询运行时间减少了60%,在其他样本数据集上也观察到了类似的结果,请参阅示例查询计划和RFC-19性能评估上的更多详细信息。

    我们希望大型表能够大幅度提高速度,与上面的示例不同,查询运行时间几乎完全由实际I/O而不是查询计划决定。

    关于“Apache Hudi数据布局的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Apache Hudi数据布局的方法

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Apache Hudi数据布局的方法

    这篇文章主要介绍“Apache Hudi数据布局的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Apache Hudi数据布局的方法”文章能帮助大家解决问题。1. 背景Apache Hudi将流
    2023-06-29

    Vertica集成Apache Hudi重磅使用的方法

    本篇内容主要讲解“Vertica集成Apache Hudi重磅使用的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vertica集成Apache Hudi重磅使用的方法”吧!1. 摘要本文演
    2023-06-29

    Apache Hudi异步Clustering部署操作的方法

    本文小编为大家详细介绍“Apache Hudi异步Clustering部署操作的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Apache Hudi异步Clustering部署操作的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
    2023-06-29

    Z-Order加速Hudi大规模数据集的方法

    本篇内容介绍了“Z-Order加速Hudi大规模数据集的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 背景多维分析是大数据分析的一
    2023-06-29

    使用Apache Hudi 加速传统的批处理模式的方法

    目录1. 现状说明1.1 数据湖摄取和计算过程 - 处理更新1.2 当前批处理过程中的挑战2. Hudi 数据湖 — 查询模式2.1 面向分析师的表/OLAP(按 created_date 分区)2.2 面向ETL(按更新日期分
    2022-06-05

    CSS布局教程:实现瀑布流布局的最佳方法

    瀑布流布局(Waterfall Layout)是一种常见的网页布局方式,它可以使不同大小的元素以多列的形式依次排列,给人一种瀑布水流般的感觉。这种布局常用于照片墙、产品展示等需要展示多个项目的网页。本文将介绍如何使用CSS实现瀑布流布局,并
    2023-10-21

    CSS Positions布局实现多列等高布局的方法

    在网页开发中,实现多列等高布局是一个常见的需求。传统的方法是使用JavaScript来实现,但是这种方法存在兼容性和性能问题。现在我们可以通过使用CSS Positions布局来实现多列等高布局,不仅简单易用,而且效果良好。实现多列等高布局
    2023-10-21

    CSS布局教程:实现定位布局的最佳方法

    在Web开发中,CSS布局是非常重要的一项技能。一个好的布局能够使网页结构合理、页面效果美观,并且提升用户的交互体验。在Web布局中,定位布局常常被用来实现一些特殊的效果,比如层叠式的菜单、悬浮框等等。本文将带领大家深入了解定位布局的最佳实
    2023-10-21

    CSS布局教程:实现对比布局的最佳方法

    CSS布局教程:实现对比布局的最佳方法,需要具体代码示例引言:CSS是一种强大的样式语言,可以用于控制网页的布局和样式。在网页设计中,经常会遇到需要实现对比布局的情况。对比布局是指网页中的两个或多个元素以对比的方式排列和展示,从而吸引用户的
    2023-10-25

    CSS布局教程:实现平衡布局的最佳方法

    引言:在网页设计中,布局是非常重要的一环。一个好的布局能够让网页内容有序地展示,提高用户的浏览体验。在众多的布局方法中,平衡布局被广泛应用,既能满足设计要求,又能适应不同设备屏幕的显示。本文将介绍实现平衡布局的最佳方法,并提供具体的代码示例
    2023-10-21

    CSS布局教程:实现圆形布局的最佳方法

    CSS布局教程:实现圆形布局的最佳方法,需要具体代码示例在网页设计中,常常需要实现一些独特的布局效果来吸引用户的注意力。其中,圆形布局是一种非常常见且有趣的布局效果,可以用来展示图片、图标或者其他内容。本文将介绍实现圆形布局的最佳方法,并提
    2023-10-26

    CSS布局教程:实现流体布局的最佳方法

    引言:在Web开发中,布局是一个关键的概念。一个好的布局能够使网页看起来整洁、美观,并且在不同设备上都能完美呈现。而其中一种常见的布局方式就是流体布局。本文将介绍如何使用CSS实现流体布局,并提供具体的代码示例。什么是流体布局?流体布局是指
    2023-10-21

    CSS布局教程:实现圣杯布局的最佳方法

    引言:在网页开发中,布局是非常重要的一部分。好的布局能够使网页达到更好的可读性和可访问性。其中,圣杯布局是一种非常经典的布局方式,它能够在实现自适应的情况下使内容居中,保持优雅的显示效果。本文将为大家介绍如何使用最佳的方法实现圣杯布局,并给
    2023-10-21

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录