Chuyển đến nội dung chính
Kỹ thuật Dữ liệu

Dagster vs Airflow: So sánh các công cụ điều phối dữ liệu hàng đầu cho hệ thống dữ liệu hiện đại

Khám phá những điểm giống và khác nhau cốt lõi giữa hai công cụ điều phối dữ liệu phổ biến nhất: Airflow và Dagster.
Jake Roach's photo
Jake Roach
Đã cập nhật · 9 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp Tục Với Google
Bằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách bảo mật và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.

Có vẻ như mỗi lần bạn lướt LinkedIn, lại xuất hiện một công cụ mới trong bức tranh dữ liệu vốn đã chật chội. Khi các nhóm dữ liệu tiếp tục bổ sung vào các thành phần của “ngăn xếp dữ liệu”, họ cần một cách để quản lý và kết nối những công cụ rời rạc này.

Điều phối dữ liệu (Data orchestration) là quá trình xây dựng, thực thi và giám sát các quy trình kết hợp, chuyển đổi và tổ chức dữ liệu trên toàn bộ hệ sinh thái dữ liệu. Để làm được điều này, các kỹ sư dữ liệu sử dụng các công cụ điều phối dữ liệu. Ở đây, chúng ta sẽ khám phá hai công cụ điều phối phổ biến nhất: Apache Airflow và Dagster. Bắt đầu nhé!

Airflow là gì?

Airflow là tiêu chuẩn ngành để xây dựng, chạy và giám sát các pipeline dữ liệu dưới dạng mã. Công cụ này ban đầu được phát triển năm 2014 bởi nhóm Kỹ thuật Dữ liệu tại Airbnb. Kể từ đó, dự án được Quỹ Phần mềm Apache tiếp nhận và trở thành sản phẩm phổ biến nhất theo giấy phép của họ. 

Mỗi tháng, Airflow được tải xuống hơn ba mươi triệu lần và có một cộng đồng người đóng góp và người dùng sôi động. Trong Airflow, các pipeline dữ liệu được gọi là DAG (đồ thị có hướng không chu trình). 

Bạn có thể tìm hiểu thêm về Airflow trong hướng dẫn của chúng tôi về bắt đầu với Apache Airflow. 

Dagster là gì?

Tương tự Airflow, Dagster là một công cụ điều phối cho phép người dùng xây dựng pipeline dữ liệu bằng mã. Đây là mã nguồn mở và được ra mắt lần đầu năm 2019. Dagster dùng Python để định nghĩa “tài sản” (assets), là các khối xây dựng của một pipeline dữ liệu. 

Dagster đã nổi lên như một đối thủ của Airflow trong một không gian tương đối ít cạnh tranh. Dự án được duy trì bởi cộng đồng mã nguồn mở và được hậu thuẫn thương mại bởi Dagster Labs.

Kết nối một ngăn xếp dữ liệu hiện đại

Vậy Airflow và Dagster nằm ở đâu trong một ngăn xếp dữ liệu hiện đại? Chúng ta sẽ bắt đầu với sơ đồ kiến trúc dưới đây.

Sơ đồ kiến trúc hiển thị một số công cụ trong ngăn xếp dữ liệu hiện đại, và cách Airflow cùng Dagster được dùng để điều phối luồng dữ liệu giữa các công cụ này.

Sơ đồ kiến trúc chứa một mẫu các công cụ thường dùng trong ngăn xếp dữ liệu hiện đại.

Sơ đồ này mô tả những gì nhiều người xem là một ngăn xếp dữ liệu tiêu chuẩn. Nó gồm các hệ thống nguồn, kho dữ liệu và công cụ chuyển đổi, cùng các “điểm đến” hạ nguồn như Tableau và Looker. 

Ở đây, Airflow và Dagster chính là những mũi tên kết nối hệ sinh thái dữ liệu này. Không có công cụ điều phối, rất khó để chuyển dữ liệu từ công cụ này sang công cụ khác. 

Các công cụ điều phối như Airflow và Dagster còn cung cấp một lớp khả kiến giúp dễ dàng hiểu dữ liệu được đưa qua pipeline từ nguồn đến đích ở đâu, như thế nào, khi nào, và cách dữ liệu được xử lý trên đường đi.

