Chuyển đến nội dung chính

DynamoDB sang Redshift: Ba phương pháp để di chuyển dữ liệu

Tìm hiểu ba phương pháp để di chuyển dữ liệu từ Amazon DynamoDB sang Redshift, với hướng dẫn từng bước, ưu nhược điểm của mỗi phương pháp và thực tiễn tốt nhất cho tính toàn vẹn dữ liệu cùng tối ưu hiệu năng.
· 15 phút đọc

Khám phá cùng AI

Amazon DynamoDB là một trong những cơ sở dữ liệu NoSQL đáng tin cậy và được sử dụng rộng rãi nhất trên thị trường. Di chuyển dữ liệu từ DynamoDB sang Amazon Redshift mang lại lợi ích đáng kể trong việc hiểu sâu hơn về dữ liệu được lưu trữ trong DynamoDB.

Trong hướng dẫn này, tôi trình bày ba phương pháp để di chuyển dữ liệu từ DynamoDB sang Redshift, kèm theo hướng dẫn từng bước cho mỗi cách tiếp cận. Tôi cũng sẽ đi sâu vào các thực tiễn tốt nhất để đảm bảo tính toàn vẹn dữ liệu và thảo luận các chiến lược tối ưu hóa hiệu năng.

DynamoDB là gì?

DynamoDB là cơ sở dữ liệu NoSQL không máy chủ, được AWS quản lý toàn phần, được thiết kế để mang lại hiệu năng cao và khả năng mở rộng liền mạch. Nó vượt trội trong việc xử lý khối lượng công việc giao dịch, hỗ trợ các bảng với dung lượng dữ liệu terabyte đồng thời xử lý hàng tỷ yêu cầu mỗi ngày. 

Nhờ khả năng vượt trội, DynamoDB đóng vai trò thiết yếu trong các lĩnh vực tài chính, thương mại điện tử, chăm sóc sức khỏe, truyền thông và trò chơi. Nó thường được dùng để xây dựng và duy trì bảng xếp hạng hồ sơ người dùng, lưu trữ và xử lý dữ liệu IoT, cùng các ứng dụng cần truy cập dữ liệu theo thời gian thực.

Nếu bạn quan tâm đến các loại cơ sở dữ liệu này, khóa học NoSQL Concepts sẽ dạy bạn về bốn công cụ NoSQL phổ biến—bao gồm Redis, MongoDB, Apache Cassandra và Neo4j.

Redshift là gì?

Redshift là kho dữ liệu đám mây do AWS quản lý toàn phần, được thiết kế để xử lý khối lượng lớn dữ liệu một cách hiệu quả và nhanh chóng. 

Tận dụng công nghệ Xử lý Song song Ở quy mô lớn (MPP), Redshift có thể phân phối và xử lý lượng dữ liệu lớn trên nhiều nút, cho phép thực thi nhanh các truy vấn SQL phức tạp.

Hơn nữa, việc truy vấn trên Redshift tiết kiệm chi phí hơn nhiều so với các kho dữ liệu truyền thống. Khả năng phân tích của Redshift rất quan trọng với nhiều trường hợp sử dụng, bao gồm phân tích dữ liệu lớn, bảng điều khiển thời gian thực và các ứng dụng học máy. 

Hãy xem khóa học Introduction to Redshift để hiểu sâu hơn về kho dữ liệu mạnh mẽ này. 

Hiểu trường hợp sử dụng: Vì sao chuyển dữ liệu từ DynamoDB sang Redshift?

Dù rõ ràng DynamoDB vượt trội trong việc xử lý khối lượng công việc giao dịch điển hình của các hệ thống Xử lý Giao dịch Trực tuyến (OLTP), nhưng nó không được tối ưu cho phân tích phức tạp. Ngược lại, Redshift được thiết kế đặc biệt cho các hệ thống Xử lý Phân tích Trực tuyến (OLAP) và phù hợp hơn nhiều để đảm nhiệm vai trò này. 

Do đó, bằng cách di chuyển dữ liệu từ DynamoDB sang Redshift, người dùng AWS có thể thực hiện các phân tích nâng cao dựa trên SQL để khai thác hiểu biết sâu hơn về dữ liệu của mình.

Điều kiện tiên quyết và thiết lập

Hướng dẫn này giả định người tham gia có các điều kiện sau:

  • Kinh nghiệm trước đây với AWS và các công cụ, kỹ thuật liên quan. 
  • Hiểu biết nền tảng về cơ sở dữ liệu quan hệ và NoSQL. 
  • Quen thuộc với SQL.
  • Biết ít nhất một ngôn ngữ lập trình sẽ hữu ích.

