Bởi Preshen Goobiah, Johan Olivier, Sudipta Bagchi, Vuyisa Maswana, and Syed Humair | ngày 10 tháng 11 năm 2023 | tại Amazon Redshift, Customer Solutions, Technical How-To | Permalink | Comments | Share
Bài viết này được đồng viết bởi Preshen Goobiah và Johan Olivier từ Capitec.
Apache Spark là một hệ thống xử lý phân tán nguồn mở được sử dụng cho các khối lượng công việc dữ liệu lớn. Nó tìm thấy ứng dụng thường xuyên trong số các nhà phát triển Spark làm việc với Amazon EMR, Amazon SageMaker, AWS Glue và các ứng dụng Spark tùy chỉnh.
Amazon Redshift cung cấp khả năng tích hợp liền mạch với Apache Spark, cho phép bạn dễ dàng truy cập dữ liệu Redshift của mình trên cả cụm được khởi tạo Amazon Redshift và Amazon Redshift Serverless. Sự tích hợp này mở rộng khả năng cho các giải pháp phân tích và máy học (ML) của AWS, giúp data warehouse có thể truy cập được với nhiều ứng dụng hơn.
Với tích hợp Amazon Redshift cho Apache Spark, bạn có thể nhanh chóng bắt đầu và dễ dàng phát triển các ứng dụng Spark bằng các ngôn ngữ phổ biến như Java, Scala, Python, SQL và R. Ứng dụng của bạn có thể đọc và ghi liền mạch vào Amazon Redshift data warehouse trong khi vẫn duy trì hiệu suất tối ưu và tính nhất quán trong giao dịch. Ngoài ra, bạn sẽ được hưởng lợi từ việc cải thiện hiệu suất thông qua tối ưu hóa, nâng cao hơn nữa hiệu quả hoạt động của bạn.
Capitec, ngân hàng bán lẻ lớn nhất Nam Phi với hơn 21 triệu khách hàng ngân hàng bán lẻ, đặt mục tiêu cung cấp các dịch vụ tài chính đơn giản, giá cả phải chăng và dễ tiếp cận nhằm giúp người dân Nam Phi sử dụng ngân hàng tốt hơn để họ có thể sống tốt hơn. Trong bài viết này, chúng tôi thảo luận về việc tích hợp thành công trình kết nối Amazon Redshift của nhóm Capitec’s shared services Feature Platform. Nhờ sử dụng tính năng tích hợp Amazon Redshift cho Apache Spark, năng suất của nhà phát triển đã tăng lên gấp 10 lần, quy trình tạo tính năng được sắp xếp hợp lý và tình trạng trùng lặp dữ liệu giảm xuống mức 0.
Cơ hội kinh doanh
Có 19 mô hình dự đoán trong phạm vi sử dụng 93 tính năng được xây dựng bằng AWS Glue trên các bộ phận Tín dụng Bán lẻ của Capitec. Bản ghi tính năng được bổ sung thêm dữ kiện và kích thước được lưu trữ trong Amazon Redshift. Apache PySpark được chọn để tạo ra các tính năng vì nó cung cấp cơ chế nhanh chóng, phi tập trung và có thể mở rộng để sắp xếp dữ liệu từ nhiều nguồn khác nhau.
Các tính năng sản xuất này đóng một vai trò quan trọng trong việc hỗ trợ các ứng dụng cho vay có thời hạn cố định theo thời gian thực, ứng dụng thẻ tín dụng, giám sát hành vi tín dụng hàng tháng và xác định mức lương hàng ngày trong doanh nghiệp.
Vấn đề tìm nguồn dữ liệu
Để đảm bảo độ tin cậy của đường dẫn dữ liệu PySpark, điều cần thiết là phải có dữ liệu nhất quán ở cấp bảng từ cả dimensional và fact tables được lưu trữ trong Enterprise Data Warehouse (EDW). Sau đó, các bảng này được nối với các bảng từ Enterprise Data Lake (EDL).
Trong quá trình phát triển tính năng, các kỹ sư dữ liệu yêu cầu giao diện liền mạch với (EDW). Giao diện này cho phép họ truy cập và tích hợp dữ liệu cần thiết từ EDW vào data pipeline, cho phép phát triển và thử nghiệm các tính năng một cách hiệu quả.
Quy trình giải quyết vấn đề trước đó
Trong giải pháp trước đó, các kỹ sư dữ liệu của nhóm sản phẩm đã dành 30 phút mỗi lần chạy để hiển thị dữ liệu Redshift cho Spark theo cách thủ công. Các bước bao gồm:
- Xây dựng một truy vấn xác định bằng Python.
- Gửi truy vấn UNLOAD thông qua Amazon Redshift Data API.
- Lấy danh mục dữ liệu trong AWS Glue Data Catalog thông qua AWS SDK dành cho Pandas bằng cách lấy mẫu.
Với cách tiếp cận này đặt ra các vấn đề đối với các tập dữ liệu lớn, yêu cầu nhóm nền tảng phải bảo trì định kỳ và rất phức tạp để tự động hóa.
Tổng quan về giải pháp hiện tại
Capitec đã có thể giải quyết những vấn đề này nhờ tích hợp Amazon Redshift cho Apache Spark trong quy trình tạo tính năng. Kiến trúc được mô tả trong sơ đồ sau.
Quy trình làm việc bao gồm các bước sau:
- Các thư viện nội bộ được cài đặt vào tác vụ AWS Glue PySpark thông qua AWS CodeArtifact.
- AWS Glue job truy xuất thông tin xác thực của cụm Redshift từ AWS Secrets Manager và thiết lập kết nối Amazon Redshift (chèn thông tin xác thực cụm, vị trí hủy tải, định dạng tệp) thông qua thư viện nội bộ được chia sẻ. Tích hợp Amazon Redshift cho Apache Spark cũng hỗ trợ sử dụng AWS Identity and Access Management (IAM) để truy xuất thông tin xác thực và kết nối với Amazon Redshift
- Truy vấn Spark được chuyển thành truy vấn được tối ưu hóa Amazon Redshift và gửi tới EDW. Điều này được thực hiện nhờ tích hợp Amazon Redshift cho Apache Spark.
- Tập dữ liệu EDW được tải vào tiền tố tạm thời trong Amazon Simple Storage Service (Amazon S3) bucket.
- Tập dữ liệu EDW từ S3 bucket được tải vào Spark executors thông qua tích hợp Amazon Redshift cho Apache Spark.
- Tập dữ liệu EDL được tải vào Spark executors thông qua AWS Glue Data Catalog.
Các thành phần này phối hợp với nhau để đảm bảo rằng các kỹ sư dữ liệu và production data pipelines có các công cụ cần thiết để triển khai tích hợp Amazon Redshift cho Apache Spark, chạy truy vấn và tạo điều kiện thuận lợi cho việc dỡ dữ liệu từ Amazon Redshift sang EDL.
Tích hợp Amazon Redshift cho Apache Spark trong AWS Glue 4.0
Trong phần này, chúng tôi trình bày tiện ích của việc tích hợp Amazon Redshift cho Apache Spark bằng cách thêm bảng ứng dụng cho vay nằm trong S3 data lake với thông tin khách hàng từ Redshift data warehouse trong PySpark.
Bảng dimclient trong Amazon Redshift chứa các cột sau:
- ClientKey – INT8
- ClientAltKey – VARCHAR50
- PartyIdentifierNumber – VARCHAR20
- ClientCreateDate – DATE
- IsCancelled – INT2
- RowIsCurrent – INT2
Bảng loanapplication trong AWS Glue Data Catalog chứa các cột sau:
- RecordID – BIGINT
- LogDate – TIMESTAMP
- PartyIdentifierNumber – STRING
Bảng Redshift được đọc thông qua tích hợp Amazon Redshift cho Apache Spark và được lưu vào bộ nhớ đệm. Xem đoạn code sau:
import pyspark.sql.functions as F
from pyspark.sql import SQLContext
sc = # existing SparkContext
sql_context = SQLContext(sc)
secretsmanager_client = boto3.client('secretsmanager')
secret_manager_response = secretsmanager_client.get_secret_value(
SecretId='string',
VersionId='string',
VersionStage='string'
)
username = # get username from secret_manager_response
password = # get password from secret_manager_response
url = "jdbc:redshift://redshifthost:5439/database?user=" + username + "&password=" + password
read_config = {
"url": url,
"tempdir": "s3://<capitec-redshift-temp-bucket>/<uuid>/",
"unload_s3_format": "PARQUET"
}
d_client = (
spark.read.format("io.github.spark_redshift_community.spark.redshift")
.options(**read_config)
.option("query", f"select * from edw_core.dimclient")
.load()
.where((F.col("RowIsCurrent") == 1) & (F.col("isCancelled") == 0))
.select(
F.col("PartyIdentifierNumber"),
F.col("ClientCreateDate")
)
.cache()
)
Các bản ghi của Loan application được đọc từ S3 data lake và được bổ sung thêm bảng dimclient trên Amazon Redshift:
import pyspark.sql.functions as F
from awsglue.context import GlueContext
from pyspark import SparkContext
glue_ctx = GlueContext(SparkContext.getOrCreate())
push_down_predicate = (
f"meta_extract_start_utc_ms between "
f"'2023-07-12"
f" 18:00:00.000000' and "
f"'2023-07-13 06:00:00.000000'"
)
database_name="loan_application_system"
table_name="dbo_view_loan_applications"
catalog_id = # Glue Data Catalog
# Selecting only the following columns
initial_select_cols=[
"RecordID",
"LogDate",
"PartyIdentifierNumber"
]
d_controller = (glue_ctx.create_dynamic_frame.from_catalog(catalog_id=catalog_id,
database=database_name,
table_name=table_name,
push_down_predicate=push_down_predicate)
.toDF()
.select(*initial_select_cols)
.withColumn("LogDate", F.date_format("LogDate", "yyyy-MM-dd").cast("string"))
.dropDuplicates())
# Left Join on PartyIdentifierNumber and enriching the loan application record
d_controller_enriched = d_controller.join(d_client, on=["PartyIdentifierNumber"], how="left").cache()
Do đó, bản ghi của Loan application (từ S3 data lake) được bổ sung thêm cột ClientCreateDate (từ Amazon Redshift).
Cách tích hợp Amazon Redshift cho Apache Spark giải quyết vấn đề tìm nguồn dữ liệu
Việc tích hợp Amazon Redshift cho Apache Spark giải quyết hiệu quả vấn đề tìm nguồn dữ liệu thông qua các cơ chế sau:
- Đọc đúng lúc – Tích hợp Amazon Redshift cho Apache Spark connector đọc các bảng Redshift đúng lúc, đảm bảo tính nhất quán của dữ liệu và lược đồ. Điều này đặc biệt có giá trị đối với Type 2 slowly changing dimension (SCD) và timespan accumulating snapshot facts. Bằng cách kết hợp các bảng Redshift này với các bảng AWS Glue Data Catalog của hệ thống nguồn từ EDL trong production PySpark pipelines, trình kết nối cho phép tích hợp liền mạch dữ liệu từ nhiều nguồn trong khi vẫn duy trì tính toàn vẹn của dữ liệu.
- Truy vấn Redshift được tối ưu hóa – Tích hợp Amazon Redshift cho Apache Spark đóng một vai trò quan trọng trong việc chuyển đổi Spark query plan thành optimized Redshift query. Quá trình chuyển đổi này đơn giản hóa trải nghiệm phát triển cho team production bằng cách tuân thủ nguyên tắc vị trí dữ liệu. Các truy vấn được tối ưu hóa sử dụng các khả năng và tối ưu hóa hiệu suất của Amazon Redshift, đảm bảo truy xuất và xử lý dữ liệu hiệu quả từ Amazon Redshift cho quy trình PySpark. Điều này giúp hợp lý hóa quá trình phát triển đồng thời nâng cao hiệu suất tổng thể của các hoạt động tìm nguồn cung ứng dữ liệu.
Đạt được hiệu suất tốt nhất
Tích hợp Amazon Redshift cho Apache Spark tự động áp dụng tính năng dự đoán và truy vấn để tối ưu hóa hiệu suất. Bạn có thể đạt được những cải tiến về hiệu suất bằng cách sử dụng định dạng Parquet mặc định được dùng để dỡ tải với sự tích hợp này.
Để biết thêm chi tiết và mẫu mã, hãy tham khảo New – Amazon Redshift Integration with Apache Spark.
Lợi ích giải pháp
Việc áp dụng tích hợp đã mang lại một số lợi ích đáng kể cho nhóm:
- Nâng cao năng suất của nhà phát triển – Giao diện PySpark được cung cấp nhờ tích hợp đã tăng năng suất của nhà phát triển lên gấp 10 lần, cho phép tương tác mượt mà hơn với Amazon Redshift.
- Loại bỏ trùng lặp dữ liệu – Bảng Redshift trùng lặp được liệt kê trong AWS Glue data lake đã bị loại bỏ, làm cho môi trường dữ liệu hợp lý hơn.
- Giảm tải EDW – Việc tích hợp tạo điều kiện thuận lợi cho việc dỡ bỏ dữ liệu có chọn lọc, giảm thiểu tải cho EDW bằng cách chỉ trích xuất những dữ liệu cần thiết.
Bằng cách sử dụng tích hợp Amazon Redshift cho Apache Spark, Capitec đã mở đường cho việc cải thiện khả năng xử lý dữ liệu, tăng năng suất và tính năng hiệu quả hơn.
Kết luận
Trong bài viết này, chúng tôi đã thảo luận về cách nhóm Capitec triển khai thành công tích hợp Amazon Redshift cho Apache Spark để đơn giản hóa quy trình tính toán tính năng của họ. Họ nhấn mạnh tầm quan trọng của việc sử dụng modular PySpark data pipelines và decentralized để tạo ra các tính năng mô hình dự đoán.
Hiện tại, việc tích hợp Amazon Redshift cho Apache Spark được sử dụng bới 7 production data pipelines và 20 development pipelines, cho thấy tính hiệu quả của nó trong môi trường của Capitec.
Trong tương lai, nhóm shared services Feature Platform tại Capitec có kế hoạch mở rộng việc áp dụng tích hợp Amazon Redshift cho Apache Spark trong các lĩnh vực kinh doanh khác nhau, nhằm nâng cao hơn nữa khả năng xử lý dữ liệu và thúc đẩy các phương pháp tính năng hiệu quả.