Dagster vs Airflow: Tính năng và chức năng chính

Như bạn có thể đã đoán, Airflow và Dagster có nhiều điểm tương đồng về mục đích sử dụng và vai trò trong ngăn xếp dữ liệu hiện đại. Bao gồm:

  • Khả năng xây dựng pipeline dưới dạng mã
  • Tích hợp sẵn với ngăn xếp dữ liệu hiện đại
  • Trải nghiệm phát triển cục bộ

Tuy nhiên, mỗi công cụ đều có bộ tính năng và chức năng riêng giúp nó đứng vững độc lập.

Airflow

Hãy bắt đầu với một số tính năng chính của Airflow: 

Hiểu về Airflow và DAG

Trong Airflow, các pipeline dữ liệu gọi là DAG—viết tắt của đồ thị có hướng không chu trình. Hãy hình dung DAG như một tập hợp các tác vụ được kết nối theo một thứ tự cụ thể. Khối xây dựng cơ bản nhất của DAG là tác vụ (task). Ví dụ, trong một pipeline thực hiện trích xuất, chuyển đổi và nạp (ETL), bước “transform” sẽ là một tác vụ riêng.

Các tác vụ này thường được định nghĩa bằng các operator của Airflow. Nhưng như bạn sẽ thấy ngay, còn có một cách khác để định nghĩa tác vụ bằng TaskFlow API.

Lập lịch DAG trong Airflow

Lập lịch cho một pipeline trong Airflow cực kỳ linh hoạt. Cần chạy pipeline hàng ngày? Không vấn đề. Muốn chạy vào Thứ Sáu đầu tiên mỗi tháng? Cũng đơn giản. Vậy nếu quản lý của bạn yêu cầu kích hoạt DAG khi một tập dữ liệu được cập nhật thì sao? Airflow cũng xử lý được.

Airflow cung cấp rất nhiều tùy chọn tùy biến khi lập lịch cho DAG của bạn. Với các tính năng như CRON, Timetables và lập lịch dựa trên dữ liệu, bạn có thể đặt DAG chạy bất cứ khi nào cần.

TaskFlow API

Để việc viết DAG trở nên dễ tiếp cận hơn với các chuyên gia dữ liệu, cộng đồng Airflow đã giới thiệu TaskFlow API. Thay vì cách tiếp cận truyền thống dùng operator, TaskFlow API cho phép bạn định nghĩa tác vụ chỉ bằng cách “decorate” các hàm. Điều này giúp việc chia sẻ dữ liệu giữa các tác vụ và thiết lập quan hệ phụ thuộc trở nên dễ dàng và trực quan hơn.

Hơn nữa, các công cụ như Astro SDK được xây dựng trên TaskFlow API, tiếp tục mở rộng khả năng của nó.

Dagster

Hãy xem Dagster so sánh thế nào: 

Cách tiếp cận dựa trên tài sản của Dagster

Dagster áp dụng một cách tiếp cận dựa trên tài sản độc đáo để xây dựng pipeline dữ liệu. Trong Dagster, bất kỳ đối tượng dữ liệu nào được lưu trữ bền vững—như tệp hoặc bảng—đều được gọi là một tài sản (asset). 

Các tài sản này được định nghĩa trong mã bằng các hàm Python. Khi các hàm này được thực thi, Dagster tự động tạo phụ thuộc và “vật chất hóa” tài sản. Phương pháp trọng tâm vào tài sản giúp dễ dàng theo dõi cách dữ liệu được tạo ra và tiêu thụ trong một pipeline.

Tìm hiểu về Ops trong Dagster

Một khái niệm quan trọng khác trong Dagster là “ops”, phần nào tương tự như task trong Airflow. Op đại diện cho các bước riêng lẻ trong một pipeline dữ liệu, và mỗi op có đầu vào và đầu ra có thể bao gồm các tài sản. Hơn nữa, các đầu vào và đầu ra này có thể được “typing” để định nghĩa rõ ràng dữ liệu đang được xử lý.

Vậy mối quan hệ giữa ops và assets là gì? Ops về bản chất là các bước (như extract, transform, load) vận hành trên các tài sản, vốn là chính các đối tượng dữ liệu.