Các phương pháp di chuyển dữ liệu sẽ kết hợp một vài dịch vụ cốt lõi của AWS, bao gồm:

  • Identity and Access Management (IAM)
  • DynamoDB
  • Redshift
  • S3
  • Glue
  • Lambda

Khóa học AWS Cloud Technology and Services sẽ giúp bạn bắt đầu nếu bạn mới sử dụng AWS.

Phần lớn quy trình sẽ được thực hiện trong bảng điều khiển quản trị AWS. Tuy nhiên, các bước trong hướng dẫn cũng có thể chạy bằng giao diện dòng lệnh AWS (CLI) hoặc một bộ SDK của AWS. Bạn có thể thực hiện việc di chuyển dữ liệu trong môi trường làm việc mà bạn chọn.

Chuẩn bị DynamoDB cho việc di chuyển dữ liệu

Khi chuẩn bị di chuyển dữ liệu, cần xem xét các thành phần của bảng DynamoDB và cách chúng khác với cơ sở dữ liệu quan hệ:

  • Khối xây dựng của các bảng DynamoDB là items (tương tự các hàng trong cơ sở dữ liệu quan hệ). 
  • Mỗi item chứa một hoặc nhiều attributes, mỗi thuộc tính đại diện cho một phần tử dữ liệu. 
  • Tương tự bảng quan hệ, bảng DynamoDB có khóa chính, dùng để định danh duy nhất cho mỗi item. Khóa chính có thể gồm một khóa phân vùng đơn hoặc kết hợp khóa phân vùng và khóa sắp xếp.
  • Một đặc điểm quan trọng của bảng DynamoDB là không có lược đồ, nghĩa là mỗi item có thể có tập thuộc tính riêng.

Hướng dẫn sẽ sử dụng một bảng Products đơn giản để minh họa việc di chuyển dữ liệu. Dưới đây là dữ liệu ở định dạng JSON: 

	{
    	"product_id": "P001",
    	"category": "Electronics",
    	"price": 700,
    	"product_name": "Phone"
	},
	{
    	"product_id": "P002",
    	"category": "Electronics",
    	"description": "The laptop is a Macbook.",
    	"price": 1000,
    	"product_name": "Laptop"
	}

Có hai điểm quan trọng cần lưu ý:

  • product_id sẽ đóng vai trò khóa chính.
  • Các thuộc tính trong hai item không bằng nhau do item đầu tiên thiếu thuộc tính description.

Dữ liệu này được thêm vào một bảng trong DynamoDB như một phần của thiết lập.

DynamoDB table items

Các item trong bảng DynamoDB. Ảnh: tác giả

Thiết lập Amazon Redshift

Bước tiếp theo là thiết lập một bảng trong Redshift để nhận dữ liệu từ bảng DynamoDB. 

1. Truy cập bảng điều khiển Redshift và chọn “Create cluster.”

AWS cho phép người dùng xác định nhiều tham số trước khi khởi tạo cụm. Trong hướng dẫn này, trọng tâm sẽ đặt vào những tham số cần thiết để hỗ trợ việc di chuyển dữ liệu.

Creating a Redshift cluster in the Redshift Console

Tạo cụm Redshift trong bảng điều khiển Redshift. Ảnh: tác giả

2. Chọn loại nút và số lượng nút phù hợp với khối lượng dữ liệu sẽ được phân tích.

Đối với việc di chuyển bảng Products, bạn có thể dùng năng lực CPU tối thiểu và chỉ cần một nút.

Customizing the Redshift cluster configuration

Tùy chỉnh cấu hình cụm Redshift. Ảnh: tác giả

3. Chọn tên người dùng quản trị và mật khẩu cho cụm này.

Lưu trữ thông tin xác thực ở nơi an toàn vì bạn sẽ cần chúng để truy cập cụm này qua các dịch vụ AWS khác.

Customizing the Redshift cluster configuration

Tùy chỉnh cấu hình cụm Redshift. Ảnh: tác giả

4. Cuối cùng, gán một vai trò IAM cho cụm.

Vai trò IAM sẽ cần các chính sách cho phép cụm đọc các bảng DynamoDB và tạo bảng trong Redshift. 

Assigning an IAM role to the Redshift cluster

Gán vai trò IAM cho cụm Redshift. Ảnh: tác giả

5. Khi cụm đã được tạo, vào trình soạn thảo truy vấn và tạo bảng để chứa dữ liệu từ DynamoDB bằng lệnh CREATE:

