Delta Lake là một khung lưu trữ nguồn mở được sử dụng để xây dựng các hồ dữ liệu trên bộ lưu trữ đối tượng trong kiến trúc Lakehouse. Delta Lake hỗ trợ các giao dịch ACID, xử lý siêu dữ liệu có thể mở rộng và xử lý dữ liệu hàng loạt và truyền trực tuyến thống nhất. Delta Lake thường được sử dụng để cung cấp độ tin cậy, tính nhất quán và khả năng mở rộng cho các ứng dụng Apache Spark. Delta Lake chạy trên đỉnh của bộ lưu trữ hồ dữ liệu hiện có, chẳng hạn như MinIO và tương thích với API Apache Spark.
Bài viết gốc của Delta Lake ( Delta Lake: Lưu trữ bảng ACID hiệu suất cao trên các cửa hàng đối tượng đám mây ) mô tả cách nó được xây dựng để lưu trữ đối tượng đám mây. Khi Vertica kiểm tra việc sử dụng Delta Lake cho các bảng bên ngoài, họ đã dựa vào MinIO. Khách hàng HPE Ezmeral Runtime Enterprise chạy Delta Lake trên MinIO . MinIO hỗ trợ các yêu cầu về độ bền của Delta Lake vì MinIO tuân theo các mô hình nhất quán đọc-sau-ghi và liệt kê-sau-ghi nghiêm ngặt cho tất cả các hoạt động i/o ở cả chế độ phân tán và độc lập và được thừa nhận rộng rãi để chạy khối lượng công việc của Delta Lake.
Nhiều tổ chức dựa vào các kho lưu trữ đối tượng gốc trên đám mây như MinIO và AWS S3 để chứa các tập dữ liệu lớn có cấu trúc, bán cấu trúc và phi cấu trúc. Mỗi bảng được lưu trữ dưới dạng một tập hợp các đối tượng là Parquet hoặc ORC và được sắp xếp thành các phân vùng. Các truy vấn đối với các tệp lớn về cơ bản là các lần quét thực hiện nhanh chóng.
Nếu không có Delta Lake, khối lượng công việc Spark phức tạp hơn, đặc biệt là những khối lượng công việc sửa đổi, thêm hoặc xóa dữ liệu, sẽ gặp phải những thách thức về hiệu suất và tính chính xác khi tải nhiều ứng dụng/nhiều người dùng. Các cập nhật đa đối tượng không phải là nguyên tử và các truy vấn không bị cô lập, nghĩa là nếu việc xóa được tiến hành trong một truy vấn thì các truy vấn đồng thời khác sẽ nhận được một phần kết quả khi truy vấn ban đầu cập nhật từng đối tượng. Quá trình ghi lùi lại rất phức tạp và sự cố xảy ra trong quá trình cập nhật có thể dẫn đến bảng bị hỏng. Kẻ giết người hiệu suất thực sự là siêu dữ liệu – đối với các bảng lớn với hàng triệu đối tượng là các tệp Parquet chứa hàng tỷ hoặc hàng nghìn tỷ bản ghi, hoạt động siêu dữ liệu có thể khiến các ứng dụng được xây dựng trên hồ dữ liệu dừng lại.
Delta Lake được thiết kế để kết hợp độ tin cậy trong giao dịch của cơ sở dữ liệu với khả năng mở rộng theo chiều ngang của hồ dữ liệu. Delta Lake được xây dựng để hỗ trợ khối lượng công việc kiểu OLAP với lớp lưu trữ bảng ACID trên các kho lưu trữ đối tượng gốc trên đám mây, chẳng hạn như MinIO. Như được mô tả trong bài viết Hồ Delta: lưu trữ bảng ACID hiệu suất cao trên các cửa hàng đối tượng trên đám mây , “ý tưởng cốt lõi của Hồ Delta rất đơn giản: chúng tôi duy trì thông tin về những đối tượng nào là một phần của bảng Delta theo cách ACID, sử dụng một lệnh ghi nhật ký phía trước được lưu trữ trong kho lưu trữ đối tượng đám mây.” Các đối tượng được mã hóa trong Parquet và có thể được đọc bởi một công cụ hiểu Parquet. Nhiều đối tượng có thể được cập nhật cùng một lúc “theo cách tuần tự hóa trong khi vẫn đạt được hiệu suất đọc và ghi song song cao”. Nhật ký chứa siêu dữ liệu, chẳng hạn như số liệu thống kê tối thiểu/tối đa cho mỗi tệp, "cho phép tìm kiếm siêu dữ liệu theo thứ tự cường độ nhanh hơn" so với tìm kiếm tệp trực tiếp trong kho đối tượng.
Hồ Delta cung cấp những điều sau đây:
Kiến trúc Lakehouse, đặc biệt là Delta Lake, mang lại chức năng mới quan trọng cho các hồ dữ liệu được xây dựng trên bộ lưu trữ đối tượng. Delta Lake hoạt động với danh sách ứng dụng và công cụ tính toán ngày càng lớn như Spark, Starburst, Trino, Flink và Hive, đồng thời bao gồm các API cho Scala, Java, Rust, Ruby và Python. Được xây dựng cho đám mây, Kubernetes-native MinIO cho phép các ứng dụng hồ dữ liệu hoạt động hiệu quả, linh hoạt và an toàn ở mọi nơi - ở vùng biên, trong trung tâm dữ liệu và trong đám mây công cộng/riêng tư.
Bảng Delta là một tập hợp các tệp được lưu trữ cùng nhau trong một thư mục (đối với hệ thống tệp) hoặc bộ chứa (đối với MinIO và bộ lưu trữ đối tượng khác). Để đọc và ghi từ bộ lưu trữ đối tượng, Delta Lake sử dụng sơ đồ đường dẫn để xác định động hệ thống lưu trữ và sử dụng triển khai LogStore tương ứng để đảm bảo ACID. Đối với MinIO, bạn sẽ sử dụng S3A, xem Cấu hình lưu trữ — Tài liệu Delta Lake . Điều quan trọng là hệ thống lưu trữ cơ bản được sử dụng cho Delta Lake có khả năng đọc/ghi nguyên tử đồng thời, cũng như MinIO.
Tạo bảng Delta thực sự là ghi tệp vào thư mục hoặc nhóm. Các bảng delta được tạo (mở) bằng cách viết (đọc) Spark DataFrame và chỉ định định dạng và đường dẫn delta
. Trong Scala, ví dụ:
// Create a Delta table on MinIO: spark.range(5).write.format("delta").save("s3a://<your-minio-bucket>/<path-to-delta-table>") // Read a Delta table on S3: spark.read.format("delta").load("s3a://<your-mnio-bucket>/<path-to-delta-table>").show()
Delta Lake dựa trên một nhóm trên mỗi bảng và các nhóm thường được mô hình hóa theo các đường dẫn hệ thống tệp. Bảng Delta Lake là một thùng chứa dữ liệu, siêu dữ liệu và nhật ký giao dịch. Bảng được lưu trữ ở định dạng Parquet. Các bảng có thể được phân vùng thành nhiều tệp. MinIO hỗ trợ S3 LIST để liệt kê các đối tượng một cách hiệu quả bằng cách sử dụng các đường dẫn kiểu hệ thống tệp. MinIO cũng hỗ trợ các yêu cầu phạm vi byte để đọc tập hợp con của tệp Parquet lớn hiệu quả hơn.
MinIO là một ngôi nhà tuyệt vời cho các bảng Delta Lake do hiệu suất hàng đầu trong ngành. Sự kết hợp giữa khả năng mở rộng và hiệu suất cao của MinIO đặt mọi khối lượng công việc, bất kể đòi hỏi khắt khe đến đâu, đều nằm trong tầm tay. MinIO có khả năng đạt hiệu suất cực cao - điểm chuẩn gần đây đạt được là 325 GiB/giây (349 GB/giây) trên GET và 165 GiB/giây (177 GB/giây) trên PUT chỉ với 32 nút SSD NVMe bán sẵn. MinIO không chỉ cung cấp hiệu suất cần thiết để cung cấp năng lượng cho khối lượng công việc đòi hỏi khắt khe nhất trên Delta Lake.
Có khả năng các bộ chứa Delta Lake sẽ chứa nhiều tệp Parquet và JSON, những tệp này thực sự phù hợp với tất cả các tối ưu hóa tệp nhỏ mà chúng tôi đã tích hợp vào MinIO để sử dụng làm hồ dữ liệu. Các đối tượng nhỏ được lưu nội tuyến với siêu dữ liệu, giảm IOPS cần thiết để đọc và ghi các tệp nhỏ như giao dịch Delta Lake.
Hầu hết các doanh nghiệp yêu cầu chức năng đa đám mây cho Delta Lake. MinIO bao gồm sao chép chủ động-tích cực để đồng bộ hóa dữ liệu giữa các vị trí - tại chỗ, trong đám mây công cộng/riêng tư và ở biên. Sao chép tích cực-chủ động cho phép doanh nghiệp kiến trúc để có khả năng phục hồi đa vùng địa lý và chuyển đổi dự phòng nóng-nóng nhanh. Mỗi nhóm hoặc bảng Delta Lake có thể được định cấu hình để sao chép riêng biệt nhằm mang lại tính khả dụng và bảo mật cao nhất.
Việc thêm các giao dịch ACID (Nguyên tử, Tính nhất quán, Cách ly và Độ bền) vào hồ dữ liệu là một vấn đề khá lớn vì giờ đây các tổ chức có quyền kiểm soát tốt hơn và do đó tin tưởng hơn vào khối lượng dữ liệu được lưu trữ trong hồ dữ liệu. Trước đây, các doanh nghiệp dựa vào Spark để làm việc với các hồ dữ liệu thiếu API nguyên tử và giao dịch ACID, nhưng giờ đây, Delta Lake đã làm được điều đó. Dữ liệu có thể được cập nhật sau khi được chụp và ghi, đồng thời với sự hỗ trợ cho ACID, dữ liệu sẽ không bị mất nếu ứng dụng gặp sự cố trong quá trình vận hành. Delta Lake thực hiện điều này bằng cách đóng vai trò trung gian giữa Spark và MinIO để đọc và ghi dữ liệu.
Trung tâm của Delta Lake là DeltaLog , một bản ghi theo thứ tự các giao dịch được thực hiện bởi người dùng và ứng dụng. Mọi hoạt động (như CẬP NHẬT hoặc CHÈN) được thực hiện trên bảng Delta Lake bởi người dùng là một cam kết nguyên tử bao gồm nhiều hành động hoặc công việc. Khi mọi hành động hoàn thành thành công, thì cam kết được ghi lại dưới dạng một mục trong DeltaLog. Nếu bất kỳ công việc nào không thành công, thì cam kết sẽ không được ghi lại trong DeltaLog. Nếu không có tính nguyên tử, dữ liệu có thể bị hỏng trong trường hợp lỗi phần cứng hoặc phần mềm dẫn đến dữ liệu chỉ được ghi một phần.
Delta Lake chia các hoạt động thành một hoặc nhiều hành động sau:
Thêm tệp - thêm tệp
Xóa tệp - xóa tệp
Cập nhật siêu dữ liệu - ghi lại các thay đổi đối với tên, lược đồ hoặc phân vùng của bảng
Đặt giao dịch - ghi lại rằng một công việc phát trực tuyến đã cam kết dữ liệu
Thông tin cam kết - thông tin về cam kết bao gồm hoạt động, người dùng và thời gian
Thay đổi giao thức - cập nhật DeltaLog lên giao thức phần mềm mới nhất
Nó không phức tạp như nó xuất hiện. Ví dụ: nếu người dùng thêm một cột mới vào bảng và thêm dữ liệu vào đó, thì Delta Lake sẽ chia nhỏ điều đó thành các hành động thành phần của nó - cập nhật siêu dữ liệu để thêm cột và thêm tệp cho mỗi tệp mới được thêm - và thêm chúng vào DeltaLog khi chúng hoàn thành.
Delta Lake dựa vào kiểm soát đồng thời lạc quan để cho phép nhiều người đọc và người viết của một bảng nhất định làm việc trên bảng cùng một lúc. Kiểm soát đồng thời lạc quan giả định rằng các thay đổi đối với một bảng được thực hiện bởi những người dùng khác nhau có thể hoàn thành mà không xung đột. Khi khối lượng dữ liệu tăng lên thì khả năng người dùng sẽ làm việc trên các bảng khác nhau cũng tăng theo. Delta Lake tuần tự hóa các cam kết và tuân theo quy tắc loại trừ lẫn nhau nếu hai hoặc nhiều cam kết diễn ra cùng một lúc. Khi làm như vậy, Delta Lake đạt được sự cô lập cần thiết cho ACID và bảng sẽ trông giống nhau sau nhiều lần ghi đồng thời giống như nếu những lần ghi đó xảy ra nối tiếp và riêng biệt với nhau.
Khi người dùng chạy một truy vấn mới trên một bảng mở đã được sửa đổi kể từ lần cuối nó được đọc, Spark sẽ tham khảo DeltaLog để xác định xem các giao dịch mới đã được đăng lên bảng chưa và cập nhật bảng của người dùng với những thay đổi mới đó. Điều này đảm bảo rằng phiên bản bảng của người dùng được đồng bộ hóa với bảng chính trong Delta Lake cho hoạt động gần đây nhất và người dùng không thể thực hiện các cập nhật xung đột cho bảng.
DeltaLog, kiểm soát đồng thời lạc quan và thực thi lược đồ (kết hợp với khả năng phát triển lược đồ) đảm bảo cả tính nguyên tử và tính nhất quán.
Khi người dùng tạo bảng Delta Lake, nhật ký giao dịch của bảng đó sẽ tự động được tạo trong thư mục con _delta_log
. Khi người dùng sửa đổi bảng, mỗi lần xác nhận được ghi dưới dạng tệp JSON vào thư mục con _delta_log
theo thứ tự tăng dần, tức là 000000.json
, 000001.json
, 000002.json
và hơn thế nữa.
Giả sử chúng ta thêm các bản ghi mới vào bảng của mình từ các tệp dữ liệu 1.parquet
và 2.parquet
. Giao dịch đó được thêm vào DeltaLog và được lưu dưới dạng tệp 000000.json
. Sau đó, chúng tôi xóa các tệp đó và thay vào đó thêm tệp mới 3.parquet
. Những hành động đó được ghi lại dưới dạng một tệp mới, 000001.json
.
Sau khi 1.parquet
và 2.parquet
được thêm vào, chúng đã bị xóa. Nhật ký giao dịch chứa cả hai hoạt động mặc dù chúng phủ định lẫn nhau. Delta Lake giữ lại tất cả các cam kết nguyên tử để kích hoạt lịch sử kiểm toán hoàn chỉnh và các tính năng du hành thời gian cho người dùng thấy cách một bảng nhìn vào một thời điểm cụ thể. Hơn nữa, các tệp không bị xóa nhanh chóng khỏi bộ lưu trữ cho đến khi công việc VACUUM được chạy. Tạo phiên bản MinIO cung cấp một lớp đảm bảo khác chống lại việc xóa do vô tình.
Delta Lake đạt được độ bền bằng cách lưu trữ các bảng và nhật ký giao dịch trên phương tiện liên tục. Các tệp không bao giờ bị ghi đè và phải được xóa tích cực. Tất cả các thay đổi dữ liệu được ghi vào bộ lưu trữ đều có sẵn cho người dùng nguyên bản khi chúng xảy ra. Các tệp một phần và bị hỏng đã trở thành dĩ vãng. Delta Lake không giữ các bảng và nhật ký RAM trong một thời gian dài và ghi chúng trực tiếp vào MinIO. Miễn là dữ liệu cam kết được ghi lại trong DeltaLog và các tệp JSON được ghi vào bộ chứa, dữ liệu sẽ bền trong trường hợp xảy ra sự cố hệ thống hoặc công việc.
MinIO đảm bảo độ bền sau khi một bảng và các thành phần của nó được viết thông qua nhiều cơ chế:
MinIO bảo mật các bảng Delta Lake bằng cách sử dụng mã hóa và điều chỉnh quyền truy cập vào chúng bằng cách sử dụng kết hợp các biện pháp kiểm soát truy cập dựa trên chính sách và IAM. MinIO mã hóa dữ liệu trong quá trình truyền bằng TLS và dữ liệu trên các ổ đĩa có mã hóa cấp đối tượng chi tiết bằng các thuật toán mã hóa tiêu chuẩn ngành, hiện đại, chẳng hạn như AES-256-GCM, ChaCha20-Poly1305 và AES-CBC. MinIO tích hợp với các nhà cung cấp danh tính bên ngoài như ActiveDirectory/LDAP, Okta và Keycloak cho IAM. Sau đó, người dùng và nhóm phải tuân theo PBAC tương thích với AWS IAM khi họ cố gắng truy cập các bảng Delta Lake.
Phần này giải thích cách nhanh chóng bắt đầu đọc và ghi các bảng Delta trên MinIO bằng chế độ một cụm.
/home/spark
.hadoop-aws-2.6.5.jar
- Delta Lake cần lớp org.apache.hadoop.fs.s3a.S3AFileSystem
từ gói hadoop-aws
, gói này triển khai API FileSystem
của Hadoop cho S3. Đảm bảo rằng phiên bản của gói này khớp với phiên bản Hadoop mà Spark được tạo.aws-java-sdk-1.7.4.jar
Khởi động trình bao Spark (Scala hoặc Python) với Delta Lake và chạy các đoạn mã một cách tương tác.
Trong Scala:
bin/spark-shell --packages io.delta:delta-core_2.12:1.2.1 --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
Chạy lệnh sau để khởi chạy trình bao Spark với hỗ trợ Delta Lake và S3 cho MinIO:
bin/spark-shell \ --packages io.delta:delta-core_2.12:1.2.1,org.apache.hadoop:hadoop-aws:3.3.1 \ --conf spark.hadoop.fs.s3a.access.key=<your-MinIO-access-key> \ --conf spark.hadoop.fs.s3a.secret.key=<your-MinIO-secret-key> --conf "spark.hadoop.fs.s3a.endpoint=<your-MinIO-IP:port> \ --conf "spark.databricks.delta.retentionDurationCheck.enabled=false" \ --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" \ --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
Sử dụng Máy khách MinIO để tạo thùng cho Delta Lake:
mc alias set minio http://<your-MinIO-IP:port> <your-MinIO-access-key> <your-MinIO-secret-key> mc mb minio\delta-lake
Hãy dùng thử và tạo một bảng Delta Lake đơn giản bằng Scala:
// Create a Delta table on MinIO: spark.range(500).write.format("delta").save("s3a://delta-lake/demo1")
Bạn sẽ thấy kết quả nào đó cho biết Spark đã viết bảng thành công.
Mở trình duyệt để đăng nhập vào MinIO tại http://<your-MinIO-IP:9001>
bằng khóa truy cập và khóa bí mật của bạn. Bạn sẽ thấy bảng Delta Lake trong thùng:
Sự kết hợp giữa MinIO và Delta Lake cho phép các doanh nghiệp có một kho dữ liệu đa đám mây, đóng vai trò là một nguồn thông tin hợp nhất duy nhất. Khả năng truy vấn và cập nhật các bảng Delta Lake cung cấp cho doanh nghiệp những hiểu biết phong phú về doanh nghiệp và khách hàng của họ. Nhiều nhóm khác nhau truy cập các bảng Delta Lake cho các sáng kiến phân tích hoặc học máy của riêng họ, biết rằng công việc của họ được bảo mật và dữ liệu kịp thời.
Để tìm hiểu sâu hơn, hãy tải xuống MinIO và tự mình xem hoặc tạo một phiên bản thị trường trên bất kỳ đám mây công cộng nào. Bạn có câu hỏi? Hỏi ngay trên Slack hoặc qua [email protected].
Cũng được xuất bản ở đây .