热门标签 | 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/。


推荐阅读
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 本文介绍如何通过整合SparkSQL与Hive来构建高效的用户画像环境,提高数据处理速度和查询效率。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • 龙蜥社区开发者访谈:技术生涯的三次蜕变 | 第3期
    龙蜥社区的开发者们通过自己的实践和经验,推动着开源技术的发展。本期「龙蜥开发者说」聚焦于一位资深开发者的三次技术转型,分享他在龙蜥社区的成长故事。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 本文探讨了有效学习专业技能的方法,包括编程语言、操作系统、软件组件及前沿技术的探索,旨在为初学者提供一套系统的自学指南。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • 本文介绍了如何在 MapReduce 作业中使用 SequenceFileOutputFormat 生成 SequenceFile 文件,并详细解释了 SequenceFile 的结构和用途。 ... [详细]
  • 大数据领域的职业路径与角色解析
    本文将深入探讨大数据领域的各种职业和工作角色,帮助读者全面了解大数据行业的需求、市场趋势,以及从入门到高级专业人士的职业发展路径。文章还将详细介绍不同公司对大数据人才的需求,并解析各岗位的具体职责、所需技能和经验。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
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社区 版权所有