CREATE TABLE Products (
	product_id VARCHAR(50) PRIMARY KEY,
	category VARCHAR(50),
	description VARCHAR(100),
	price INT,
	product_name VARCHAR(50),
	stock_quantity INT
);

Điều chỉnh câu lệnh trên dựa trên dữ liệu quan tâm và cân nhắc các ràng buộc bổ sung có thể cần áp dụng.

Vậy là xong! Bạn đã sẵn sàng bắt đầu chuyển dữ liệu.

Phương pháp 1: Chuyển dữ liệu từ DynamoDB sang Redshift bằng lệnh COPY

Amazon Redshift cung cấp lệnh COPY, dùng để nạp dữ liệu từ một nguồn dữ liệu AWS vào bảng.

1. Thực thi việc di chuyển dữ liệu bằng lệnh COPY. 

Cú pháp của lệnh như sau:

COPY <table_name>
FROM <dynamo_db_table_path>
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
REGION <region_name>';

Để thêm dữ liệu từ bảng Products trong DynamoDB sang bảng Products trong Redshift, có thể điều chỉnh lệnh thành như sau:

COPY Products
FROM 'dynamodb://Products'
IAM_ROLE  'arn:aws:iam::<1234567890>:role/<dynamo_db_redshift_role>'
REGION ‘us-east-1’

Ưu điểm của việc dùng lệnh COPY

Lệnh COPY là một trong những phương pháp đơn giản nhất để chuyển dữ liệu từ DynamoDB sang Redshift. Nó yêu cầu thiết lập tối thiểu, và tính dễ sử dụng khiến nó đặc biệt phù hợp với những người ít kinh nghiệm xây dựng đường ống ETL. 

Hơn nữa, vì dữ liệu được chuyển trực tiếp, không cần tích hợp thêm các dịch vụ AWS khác.

Nhược điểm của việc dùng lệnh COPY

Hạn chế chính của phương pháp này là người dùng không thể cấu hình cách các thuộc tính trong bảng DynamoDB được ánh xạ sang các trường trong bảng Redshift. Sự thiếu linh hoạt này có thể khiến lệnh COPY vô tình bỏ sót hoặc ánh xạ sai các trường trong bảng Redshift. 

Ngoài ra, vì lệnh chuyển toàn bộ dữ liệu trong một lô, thao tác này có thể kém hiệu quả nếu một số bản ghi đã được chuyển sang Redshift từ trước. Cách tiếp cận này sẽ tạo ra các lần truyền dữ liệu dư thừa trong những tình huống như vậy, làm tăng thời gian xử lý và chi phí lưu trữ.

Phương pháp 2: Chuyển dữ liệu từ DynamoDB sang Redshift bằng AWS Glue

AWS Glue là dịch vụ được thiết kế để tạo các đường ống trích xuất, biến đổi và nạp (ETL). Người dùng có thể chuyển dữ liệu từ DynamoDB sang Redshift bằng cách tạo một tác vụ ETL.

Nếu bạn mới dùng Glue, hãy cân nhắc làm theo hướng dẫn Getting Started with AWS Glue.

Trong hướng dẫn này, chúng ta sẽ đọc bảng Products trong DynamoDB, lưu kết quả vào một bucket S3 dưới dạng tệp CSV, rồi gửi dữ liệu đó tới bảng Products trong Redshift. 

1. Vào bảng điều khiển S3 và tạo một bucket để chứa tệp CSV.

AWS S3 console

Bảng điều khiển AWS S3. Ảnh: tác giả

2. Điều hướng tới bảng điều khiển AWS Glue, và từ bảng bên trái, chọn “ETL jobs” để bắt đầu tạo tác vụ. 

AWS Glue console

Bảng điều khiển AWS Glue. Ảnh: tác giả

3. Chọn chế độ để tạo tác vụ ETL.

AWS cung cấp ba chế độ tạo tác vụ: Visual ETL, Notebook và Script editor. Mỗi chế độ đáp ứng các mức độ thành thạo khác nhau, cho phép người dùng chọn phương pháp ưa thích—dù là giao diện kéo thả (Visual ETL), môi trường phát triển tương tác (Notebook), hay viết mã thuần (Script Editor).

Các tác vụ Glue có thể được viết thủ công bằng Python hoặc Spark. Với những ai chưa thành thạo các ngôn ngữ này, Visual ETL là lựa chọn phù hợp vì cho phép cấu hình tác vụ chỉ bằng thao tác nhấp chuột.

