본문 바로가기

Data&Processing

apache hudi 소개

hudi 소개(간단함)

hudi는 현재 apache incubator project로서 "big data에 스트림 처리를 제공하며, 기존 batch보다 나은 최신데이터를 제공한다" 라고 나와있습니다. 말이 좀 어려울수도 있는데 hudi에 이름에서 알수있듯이(Hadoop Upserts Deletes Incrementals), Hive에서 CUD(create update delete)가 가능하다는 말이며, 데이터엔지니어들이 어려움을 격었던 Hadoop환경에서의 데이터 변경에 대한 처리를 해결할 수 있을 뿐더러 실시간에 대한 요건도 담당할수 있을것으로 기대가 됩니다.

왜 hudi 인가? hudi 외에 대안은?

  • emr 5.28.0 에서 hudi 적용을 발표 https://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/emr-hudi.html
  • Delta Lake
    • Delta Lake is an open-source storage layer that brings ACID transactions to Apache Spark™ and big data workloads.
    • https://delta.io/
    • github을 확인하면 databricks 직원이 만들었다고 나오는데 어떤 관계인지는 모르겠습니다.
  • Apache Iceberg(incubating)
    • Apache Iceberg is an open table format for huge analytic datasets.Iceberg adds tables to Presto and Spark that use a high-performance format that works just like a SQL table.
    • https://iceberg.apache.org/
    • netflix 에서 개발해서 apache project 로 전환되었습니다.
  • 특징
    • 각 solution별 기능은 현재 spec에 나온 기능만을 확인한 것으로 성능이나 기능에 대한 테스트는 아직 이루어 지지 않았습니다. 왜나하면 delta lake는 SQL활용에 있어서 spark를 활용해서만 데이터 저장 및 처리가 가능하고, iceberg는 spark, presto(presto-pull-458) 지원하지만 create table은 아직 api를 통해서만 지원하고 있습니다. delta-lake, iceberge 모두 spark 3.0에서 자유로운 sql사용을 지원한다고 계획하고 있어서, 그 이후에 poc/test를 해보는것이 좋을것으로 보입니다.
    • iceberg
    • delta lake
      Apache Hive™ & Presto Support : Integrations with other big data engines like Apache Hive and Presto to read from Delta Lake.
      변경데이터를 바로 테이블 형태로 제공한다기 보다는 spark 을 통해서 파일기반 데이터를 변경하는데 초점이 맞추어져있는듯 합니다.
    • iceberg와 delta lake는 테스트하기에는 시간이 좀 더 필요한 듯 하여, 이왕이면 세 제품을 같이 적용해보면 좋겠지만, hudi는 emr에 적용되기도 하고 기능도 aws에서 사용할수 있는 수준이 되어보여 테스트를 해보기로 하였습니다.

https://hudi.incubator.apache.org/concepts.html#storage-types 

Hudi Processing 종류

hudi processing 종류는 copyOnWrite, MergeOnRead가 있습니다.

  • CopyOnWrite
    • 변경데이터에 대해서 batch로 처리하며,
    • 데이터를 합쳐서 하나의 parquet 파일을 생성합니다.
  • MergeOnRead
    • 변경데이터에 대해서는 실시간으로 처리하고
    • 변경분 데이터에 대해서는 avro로 저장하고
    • 1분단위 commit
    • 5분단위 data compaction 을 하고 해당파일이 base file(parquet)로 됨
    • 사용자에게 ReadOptimized (RO) Table(실시간 반영안됨) 과 Near-Realtime (RT) table(실시간 반영된 테이블)을 제공
Trade-off CopyOnWrite MergeOnRead
Data Latency Higher Lower
Update cost (I/O) Higher (rewrite entire parquet) Lower (append to delta log)
Parquet File Size Smaller (high update(I/0) cost) Larger (low update cost)
Write Amplification Higher Lower (depending on compaction strategy)

Views 종류

  • Read Optimized View : Queries on this view see the latest snapshot of the dataset as of a given commit or compaction action. This view exposes only the base/columnar files in latest file slices to the queries and guarantees the same columnar query performance compared to a non-hudi columnar dataset.
  • Incremental View : Queries on this view only see new data written to the dataset, since a given commit/compaction. This view effectively provides change streams to enable incremental data pipelines.
  • Realtime View : Queries on this view see the latest snapshot of dataset as of a given delta commit action. This view provides near-real time datasets (few mins) by merging the base and delta files of the latest file slice on-the-fly.

 

적용

  • emr에서의 hudi
  • hudi 사이트에 나온 예제는 https://hudi.incubator.apache.org/quickstart.html partition key가 3depth로 되어있는데, aws glue meta store문제인지 aws에서는 에러가 나는 상황입니다.(2019/11/25)
  • MergeOnRead 모드를 이용한 실시간 적재는 더 테스트후에 의미있는결과가 나오면 포스팅하도록 할께요.