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
- https://aws.amazon.com/ko/blogs/aws/new-insert-update-delete-data-on-s3-with-amazon-emr-and-apache-hudi/를 참조하면 insert(create table)/upsert/delete/rollback등의 기능을 테스트해볼수 있습니다.
- 처음 테이블 생성시에 DataSourceWriteOptions.OPERATION_OPT_KEY -> DataSourceWriteOptions.INSERT_OPERATION_OPT_VAL 하면 key 중복으로 데이터가 insert되므로 UPSERT_OPERATION_OPT_VAL 로 수정하면 중복없이 테이블이 생성됩니다.
- hudi 사이트에 나온 예제는 https://hudi.incubator.apache.org/quickstart.html partition key가 3depth로 되어있는데, aws glue meta store문제인지 aws에서는 에러가 나는 상황입니다.(2019/11/25)
- MergeOnRead 모드를 이용한 실시간 적재는 더 테스트후에 의미있는결과가 나오면 포스팅하도록 할께요.