Tác vụ Glue trong hướng dẫn này sẽ được viết trong trình soạn thảo mã bằng Python, nhưng với những ai quan tâm đến tùy chọn Visual ETL, hãy xem tài liệu AWS.

4. Gán một vai trò IAM cho tác vụ này. 

Vai trò IAM sẽ cần quyền truy cập DynamoDB, Redshift và S3 để hướng dẫn này chạy thành công. 

Assigning an IAM role to the Glue job

Gán vai trò IAM cho tác vụ Glue. Ảnh: tác giả

5. Sau khi tạo tác vụ, chuyển sang thẻ “Job details” và điền các thuộc tính cơ bản.

Filling Glue job details

Điền chi tiết tác vụ Glue. Ảnh: tác giả

Trong phần này, người dùng có thể xác định số đơn vị xử lý dữ liệu (DPU), số lần thử lại và thời gian chờ cho tác vụ. Tác vụ trong hướng dẫn này sẽ giữ nguyên giá trị mặc định, nhưng khuyến nghị người dùng điều chỉnh các tham số để phù hợp với nhu cầu của tác vụ cụ thể. 

6. Chuyển sang thẻ “Script” và viết logic của bạn. 

Tác vụ ETL di chuyển dữ liệu trong bảng Products sẽ thực thi đoạn mã sau:

import boto3
import csv
import time
import os
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.context import SparkContext
from awsglue.utils import getResolvedOptions
import sys
# initialize Glue context
args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
job = Job(glueContext)
job.init(args["JOB_NAME"], args)
# initialize DynamoDB client and scan the table
dynamodb = boto3.client('dynamodb', region_name=os.getenv('AWS_REGION'))
response = dynamodb.scan(TableName=os.getenv('DYNAMODB_TABLE'))
# extract and write data to a CSV file
items = response['Items']
csv_file = '/tmp/products.csv'
# write each row in the table
with open(csv_file, mode='w', newline='') as file:
	writer = csv.writer(file)
	writer.writerow(['product_id', 'category', 'description', 'product_name', 'stock_quantity', 'price'])
	for item in items:
    	writer.writerow([
        	item.get('product_id', {}).get('S', ''),
        	item.get('category', {}).get('S', ''),
        	item.get('description', {}).get('S', ''),
        	item.get('product_name', {}).get('S', ''),
        	item.get('stock_quantity', {}).get('N', 0),
        	item.get('price', {}).get('N', 0)
    	])
# upload the csv file to S3
s3 = boto3.client('s3', region_name=os.getenv('AWS_REGION'))
bucket_name = os.getenv('S3_BUCKET_NAME')
s3_key = 'products/products.csv'
s3.upload_file(csv_file, bucket_name, s3_key)
# wait for the file to upload before continuing
time.sleep(10)
# load data into Redshift using the COPY command
redshift = boto3.client('redshift', region_name=os.getenv('AWS_REGION'))
copy_command = f"""
	COPY Products FROM 's3://{bucket_name}/{s3_key}'
	IAM_ROLE 'arn:aws:iam::{os.getenv('AWS_ACCOUNT_ID')}:role/{os.getenv('REDSHIFT_ROLE')}'
	FORMAT AS CSV
	IGNOREHEADER 1;
"""
cluster_id = os.getenv('REDSHIFT_CLUSTER_ID')
database = os.getenv('REDSHIFT_DATABASE')
db_user = os.getenv('REDSHIFT_DB_USER')
# execute the copy statement
response = redshift.execute_statement(
	ClusterIdentifier=cluster_id,
	Database=database,
	DbUser=db_user,
	Sql=copy_command
)
# Commit the job
job.commit()

Hãy cùng phân tích kịch bản này thực hiện những gì theo từng bước:

  1. Sử dụng thư viện awsglue để thiết lập tác vụ cho việc thực thi
  2. Truy cập bảng DynamoDB với boto3, SDK Python cho AWS
  3. Ghi các item của bảng vào bộ nhớ và xuất thành tệp CSV lên bucket S3 đã tạo
  4. Truy cập cụm Redshift bằng boto3
  5. Viết và thực thi lệnh COPY để chèn dữ liệu trong tệp CSV vào bảng Redshift

Lưu ý: Đoạn mã mẫu phác thảo một cách để hỗ trợ di chuyển dữ liệu. AWS Glue đề cao tính linh hoạt, cung cấp nhiều cách để xây dựng đường ống ETL. Do đó, người dùng có thể tạo tác vụ phù hợp riêng với nhu cầu của mình. 

7. Khi đã viết xong mã, lưu thay đổi và nhấp nút “Run” để thực thi tác vụ.

