热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据湖风暴来袭,EMR重磅发布ApacheHudi

Hudi是一种数据湖的存储格式,在Hadoop文件系统之上提供了更新数据和删除数据的能力以及流式消费变化数据的能力。应用场景近实时数据摄取Hudi支持插入、更新和删除数据的能力。您

Hudi是一种数据湖的存储格式,在Hadoop文件系统之上提供了更新数据和删除数据的能力以及流式消费变化数据的能力。


应用场景



  • 近实时数据摄取

    Hudi支持插入、更新和删除数据的能力。您可以实时摄取消息队列(Kafka)和日志服务SLS等日志数据至Hudi中,同时也支持实时同步数据库Binlog产生的变更数据。

    Hudi优化了数据写入过程中产生的小文件。因此,相比其他传统的文件格式,Hudi对HDFS文件系统更加的友好。



  • 近实时数据分析

    Hudi支持多种数据分析引擎,包括Hive、Spark、Presto和Impala。Hudi作为一种文件格式,不需要依赖额外的服务进程,在使用上也更加的轻量化。



  • 增量数据处理

    Hudi支持Incremental Query查询类型,您可以通过Spark Streaming查询给定COMMIT后发生变更的数据。Hudi提供了一种流式消费HDFS变化数据的能力,可以用来优化现有的系统架构。




表类型

Hudi支持如下两种表类型:



  • Copy On Write

    使用专门的列式文件格式(Parquet)存储数据。Copy On Write表的更新操作需要通过重写实现。



  • Merge On Read

    使用列式文件格式(Parquet)和行式文件格式(Avro)混合的方式来存储数据。Merge On Read使用列式格式存放Base数据,同时使用行式格式存放增量数据。最新写入的增量数据存放至行式文件中,根据可配置的策略执行COMPACTION操作合并增量数据至列式文件中。




查询类型

Hudi支持如下三种查询类型:



  • Snapshot Queries

    可以查询COMMIT的最新快照数据。针对Merge On Read类型的表,查询时需要在线合并列存中的Base数据和日志中的实时数据;针对Copy On Write表,可以查询最新版本的Parquet数据。

    Copy On Write和Merge On Read表支持该类型的查询。



  • Incremental Queries

    支持增量查询的能力,可以查询给定COMMIT之后的最新数据。

    仅Copy On Write表支持该类型的查询。



  • Read Optimized Queries

    只能查询到给定COMMIT之前所限定范围的最新数据。Read Optimized Queries是对Merge On Read表类型快照查询的优化。

    Copy On Write和Merge On Read表支持该类型的查询。



写数据

EMR-3.32.0以及后续版本中,默认支持Hudi服务,因此使用Hudi时只需要在pom文件中添加Hudi依赖即可。


org.apache.hudi
hudi-spark_2.11
0.6.0
provided