Hệ thống kiểu của Dagster

Để mang lại sự rõ ràng cho dòng dữ liệu trong một pipeline, Dagster sử dụng hệ thống kiểu mạnh mẽ để kiểm định đầu vào và đầu ra của mỗi op. Trong khi Airflow hỗ trợ định nghĩa kiểu Python, Dagster biến “typing” thành phần cốt lõi của trải nghiệm xây dựng pipeline. 

Không chỉ có thể gán kiểu cho ops, mà các định nghĩa tài sản cũng có thể được gán kiểu, giúp đảm bảo dữ liệu mà một tài sản tạo ra là chính xác và được kiểm định.

Airflow vs Dagster: Trải nghiệm nhà phát triển

Khi chọn một công cụ điều phối, những yếu tố như mật độ tính năng, tổng chi phí sở hữu và khả năng mở rộng có thể nằm trong danh sách tiêu chí chấp nhận. Dù vậy, điều quan trọng là cần ghi nhớ trải nghiệm nhà phát triển. Một trải nghiệm trực quan, hiệu quả và vững chắc giúp tăng tốc độ lặp, chủ động xử lý các thách thức như chạy unit test và quản lý phụ thuộc.

Airflow

Cộng đồng Airflow

Có câu hỏi hay lỗi Airflow mà bạn chưa tìm ra? Nhiều khả năng là đã có lời giải. Airflow sở hữu một trong những cộng đồng Slack lớn nhất trong các dự án Apache và có hơn ba nghìn người đóng góp. Hàng nghìn bài blog, hướng dẫn và khóa học đã được xây dựng xoay quanh dự án Airflow. Bên cạnh hỗ trợ người dùng Airflow, cộng đồng cũng chịu trách nhiệm xây dựng và duy trì chính dự án này.

Astronomer, nhà phát triển thương mại đứng sau dự án Apache Airflow, đã đưa trải nghiệm nhà phát triển Airflow lên tầm cao mới. CLI astro cung cấp thêm một lớp trừu tượng và chức năng cho các tiện ích Airflow. Astronomer cũng cung cấp kho registry và chatbot “Ask Astro” để giải quyết mọi câu hỏi về Airflow mà nhà phát triển có thể gặp.

Phát triển và kiểm thử cục bộ

Một tính năng khiến Airflow trở nên hấp dẫn cho điều phối là khả năng phát triển và kiểm thử cục bộ. Với CLI airflow, nhà phát triển có thể khởi chạy một phiên bản Airflow chỉ trong vài giây. Sau đó có thể chỉnh sửa mã cục bộ trước khi kiểm thử qua UI hoặc CLI. Điều này cho phép lặp nhanh và rút ngắn vòng đời phát hành, đặc biệt với các đội dùng Airflow nhiều.

Công cụ mới để phát triển DAG

Trong một thời gian, cách duy nhất để định nghĩa DAG của Airflow là qua các operator truyền thống. TaskFlow API đã nhanh chóng thay đổi điều đó và cung cấp một lựa chọn thay thế để tạo DAG. Giờ đây, các công cụ như dag-factory và gusty giúp bạn bắt đầu viết và thực thi DAG dễ dàng hơn bao giờ hết.

Dagster

Phần lớn trải nghiệm phát triển cục bộ của Dagster tương đồng với Airflow, bao gồm khả năng phát triển, kiểm thử và thực thi pipeline cục bộ. Cả hai đều hỗ trợ các thực hành SDLC cấp doanh nghiệp phổ biến như CI/CD. 

Tuy nhiên, thật khó để so sánh quy mô khổng lồ của cộng đồng Airflow với Dagster. Nếu Airflow có hàng nghìn tài nguyên do cộng đồng phát triển, Dagster vẫn đang nỗ lực bắt kịp. Khi phát triển và xử lý sự cố pipeline với Dagster, người thực hành có thể gặp khó khăn khi nhanh chóng tìm được tài nguyên cần thiết để triển khai giải pháp.

Dễ kiểm thử

Cách tiếp cận dựa trên tài sản của Dagster giúp các pipeline rất dễ kiểm thử. Thực tế, kiểm thử là một trong những giá trị cốt lõi của Dagster. Cùng với hệ thống kiểu đã đề cập, Dagster ưu tiên đảm bảo các pipeline dữ liệu được kiểm thử tương tự như cách một sản phẩm phần mềm được kiểm thử. 