Script editor for the Glue job

Trình soạn thảo script cho tác vụ Glue. Ảnh: tác giả

8. Theo dõi tiến độ tác vụ trong thẻ “Runs”, nơi sẽ hiển thị mọi lỗi hoặc sự cố. 

Xác minh trạng thái tác vụ và xem nhật ký để đảm bảo mọi thứ chạy như mong đợi.

AWS Glue Runs tab showing a completed job

Thẻ Runs của AWS Glue hiển thị tác vụ đã hoàn tất. Ảnh: tác giả

Khi tác vụ chạy thành công, bạn có thể chạy theo yêu cầu hoặc lập lịch theo nhu cầu, giúp quy trình di chuyển dữ liệu hiệu quả và tự động hơn.

Ưu điểm của việc dùng Glue

AWS Glue cung cấp nhiều tùy chọn tùy biến, cho phép người dùng điều chỉnh tác vụ theo nhu cầu. Nó cũng cho phép lập lịch các tác vụ theo chu kỳ (ví dụ: hàng ngày), giúp tự động hóa. Hơn nữa, Glue tích hợp với nhiều dịch vụ khác, tạo điều kiện tương tác với các nguồn dữ liệu ngoài DynamoDB khi cần. 

Nhược điểm của việc dùng Glue

Cấu hình một tác vụ ETL trong Glue thường đòi hỏi công sức và thời gian thiết lập. Dù kiến thức lập trình không bắt buộc để dùng dịch vụ này, nhưng sẽ cần thiết nếu muốn tận dụng một số tính năng Glue cung cấp, như thư viện AWSGlue và một SDK. 

Ngoài ra, các tác vụ Glue khó có thể chạy thành công ngay lần đầu, vì vậy người dùng nên sẵn sàng dành thời gian khắc phục sự cố. Cuối cùng, tác vụ Glue có thể nhanh chóng phát sinh chi phí nếu không được quản lý đúng cách, nên việc chỉ cung cấp tài nguyên cần thiết là rất quan trọng. 

Phương pháp 3: Chuyển dữ liệu từ DynamoDB sang Redshift bằng DynamoDB Streams

DynamoDB Streams là tính năng theo dõi các thay đổi thực hiện trên các bảng DynamoDB theo thời gian thực. Bằng cách tận dụng DynamoDB Streams, người dùng có thể tự động cập nhật bảng Redshift bất cứ khi nào có thay đổi trong nguồn dữ liệu DynamoDB. 

Đọc tài liệu AWS để biết thêm thông tin về cách sử dụng DynamoDB Streams.

Giải pháp này sẽ cần quyền truy cập AWS DynamoDB, Redshift và Lambda. Theo cách tiếp cận này, một hàm Lambda sẽ được kích hoạt khi một item được thêm hoặc sửa trong bảng Products của DynamoDB. 

Các bước thực hiện: 

1. Vào bảng điều khiển Lambda và chọn “Create Function.”

AWS Lamba console

Bảng điều khiển AWS Lamba. Ảnh: tác giả

2. Cung cấp thông tin cơ bản cho hàm, bao gồm ngôn ngữ lập trình và vai trò IAM.

Vai trò phải có quyền truy cập Lambda, DynamoDB và Redshift.

Configuring the Lambda function

Cấu hình hàm Lambda. Ảnh: tác giả

3. Sau khi tạo hàm, thêm bảng DynamoDB (trong trường hợp này là bảng Products) làm trigger.

Lược đồ lúc này sẽ trông như sau:

Adding a trigger to the Lambda function

Thêm trigger cho hàm Lambda. Ảnh: tác giả

4. Chuyển sang thẻ cấu hình và cấp phát lượng bộ nhớ, thời gian chạy cần thiết cho hàm vì các giá trị mặc định thường không đủ.

Configuring the trigger for the Lambda function

Cấu hình trigger cho hàm Lambda. Ảnh: tác giả

5. Trong thẻ “Code”, viết logic di chuyển dữ liệu bằng ngôn ngữ bạn chọn.

Đoạn mã dưới đây là ví dụ về một hàm Lambda bằng Python có thể trông như thế nào:

