初见LakeSoul

LakeSoul 是由数元灵科技研发并于 2023 年 5 月捐赠给 Linux Foundation AI & Data 基金会的一个的云原生湖仓一体框架,具备高可扩展的元数据管理、ACID 事务、高效灵活的 upsert 操作、Schema 演进和批流一体化处理等特性。

LakeSoul 的主要特性:

  • 弹性架构:计算存储完全分离,不需要固定节点和磁盘,计算存储各自弹性扩容。并且针对云存储做了大量优化,在对象存储上实现了并发一致性、增量更新等功能;使用 LakeSoul 不需要维护固定的存储节点,云上对象存储的成本只有本地磁盘的 1/10,极大地降低了存储成本和运维成本;

  • 高效可扩展的元数据管理:LakeSoul 使用 Postgres 数据库来管理文件元数据,可以高效的处理元数据的修改,并能够支持多并发写入,解决了 Hive 等元数据层的性能瓶颈,如长时间运行后元数据解析缓慢的痛点。元数据层的表结构经过精心设计,所有读写操作都能够使用主键索引,达到很高的 Ops。同时,元数据库在云上也能够很容易地进行扩容。

  • ACID 事务:通过元数据库事务机制实现了两阶段提交协议,保证了流批一体提交的事务性,用户不会看到不一致数据;支持多并发写入,自动冲突处理机制;

  • 多级分区模式和高效灵活的 upsert 操作:LakeSoul 支持 range 和 hash 分区,通过灵活的 upsert 功能,支持行、列级别的增、删、改等更新操作,将 upsert 数据以 delta file 的形式保存,大幅提高了写数据效率和并发性,而优化过的 merge scan 提供了高效的 MergeOnRead 读取性能;

  • 批流一体:LakeSoul 支持 streaming sink,可以同时处理流式数据摄入和历史数据批量回填、交互式查询等场景;

  • Schema 演进:支持新增、删除列,并在读取时自动兼容旧数据;

  • CDC 流、日志流自动同步:支持 MySQL 整库千表同步,自动建表和自动 Schema 变更;支持 Kafka 多 topic 合并同步、自动 Schema 解析、自动新 Topic 感知;

  • 高性能 IO:使用 Rust Arrow 实现原生 Parquet IO,并对对象存储访问做了专门优化,性能优势明显;

  • 完整支持 Flink Changelog 语义,能够支持增量流式读取,通过 Flink SQL 即可实现实时数仓全链路增量计算;

  • 多种计算引擎支持:目前支持 Spark、Flink 以流或批的方式进行读和写,支持 Presto 查询,支持 Python/PyTorch 直接读取湖仓表。

  • 支持多空间多租户权限隔离:LakeSoul 使用 Postgres 的 RBAC 和行级别安全策略,实现了元数据的权限隔离。配合 Hadoop 用户和组,可以实现物理数据隔离。LakeSoul 的权限隔离对 SQL/Java/Python 的 作业都是有效的。

  • 支持自动压缩、自动过期数据清理、自动冗余数据清理。

    运行 docker-compose 例子

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    ata
    #👉👉👉➡️ ➡️ ➡️  git clone git@github.com:lakesoul-io/LakeSoul.git
    Cloning into 'LakeSoul'...
    remote: Enumerating objects: 19720, done.
    remote: Counting objects: 100% (1217/1217), done.
    remote: Compressing objects: 100% (585/585), done.
    remote: Total 19720 (delta 395), reused 1110
    #cd docker/lakesoul-docker-compose-env
    docker-compose  --profile s3 up -d
    [+] Building 0.0s (0/0)                                                                                                                                     docker:default
    [+] Running 9/9
     ✔ Network lakesoul-docker-compose-env_default          Created                                                                                                       0.4s
     ✔ Container lakesoul-docker-compose-env-jobmanager-1   Started                                                                                                       2.2s
     ✔ Container lakesoul-test-pg                           Started                                                                                                       3.6s
     ✔ Container lakesoul-docker-compose-env-mysql-1        Started                                                                                                       2.8s
     ✔ Container lakesoul-docker-compose-env-minio-1        Started                                                                                                       4.1s
     ✔ Container lakesoul-docker-compose-env-taskmanager-4  Started                                                                                                       2.1s
     ✔ Container lakesoul-docker-compose-env-taskmanager-3  Started                                                                                                       2.1s
     ✔ Container lakesoul-docker-compose-env-taskmanager-1  Started                                                                                                       2.1s
     ✔ Container lakesoul-docker-compose-env-taskmanager-2  Started
    

启动 spark-shell

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
docker run --net lakesoul-docker-compose-env_default --rm -ti \
    -v $(pwd)/lakesoul.properties:/opt/spark/work-dir/lakesoul.properties \
    --env lakesoul_home=/opt/spark/work-dir/lakesoul.properties bitnami/spark:3.3.1 \
    spark-shell \
    --packages com.dmetasoul:lakesoul-spark:2.2.0-spark-3.3 \
    --conf spark.sql.extensions=com.dmetasoul.lakesoul.sql.LakeSoulSparkSessionExtension \
    --conf spark.sql.catalog.lakesoul=org.apache.spark.sql.lakesoul.catalog.LakeSoulCatalog \
    --conf spark.sql.defaultCatalog=lakesoul \
    --conf spark.hadoop.fs.s3.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
    --conf spark.hadoop.fs.s3a.buffer.dir=/opt/spark/work-dir/s3a \
    --conf spark.hadoop.fs.s3a.path.style.access=true \
    --conf spark.hadoop.fs.s3a.endpoint=http://minio:9000 \
    --conf spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider \
    --conf spark.hadoop.fs.s3a.access.key=minioadmin1 \
    --conf spark.hadoop.fs.s3a.secret.key=minioadmin1

进入 spark-shell 输入

1
2
3
4
5
6
7
8
9
    val tablePath= "s3://lakesoul-test-bucket/test_table"
val df = Seq(("2021-01-01",1,"rice"),("2021-01-01",2,"bread")).toDF("date","id","name")
df.write
  .mode("append")
  .format("lakesoul")
  .option("rangePartitions","date")
  .option("hashPartitions","id")
  .option("hashBucketNum","2")
  .save(tablePath)

运行完成后,可以在 minio 里面看见数据。

image-20231027135939390

参考文档:

https://lakesoul-io.github.io/zh-Hans/docs/intro

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up