写数据示例如下:



  • 插入或更新数据


    val spark = SparkSession
    .builder()
    .master("local[*]")
    .appName("hudi test")
    .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    .getOrCreate()
    import spark.implicits._
    val df = (for (i <- 0 until 10) yield (i, s"a$i", 30 + i * 0.2, 100 * i + 10000, s"p${i % 5}"))
    .toDF("id", "name", "price", "version", "dt")
    df.write.format("hudi")
    .option(TABLE_NAME, "hudi_test_0")
    // .option(OPERATION_OPT_KEY, UPSERT_OPERATION_OPT_VAL) //更新数据
    .option(OPERATION_OPT_KEY, INSERT_OPERATION_OPT_VAL) //插入数据
    .option(RECORDKEY_FIELD_OPT_KEY, "id")
    .option(PRECOMBINE_FIELD_OPT_KEY, "version")
    .option(KEYGENERATOR_CLASS_OPT_KEY, classOf[SimpleKeyGenerator].getName)
    .option(HIVE_PARTITION_EXTRACTOR_CLASS_OPT_KEY, classOf[MultiPartKeysValueExtractor].getCanonicalName)
    .option(PARTITIONPATH_FIELD_OPT_KEY, "dt")
    .option(HIVE_PARTITION_FIELDS_OPT_KEY, "ds")
    .option(META_SYNC_ENABLED_OPT_KEY, "true")//开启元数据同步功能
    .option(HIVE_USE_JDBC_OPT_KEY, "false")
    .option(HIVE_DATABASE_OPT_KEY, "default")
    .option(HIVE_TABLE_OPT_KEY, "hudi_test_0")
    .option(INSERT_PARALLELISM, "8")
    .option(UPSERT_PARALLELISM, "8")
    .mode(Overwrite)
    .save("/tmp/hudi/h0")


  • 删除数据


    df.write.format("hudi")
    .option(TABLE_NAME, "hudi_test_0")
    .option(OPERATION_OPT_KEY, DELETE_OPERATION_OPT_VAL) // 删除数据
    .option(RECORDKEY_FIELD_OPT_KEY, "id")
    .option(PRECOMBINE_FIELD_OPT_KEY, "version")
    .option(KEYGENERATOR_CLASS_OPT_KEY, classOf[SimpleKeyGenerator].getName)
    .option(PARTITIONPATH_FIELD_OPT_KEY, "dt")
    .option(DELETE_PARALLELISM, "8")
    .mode(Append)
    .save("/tmp/hudi/h0")

    数据查询



Hive或Presto查询Hudi表时,需要在写入阶段开启元数据同步功能(设置META_SYNC_ENABLED_OPT_KEY为true)。

针对社区版Hudi, Copy On Write表和Merge On Read表需要设置set hive.input.format = org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat。EMR版本的Copy On Write表不用设置format参数。

Hudi的详细信息,请参见https://hudi.apache.org/。


推荐阅读
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 优化使用Apache + Memcached-Session-Manager + Tomcat集群方案
    本文探讨了使用Apache、Memcached-Session-Manager和Tomcat集群构建高性能Web应用过程中遇到的问题及解决方案。通过重新设计物理架构,解决了单虚拟机环境无法真实模拟分布式环境的问题,并详细记录了性能测试结果。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 本文详细介绍如何使用 Apache Spark 执行基本任务,包括启动 Spark Shell、运行示例程序以及编写简单的 WordCount 程序。同时提供了参数配置的注意事项和优化建议。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 在使用Maven进行项目构建时,由于依赖库的下载速度慢常常让人感到沮丧,这直接影响了开发效率和学习热情。幸运的是,阿里云提供了一个快速的国内镜像服务,能够显著提升Maven项目的构建速度。 ... [详细]
  • 深入解析Spark核心架构与部署策略
    本文详细探讨了Spark的核心架构,包括其运行机制、任务调度和内存管理等方面,以及四种主要的部署模式:Standalone、Apache Mesos、Hadoop YARN和Kubernetes。通过本文,读者可以深入了解Spark的工作原理及其在不同环境下的部署方式。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 构建Filebeat-Kafka-Logstash-ElasticSearch-Kibana日志收集体系
    本文介绍了如何使用Filebeat、Kafka、Logstash、ElasticSearch和Kibana构建一个高效、可扩展的日志收集与分析系统。各组件分别承担不同的职责,确保日志数据能够被有效收集、处理、存储及可视化。 ... [详细]
  • 大数据时代的机器学习:人工特征工程与线性模型的局限
    本文探讨了在大数据背景下,人工特征工程与线性模型的应用及其局限性。随着数据量的激增和技术的进步,传统的特征工程方法面临挑战,文章提出了未来发展的可能方向。 ... [详细]
  • Python for 循环详解及应用
    在上一篇文章中,我们探讨了 while 循环和 if 判断的使用方法。本次我们将深入讲解 for 循环,并推荐一款强大的 Python 开发工具 PyCharm,帮助你更高效地编写代码。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
author-avatar
缘来是你-心定
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有