import boto3
import os
import json
def lambda_handler(event, context):
	# Initialize the Redshift Data API client
	redshift_client = boto3.client('redshift-data')
	# Redshift cluster details 
	cluster_id = os.environ['REDSHIFT_CLUSTER_ID']
	database = os.environ['REDSHIFT_DB_NAME']
	user = os.environ['REDSHIFT_USER']
	# IAM role ARN that has access to Redshift Data API
	role_arn = os.environ['REDSHIFT_ROLE_ARN']
    
	# Process DynamoDB stream records
	for record in event['Records']:
    	if record['eventName'] in ['INSERT', 'MODIFY']:
        	new_image = record['dynamodb']['NewImage']
        	product_id = new_image['product_id']['S']
        	category = new_image['category']['S']
        	description = new_image['description']['S']
        	price = float(new_image['price']['N'])
        	product_name = new_image['product_name']['S']
        	stock_quantity = int(new_image['stock_quantity']['N'])
       	 
        	# SQL query to insert data into Redshift
        	query = f"""
            	INSERT INTO products (product_id, category, description, price, product_name,   stock_quantity)
            	VALUES ('{product_id}', '{category}', '{description}', {price}, '{product_name}', {stock_quantity});
        	"""
       	 
        	# Execute the query using Redshift Data API
        	response = redshift_client.execute_statement(
            	ClusterIdentifier=cluster_id,
            	Database=database,
            	DbUser=user,
            	Sql=query
        	)
       	 
        	# Log the statement ID for tracking
        	print(f'Started SQL statement with ID: {response["Id"]}')
    
	return {
    	'statusCode': 200,
    	'body': 'SQL statements executed successfully'
	}

Nói đơn giản, hàm sẽ đọc nhật ký các item được thêm hoặc sửa do DynamoDB Streams ghi lại và áp dụng chúng vào bảng Redshift bằng cách thực thi truy vấn SQL với một client API Redshift. 

Vì lý do bảo mật, các giá trị khóa (ví dụ: id cụm Redshift) được lưu trong biến môi trường thay vì mã hóa cứng trong script.

Tìm hiểu thêm về việc sử dụng biến môi trường trong Lambda trong tài liệu AWS.

6. Sau khi hoàn tất mã, triển khai hàm và kiểm thử để phát hiện lỗi. 

Tùy trường hợp sử dụng, việc thiết kế các ca kiểm thử riêng cho hàm sẽ rất đáng giá. 

Lambda function executing results

Kết quả thực thi hàm Lambda. Ảnh: tác giả

Khi hàm Lambda đã hoạt động, chúng ta cần cấu hình bảng DynamoDB để chạy hàm này bất cứ khi nào một item trong bảng được thêm hoặc sửa.

7. Chọn bảng DynamoDB và chuyển sang thẻ “Exports and streams”.

DynamoDB console Exports and streams tab. Image by author

Thẻ Exports and streams trong bảng điều khiển DynamoDB. Ảnh: tác giả

8. Cuộn xuống phần chi tiết DynamoDB stream và chọn “Turn on.”

DynamoDB console Exports and streams tab

Thẻ Exports and streams của bảng điều khiển DynamoDB. Ảnh: tác giả

9. Khi được nhắc, hãy chọn loại thông tin sẽ được ghi lại trong DynamoDB Streams.

DynamoDB stream details screen

Màn hình chi tiết DynamoDB stream. Ảnh: tác giả

10. Sau khi bật stream, cuộn xuống cùng trang để tạo trigger.

Creating a trigger to invoke a Lambda function in DynamoDB

Tạo trigger để gọi hàm Lambda trong DynamoDB. Ảnh: tác giả

11. Cuối cùng, khi cấu hình trigger, chọn hàm Lambda đã tạo trước đó rồi chọn “Create trigger.”

Selecting a Lambda function to trigger

Chọn một hàm Lambda để kích hoạt. Ảnh: tác giả

Triển khai giải pháp này sẽ tự động áp dụng mọi thay đổi thực hiện trên bảng DynamoDB sang bảng trong Redshift, đảm bảo tính nhất quán dữ liệu theo thời gian thực. 

Ưu điểm của việc dùng DynamoDB Streams

DynamoDB Streams tạo đồng bộ thời gian thực giữa DynamoDB và Redshift. Điều này cho phép người dùng giữ các bảng Redshift luôn cập nhật mà không cần can thiệp thủ công. 

Nhờ đó, các bảng Redshift có thể được cập nhật thường xuyên, qua đó hỗ trợ các ứng dụng cần thông lượng dữ liệu cao (ví dụ: bảng điều khiển thời gian thực). Giải pháp này cũng giảm rủi ro lỗi do con người ở mỗi lần lặp. 

Nhược điểm của việc dùng DynamoDB Streams

Thiết lập giải pháp này đòi hỏi cấu hình một số dịch vụ AWS, điều này có thể tốn thời gian. 