Tài liệu của Dagster nhấn mạnh thách thức của logic nghiệp vụ đan xen trong bất kỳ định nghĩa pipeline nào và các kỹ thuật phổ biến để xử lý điều này khi kiểm thử. Đây là lĩnh vực mà nhiều người cảm thấy trải nghiệm nhà phát triển của Airflow còn thiếu.

Dagster vs Airflow: Điểm mạnh và điểm yếu

Bạn đã bắt đầu hình dung việc sử dụng Airflow và Dagster chưa? Giờ, chúng ta sẽ phân tích nơi mỗi công cụ vượt trội hơn công cụ kia, cũng như một vài hạn chế đã biết.

Airflow

Khả năng mở rộng vô hạn

Nghe có vẻ sáo rỗng, nhưng với Airflow, bầu trời là giới hạn. Tính mở rộng của dự án là vô song. Nhà phát triển Airflow có thể xây dựng operator, sensor, executor, thậm chí là timetable của riêng mình. Với các đội dữ liệu có bài toán đặc thù, điều này rất hấp dẫn. Không muốn tự xây tích hợp tùy chỉnh? 

Đừng lo, nhiều khả năng bạn không cần. Có hơn 1.600 tích hợp sẵn sàng sử dụng chỉ sau một lệnh cài đặt pip. Là tiêu chuẩn ngành cho điều phối dữ liệu đồng nghĩa Airflow được hưởng lợi từ đổi mới liên tục, tạo nên một “vòng lặp phản hồi tích cực”.

Vận hành Airflow trong môi trường production 

Là một sản phẩm thực sự mã nguồn mở, có vô số cách để chạy Airflow trong production. Từ cụm Kubernetes on-prem đến dịch vụ quản lý hoàn toàn, hàng nghìn doanh nghiệp vận hành Airflow trong môi trường production. 

Quy định chính phủ và báo cáo, cam kết về quyền riêng tư và bảo mật dữ liệu, cùng “rừng rậm” kết nối mạng buộc các đội dữ liệu phải cấu hình công cụ theo những cách đôi khi khó tưởng tượng. Với những đội như vậy, họ cần mọi sự linh hoạt và tùy biến có thể có khi chạy Airflow trong production. Những đội khác có thể muốn nhà cung cấp dịch vụ quản lý gánh hết phần nặng. Với Airflow, cả hai thái cực này (và mọi lựa chọn ở giữa) đều khả thi.

Độ dốc học tập

Airflow có tính mở rộng và hàng nghìn plugin. DAG có thể được định nghĩa bằng nhiều kỹ thuật, pipeline có thể được kích hoạt bằng lập lịch dựa trên dữ liệu, và có thể cấu hình backend bí mật tùy chỉnh. 

Tất cả điều này có nghĩa là khai thác Airflow đến mức tối đa sẽ đòi hỏi một chút đường cong học tập. 

Với các Kỹ sư Dữ liệu muốn nhanh chóng xây dựng và thực thi pipeline, Airflow có rào cản gia nhập. Thường thì điều này khiến họ nghiêng về một lựa chọn thẳng thắn hơn, như Dagster.

Dagster

Xây dựng pipeline trực quan

Xây dựng pipeline dữ liệu với Dagster rất trực quan. Cách tiếp cận dựa trên tài sản hấp dẫn với những người thực hành dữ liệu muốn đưa pipeline vào production với ít chi phí đầu vào nhất có thể. 

Dagster ít có đường cong học tập hơn so với làm việc với các operator truyền thống của Airflow, đặc biệt với những người quen viết hàm Python để xây dựng pipeline dữ liệu. Đây là một trong những thế mạnh lớn nhất của Dagster và thường là lý do lớn khiến một đội dữ liệu chọn tin tưởng Dagster để vận hành pipeline của họ.

Cộng đồng đang lớn mạnh