Vì Lambda là công cụ Function as a Service (FaaS), người dùng sẽ cần nắm vững một ngôn ngữ lập trình. Hơn nữa, vì mỗi lần đồng bộ dữ liệu cần một số lời gọi API, chi phí tổng thể có thể tăng nhanh, đặc biệt với các cập nhật thường xuyên. Cuối cùng, giải pháp này phù hợp hơn với các thay đổi nhỏ trên bảng Redshift hơn là các lần di chuyển toàn bộ bảng. 

Xác minh việc di chuyển dữ liệu

Xác thực dữ liệu là bước thiết yếu sau khi xây dựng giải pháp di chuyển dữ liệu. Ngay cả khi các dịch vụ AWS chạy trơn tru, vẫn có thể có lỗi trong quá trình di chuyển chưa được tính đến. Những vấn đề này có thể bắt nguồn từ sai lệch logic, ánh xạ thuộc tính không chính xác hoặc chuyển dữ liệu không đầy đủ. 

Dữ liệu đã di chuyển phải không mắc các lỗi này để mọi phân tích tiếp theo trên Redshift có thể thành công.

Phần này khám phá một số bước kiểm tra và kỹ thuật để xem xét dữ liệu đã di chuyển, sử dụng bảng Products làm ví dụ. 

Xác thực cấu trúc cột và kiểu dữ liệu

Đảm bảo tất cả các cột trong bảng DynamoDB đều có mặt trong bảng Redshift và đã được gán đúng kiểu dữ liệu. 

SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = Products;

Xác minh số lượng hàng

Xác nhận việc truyền dữ liệu đã hoàn tất bằng cách so sánh số lượng hàng trong bảng Redshift với nguồn dữ liệu. 

SELECT COUNT(*) FROM your_table_name;

Xem trước dữ liệu

Một cách thay thế để xác định các cột và kiểu dữ liệu là đơn giản xem trước dữ liệu. Người dùng có thể lướt qua phần xem trước để phát hiện các sai khác hoặc bất thường. 

SELECT product_id, category, price FROM your_table_name LIMIT 5;

Xác thực logic nghiệp vụ phức tạp

Việc xác thực dữ liệu bằng cách tạo bản xem trước hoặc đếm không đủ cho mọi bộ dữ liệu. Khi cần đánh giá dữ liệu dựa trên tiêu chí phức tạp hơn, người dùng có thể tạo view.  

Ví dụ, giả sử bảng Products không bao giờ được phép thiếu hàng đối với mặt hàng điện tử. Kết quả này có thể được giám sát bằng truy vấn sau.

CREATE OR REPLACE VIEW low_stock_electronics AS
SELECT
	Product_id, product_name, category, stock_quantity, price,
FROM
	your_table_name
WHERE
	stock_quantity < 50 AND
	Category = ‘Electronics;

Tối ưu hóa hiệu năng trong Redshift

Tối ưu hóa hiệu năng truy vấn là điều thiết yếu để trích xuất thông tin chi tiết một cách hiệu quả và với chi phí thấp. Việc viết các truy vấn tiết kiệm bộ nhớ và giảm thời gian chạy sẽ đặc biệt quan trọng khi tập dữ liệu tăng dần theo mỗi lần di chuyển. 

Phần này khám phá một số phương pháp cải thiện tối ưu hóa truy vấn, sử dụng bảng Products làm tham chiếu. 

Chọn khóa phân phối

Trong Redshift, khóa phân phối quyết định cách dữ liệu được phân tán trên các nút trong cụm. Chọn đúng khóa phân phối cho bảng có thể giảm thời gian chạy truy vấn. 

Ví dụ, nếu bảng Products sẽ được join với bảng khác theo trường product_id, sẽ có lợi khi dùng product_id làm khóa phân phối khi tạo bảng. 

CREATE TABLE products (
	product_id VARCHAR(100),
	category VARCHAR(100),
	description VARCHAR(100),
	price INT,
	stock_quantity INT
)
DISTKEY(product_id);

Chọn khóa sắp xếp

Chọn đúng khóa sắp xếp giúp tăng cường các thao tác SQL phổ biến như lọc và join. Trong Redshift, người dùng có thể chọn khóa sắp xếp thủ công hoặc để hệ thống chọn. Khóa sắp xếp có hai loại: khóa sắp xếp hợp (compound) và khóa sắp xếp đan xen (interleaved). Khóa sắp xếp tốt nhất phụ thuộc vào các truy vấn cần chạy trên dữ liệu. 