Cạnh tranh với cộng đồng Airflow là điều khó, ngay cả với Dagster. Từ đóng góp cho dự án mã nguồn mở đến xây dựng connector cho bổ sung mới nhất của ngăn xếp dữ liệu, đến trả lời câu hỏi và biên soạn tài liệu, hầu như không có gì cộng đồng Airflow chưa làm. Tuy vậy, cộng đồng Dagster đang phát triển nhanh chóng. Ở cấp doanh nghiệp, cộng đồng non trẻ này vừa là rủi ro, vừa là cơ hội để bạn góp tiếng nói vào dự án Dagster.

Airflow vs. Dagster: Nên chọn cái nào?

Vậy sau khi so sánh, công cụ nào phù hợp với bạn? Trong bảng dưới đây, chúng tôi đã tổng hợp so sánh của từng công cụ: 

Tính năng/Khía cạnh

Airflow

Dagster

Khái niệm Pipeline

Dùng Đồ thị Có Hướng Không Chu trình (DAG) để biểu diễn pipeline, với task là đơn vị cơ bản.

Dùng cách tiếp cận dựa trên tài sản, trong đó bất kỳ đối tượng dữ liệu được lưu trữ nào đều gọi là tài sản (asset), với các thao tác gọi là “op”.

Biểu diễn Tác vụ

Các task được định nghĩa bằng operator, hoặc với TaskFlow API để định nghĩa task dựa trên hàm.

Op được dùng để biểu diễn các bước trong pipeline, với đầu vào/ra có kiểu để tăng tính rõ ràng.

Lập lịch

Lập lịch rất linh hoạt với CRON, timetable và trigger dựa trên dữ liệu.

Lập lịch ít được nhấn mạnh hơn nhưng gắn với tài sản và các phụ thuộc của chúng.

Phát triển cục bộ

Hỗ trợ phát triển cục bộ qua Airflow CLI để lặp và kiểm thử nhanh.

Cũng hỗ trợ phát triển và kiểm thử cục bộ, nhưng ít tài nguyên cộng đồng hơn.

Hệ thống kiểu

Hỗ trợ gợi ý kiểu của Python, nhưng không phải tính năng cốt lõi.

Hệ thống kiểu mạnh để kiểm định đầu vào/ra ở mọi bước, là trung tâm thiết kế của pipeline.

Khả năng mở rộng

Rất linh hoạt với 1.600+ tích hợp, operator, sensor tùy chỉnh và hơn thế nữa.

Khả năng mở rộng hạn chế hơn nhưng trực quan với người dùng hàm Python.

Hỗ trợ cộng đồng

Cộng đồng lớn, trưởng thành với hàng nghìn người đóng góp và nhiều tài nguyên (ví dụ: blog, hướng dẫn).

Cộng đồng nhỏ hơn nhưng tăng trưởng nhanh, tạo cơ hội ảnh hưởng và đóng góp.

Dễ học

Đường cong học tập dốc hơn do tính mở rộng và các tính năng tùy chỉnh.

Đường cong học tập thấp hơn nhờ cách xây dựng pipeline trực quan và dựa trên tài sản.

Kiểm thử

Có thể kiểm thử nhưng không phải trọng tâm.

Nhấn mạnh mạnh mẽ vào kiểm thử, với cách tiếp cận dựa trên tài sản giúp pipeline dễ kiểm thử hơn.

Triển khai Production

Có thể chạy trong nhiều môi trường, từ Kubernetes on-prem đến dịch vụ quản lý hoàn toàn.

Ít trưởng thành hơn về các lựa chọn triển khai production nhưng vẫn linh hoạt cho các bài toán doanh nghiệp.

Tích hợp tùy chỉnh

Khả năng mở rộng vô hạn với hàng nghìn tích hợp và khả năng tạo thành phần tùy chỉnh.

Hạn chế hơn so với Airflow, nhưng đang tăng cùng với sự mở rộng cộng đồng.

Trải nghiệm nhà phát triển

TaskFlow API và các công cụ như dag-factory nâng cao trải nghiệm nhà phát triển.

Trực quan hơn, nhấn mạnh sự đơn giản và triển khai nhanh, nhưng có ít công cụ hơn.

Đồ họa dưới đây tóm tắt những điểm giống và khác nhau chính về tính năng và chức năng của cả Airflow và Dagster. 