CREATE TABLE products (
	product_id VARCHAR(100),
	category VARCHAR(100),
	description VARCHAR(100),
	price INT,
	stock_quantity INT
)
COMPOUND SORTKEY(category, product_id);

Để biết thêm thông tin về khóa sắp xếp, hãy truy cập tài liệu AWS. 

Sử dụng nén

Nén dữ liệu là việc mã hóa dữ liệu với ít bit hơn. Điều này giúp bảng sử dụng ít dung lượng lưu trữ hơn nhưng vẫn giữ nguyên toàn bộ thông tin. 

Nếu chưa chắc loại nén nào phù hợp nhất cho dữ liệu của mình, Redshift có thể thực hiện phân tích nén để tìm mã hóa tốt nhất cho từng trường với lệnh sau:

ANALYZE COMPRESSION <table_name>;

Kết luận và bước tiếp theo

Di chuyển dữ liệu từ DynamoDB sang Redshift cho phép người dùng tận dụng khả năng OLAP của Redshift để thực hiện các phân tích dữ liệu phức tạp hơn. 

Hướng dẫn này đã khám phá ba phương pháp di chuyển khác nhau, mỗi phương pháp có ưu và nhược điểm riêng. Khi chọn cách tiếp cận tốt nhất, hãy đánh giá cẩn thận nhu cầu phân tích, giới hạn dữ liệu và cân nhắc ngân sách để đảm bảo giải pháp hiệu quả nhất cho trường hợp sử dụng cụ thể của bạn.

Một bước tiếp theo tuyệt vời là bắt đầu khóa học Introduction to Redshift, để học hoặc ôn lại các khái niệm cơ bản. Khóa học AWS Security and Cost Management là một lựa chọn tuyệt vời khác để học các khái niệm mà bất kỳ ai làm việc với AWS cũng nên nắm vững.

FAQs

Tôi có thể tự động hóa quy trình di chuyển bằng các phương pháp đã mô tả không?

Có, cả AWS Glue và DynamoDB Streams đều cho phép tự động hóa. Các tác vụ Glue có thể được lập lịch chạy theo khoảng thời gian cụ thể, trong khi DynamoDB Streams có thể được thiết lập để kích hoạt đồng bộ dữ liệu theo thời gian thực bằng Lambda.

Phương pháp nào hiệu quả nhất cho các tập dữ liệu lớn?

Phương pháp AWS Glue thường là lựa chọn tốt nhất để xử lý các tập dữ liệu lớn. Nó cung cấp khả năng tùy biến và khả năng mở rộng cao, phù hợp cho các tác vụ ETL phức tạp, dù có thể cần nhiều thời gian thiết lập hơn.

Những cân nhắc về chi phí khi sử dụng các phương pháp này là gì?

Lệnh COPY là phương án tiết kiệm chi phí nhất cho các lần di chuyển đơn giản, thực hiện một lần. Tuy nhiên, Glue và DynamoDB Streams có thể phát sinh chi phí cao hơn do sử dụng tài nguyên liên tục, vì vậy điều quan trọng là theo dõi và tối ưu mức tiêu thụ dịch vụ AWS của bạn.

Tôi có thể chọn lọc để truyền dữ liệu cụ thể thay vì di chuyển toàn bộ bảng không?

Có, AWS Glue và DynamoDB Streams cung cấp sự linh hoạt để lọc và truyền các item hoặc thuộc tính cụ thể. Trong khi đó, lệnh COPY sẽ truyền toàn bộ tập dữ liệu mà không có khả năng lọc.

Tôi có thể xử lý thay đổi lược đồ trong DynamoDB khi di chuyển sang Redshift không?

Có, Redshift yêu cầu lược đồ được xác định, trong khi DynamoDB không có lược đồ. Bạn phải tự xử lý mọi thay đổi lược đồ bằng cách cập nhật cấu trúc bảng Redshift để chứa các thuộc tính hoặc trường mới trước khi di chuyển. AWS Glue cung cấp sự linh hoạt lớn nhất để xử lý khác biệt lược đồ.

Aashish Nair

Tác giả

Aashish Nair

Là một nhà khoa học dữ liệu đầy triển vọng, tôi nổi trội trong việc chuyển đổi dữ liệu thô thành các chiến lược có thể hành động. Tôi chuyên sử dụng Python, SQL và các kỹ thuật học máy để tạo ra những giải pháp có tác động trong phân tích dữ liệu, đồng thời xây dựng các đường ống ETL vững chắc để thu nạp và xử lý khối lượng dữ liệu lớn.

Chủ đề

Liên quan