Phân tích các điểm giống và khác nhau giữa Airflow và Dagster bằng sơ đồ Venn.

Những điểm tương đồng giữa Airflow và Dagster.

Giờ đến câu hỏi triệu đô: bạn nên chọn công cụ điều phối nào cho công việc?

Vì sao chọn Airflow?

Nói ngắn gọn, Airflow là tiêu chuẩn de facto để viết và chạy pipeline dữ liệu trong production. Đúng là có những thành phần trong mẫu thiết kế của Dagster có thể vượt trội về kỹ thuật so với Airflow. Nhưng khả năng mở rộng của Airflow cùng cộng đồng hỗ trợ dự án khiến nó là lựa chọn dễ dàng cho các đội dữ liệu đã thành lập. Airflow mang đến cả hai thế giới: thư viện công cụ khổng lồ sẵn có cộng khả năng tạo bất kỳ operator, sensor hay hook nào bạn có thể tưởng tượng. Airflow đã tìm thấy chỗ đứng của mình và sẽ còn ở đó lâu dài.

Vì sao chọn Dagster?

Với các đội dữ liệu nhỏ quen tự viết pipeline dữ liệu, Dagster có thể là công cụ phù hợp. Dù Dagster không có nhiều “chuông và còi” như Airflow, nó mang lại con đường nhanh từ ý tưởng đến production. Dagster cung cấp hỗ trợ hạng nhất cho những điều quan trọng (như phát triển cục bộ, unit test mạnh mẽ và khung mô-đun), cùng vô số tích hợp. Khi dự án trưởng thành và cộng đồng lớn mạnh, Dagster tiếp tục thu hẹp khoảng cách tính năng với Airflow trong khi vẫn duy trì rào cản gia nhập thấp.

Kết luận

So sánh công cụ luôn là thách thức. Thật khó để nói cái này “tốt hơn” cái kia, hoặc ép một công cụ vào một nhóm người dùng cụ thể. Sự thật là, khung nền tảng đằng sau Airflow và Dagster tương đồng đáng kinh ngạc. Những người làm dữ liệu giỏi nhất không chạy theo tính năng khi chọn công cụ. Thay vào đó, họ tập trung vào việc công cụ được tích hợp vào hệ sinh thái của họ tác động ra sao đến quy trình.

Liệu Airflow có cho phép đội của tôi lặp nhanh hơn không? Một công cụ như Dagster có giúp kỹ sư kiểm thử mã tốt hơn trước khi đưa vào production không? Công cụ điều phối này có phù hợp với tầm nhìn lớn hơn cho nền tảng dữ liệu không? Những câu hỏi như vậy giúp tạo ra giá trị cho các đội dữ liệu và các bên liên quan mà họ phục vụ.

Nếu bạn sẵn sàng bắt đầu với Apache Airflow, hãy xem khóa học Giới thiệu về Airflow bằng Python của DataCamp. Tại đây, bạn sẽ học những điều cơ bản về cách dùng task, sensor và mọi thứ cần thiết để xây dựng DAG Airflow đầu tiên của mình.


Jake Roach's photo
Author
Jake Roach
LinkedIn

Jake là một kỹ sư dữ liệu chuyên xây dựng hạ tầng dữ liệu có tính bền bỉ và khả năng mở rộng cao bằng Airflow, Databricks và AWS. Jake cũng là giảng viên của khóa học Introduction to Data Pipelines và Introduction to NoSQL trên DataCamp.

Chủ đề
Kỹ thuật Dữ liệu

Các khóa học hàng đầu trên DataCamp

Khóa học

Giới thiệu về Apache Airflow bằng Python

4 giờ
65.4K
Tìm hiểu cách triển khai và lên lịch các quy trình công việc kỹ thuật dữ liệu.
Xem chi tiếtBắt Đầu Khóa Học

Lộ trình

Kỹ sư dữ liệu trong Python

40 giờ
Nắm vững các kỹ năng được săn đón để thu thập, làm sạch, quản lý dữ liệu một cách hiệu quả, cũng như lên lịch và giám sát các quy trình xử lý dữ liệu, giúp bạn nổi bật trong lĩnh vực kỹ thuật dữ liệu.

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp Tục Với Google
Bằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách bảo mật và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.
Xem thêm