paint-brush
Phân tích quá trình thực thi tác vụ của Worker trong Apache DolphinSchedulertừ tác giả@williamguo
142 lượt đọc

Phân tích quá trình thực thi tác vụ của Worker trong Apache DolphinScheduler

từ tác giả William Guo9m2024/08/23
Read on Terminal Reader

dài quá đọc không nổi

Apache DolphinScheduler là một hệ thống lập lịch quy trình công việc nguồn mở được biết đến với các hoạt động DAG trực quan và các plugin mở rộng. Bài viết này khám phá quy trình thực hiện chi tiết của các tác vụ Worker, từ khởi tạo tác vụ đến hoàn thành, làm nổi bật kiến trúc hệ thống, loại tác vụ và cơ chế chịu lỗi. Nội dung này rất cần thiết để hiểu cách quản lý và tối ưu hóa hiệu quả các quy trình công việc bằng DolphinScheduler.
featured image - Phân tích quá trình thực thi tác vụ của Worker trong Apache DolphinScheduler
William Guo HackerNoon profile picture
0-item
1-item


Xin chào mọi người, tôi là Cai Shunfeng, một kỹ sư dữ liệu cao cấp tại WhaleOps, và là một thành viên của cộng đồng Apache DolphinScheduler và PMC. Hôm nay, tôi sẽ giải thích cách hoạt động của Worker task của Apache DolphinScheduler.

Giải thích này sẽ được chia thành ba phần:


  1. Giới thiệu về Apache DolphinScheduler
  2. Tổng quan về thiết kế tổng thể của Apache DolphinScheduler
  3. Quy trình thực hiện chi tiết các nhiệm vụ của Worker

Giới thiệu dự án

Apache DolphinScheduler là hệ thống lập lịch quy trình công việc trực quan, dễ mở rộng, phân tán, mã nguồn mở, phù hợp với các tình huống cấp doanh nghiệp.



Nó cung cấp các chức năng chính sau, mang đến giải pháp xử lý dữ liệu vòng đời đầy đủ cho các quy trình công việc và tác vụ thông qua các hoạt động trực quan.

Các tính năng chính

  • Dễ sử dụng

  • Hoạt động DAG trực quan: Người dùng có thể kéo và thả các thành phần trên trang để sắp xếp chúng thành DAG (Đồ thị có hướng không chu trình).

  • Hệ thống plugin: Bao gồm plugin tác vụ, plugin nguồn dữ liệu, plugin cảnh báo, plugin lưu trữ, plugin trung tâm đăng ký và plugin công việc cron, v.v. Người dùng có thể dễ dàng mở rộng plugin khi cần để đáp ứng yêu cầu kinh doanh của mình.


  • Kịch bản sử dụng phong phú

  • Cấu hình tĩnh: Bao gồm lập lịch quy trình công việc, hoạt động trực tuyến và ngoại tuyến, quản lý phiên bản và chức năng lấp đầy.

  • Hoạt động thời gian chạy: Cung cấp các chức năng như tạm dừng, dừng hẳn, tiếp tục và thay thế tham số.

  • Kiểu phụ thuộc: Hỗ trợ nhiều tùy chọn và chiến lược phụ thuộc, thích ứng với nhiều tình huống hơn.

  • Truyền tham số: Hỗ trợ tham số khởi động ở cấp quy trình công việc, tham số toàn cục, tham số cục bộ ở cấp tác vụ và truyền tham số động.


  • Độ tin cậy cao

  • Thiết kế phi tập trung: Tất cả các dịch vụ đều không có trạng thái và có thể mở rộng theo chiều ngang để tăng thông lượng hệ thống.

  • Bảo vệ quá tải và khả năng chịu lỗi của phiên bản:

  • Bảo vệ quá tải: Trong quá trình hoạt động, máy chủ và máy công nhân theo dõi mức sử dụng CPU và bộ nhớ của riêng chúng, cũng như khối lượng tác vụ. Nếu quá tải, chúng sẽ tạm dừng quy trình làm việc/xử lý tác vụ hiện tại và tiếp tục sau khi khôi phục.

  • Chịu lỗi phiên bản: Khi các nút chính/công nhân bị lỗi, trung tâm đăng ký sẽ phát hiện nút dịch vụ ngoại tuyến và thực hiện chịu lỗi cho các phiên bản quy trình công việc hoặc tác vụ, đảm bảo khả năng tự phục hồi của hệ thống ở mức cao nhất có thể.

Thiết kế tổng thể

Kiến trúc dự án

Tiếp theo, chúng ta hãy giới thiệu bối cảnh thiết kế tổng thể. Dưới đây là sơ đồ kiến trúc thiết kế được cung cấp trên trang web chính thức.


Từ sơ đồ kiến trúc, chúng ta có thể thấy rằng Apache DolphinScheduler bao gồm một số thành phần chính:

  • Thành phần API: Dịch vụ API chủ yếu quản lý siêu dữ liệu, tương tác với UI thông qua dịch vụ API hoặc gọi giao diện API để tạo các tác vụ quy trình công việc và nhiều tài nguyên khác nhau mà quy trình công việc cần.


  • Thành phần chính: Thành phần chính là bộ điều khiển các phiên bản quy trình công việc, chịu trách nhiệm sử dụng các lệnh, chuyển đổi chúng thành các phiên bản quy trình công việc, thực hiện phân chia DAG, gửi các tác vụ theo thứ tự và phân phối tác vụ cho các công nhân.


  • Thành phần Worker: Worker là người thực hiện các tác vụ cụ thể. Sau khi nhận được các tác vụ, nó xử lý chúng theo các loại tác vụ khác nhau, tương tác với master và báo cáo trạng thái tác vụ. Đáng chú ý là dịch vụ worker không tương tác với cơ sở dữ liệu; chỉ có API, master và các dịch vụ cảnh báo tương tác với cơ sở dữ liệu.


  • Dịch vụ cảnh báo: Dịch vụ cảnh báo gửi cảnh báo qua các plugin cảnh báo khác nhau. Các dịch vụ này đăng ký với trung tâm đăng ký và máy chủ và máy công nhân định kỳ báo cáo nhịp tim và trạng thái hiện tại để đảm bảo chúng có thể nhận nhiệm vụ bình thường.

Quá trình tương tác giữa chủ và thợ

Quá trình tương tác giữa chủ và thợ như sau:

  • Gửi tác vụ: Sau khi máy chủ hoàn tất việc phân chia DAG, nó sẽ gửi tác vụ tới cơ sở dữ liệu và chọn nhóm công nhân thích hợp để phân phối tác vụ dựa trên các chiến lược phân phối khác nhau.


  • Tiếp nhận nhiệm vụ: Sau khi người lao động nhận được nhiệm vụ, họ sẽ quyết định có chấp nhận nhiệm vụ hay không dựa trên tình trạng của nhiệm vụ. Phản hồi được cung cấp cho dù việc chấp nhận có thành công hay không.


  • Thực thi tác vụ: Người làm việc xử lý tác vụ, cập nhật trạng thái thành đang chạy và phản hồi cho máy chủ. Máy chủ cập nhật trạng thái tác vụ và thông tin thời gian bắt đầu trong cơ sở dữ liệu.


  • Hoàn thành tác vụ: Sau khi tác vụ hoàn thành, worker sẽ gửi thông báo sự kiện kết thúc đến master và master sẽ trả về xác nhận ACK. Nếu không nhận được ACK, worker sẽ tiếp tục thử lại để đảm bảo sự kiện tác vụ không bị mất.

Tiếp nhận nhiệm vụ của công nhân

Khi người lao động nhận được nhiệm vụ, các hoạt động sau đây được thực hiện:

  • Điền thông tin máy chủ.
  • Tạo đường dẫn nhật ký trên máy làm việc.
  • Tạo một Worker Task Executor, được gửi đến nhóm luồng để thực thi.


Công nhân kiểm tra xem có quá tải không; nếu có, công nhân từ chối nhiệm vụ. Sau khi nhận được phản hồi lỗi phân phối nhiệm vụ, chủ tiếp tục chọn một công nhân khác để phân phối nhiệm vụ dựa trên chiến lược phân phối.

Quy trình thực hiện của công nhân

Quy trình thực hiện cụ thể các nhiệm vụ của công nhân bao gồm các bước sau:

  1. Khởi tạo tác vụ: Khởi tạo môi trường và các phụ thuộc cần thiết cho tác vụ.
  2. Thực thi tác vụ: Thực hiện logic tác vụ cụ thể.
  3. Hoàn thành tác vụ: Sau khi thực hiện tác vụ hoàn tất, báo cáo kết quả thực hiện tác vụ cho nút chính.


Tiếp theo, chúng tôi sẽ trình bày chi tiết quy trình thực hiện nhiệm vụ cụ thể.


Trước khi bắt đầu thực hiện tác vụ, đầu tiên phải khởi tạo ngữ cảnh. Tại thời điểm này, thời gian bắt đầu của tác vụ được thiết lập. Để đảm bảo độ chính xác của tác vụ, cần phải đồng bộ thời gian giữa master và worker để tránh trôi thời gian.


Sau đó, trạng thái tác vụ được đặt thành đang chạy và phản hồi cho máy chủ để thông báo rằng tác vụ đã bắt đầu chạy.


Vì hầu hết các tác vụ đều chạy trên hệ điều hành Linux nên cần phải xử lý tệp và đối tượng thuê:

  • Xử lý Tenant: Đầu tiên, nó kiểm tra xem Tenant có tồn tại không. Nếu không, nó quyết định có tự động tạo Tenant dựa trên cấu hình hay không. Điều này yêu cầu người dùng triển khai phải có quyền sudo để chuyển sang Tenant đã chỉ định trong khi thực hiện tác vụ.
  • Người dùng cụ thể : Đối với một số trường hợp, không cần phải chuyển đổi người thuê mà chỉ cần thực hiện tác vụ bằng cách sử dụng một người dùng cụ thể. Hệ thống cũng hỗ trợ điều này.

Sau khi xử lý đối tượng thuê, công nhân tạo thư mục thực thi cụ thể. Thư mục gốc của thư mục thực thi có thể định cấu hình được và yêu cầu quyền hạn phù hợp. Theo mặc định, quyền thư mục được đặt thành 755.


Trong quá trình thực hiện tác vụ, có thể cần nhiều tệp tài nguyên khác nhau, chẳng hạn như tải tệp từ cụm AWS S3 hoặc HDFS. Hệ thống tải xuống các tệp này vào thư mục tạm thời của công nhân để sử dụng cho tác vụ tiếp theo.


Trong Apache DolphinScheduler, các biến tham số có thể được thay thế. Các danh mục chính bao gồm:

  • Tham số tích hợp: Chủ yếu liên quan đến việc thay thế các tham số liên quan đến thời gian và ngày tháng.
  • Tham số do người dùng xác định: Các biến tham số do người dùng đặt trong quy trình làm việc hoặc tác vụ cũng sẽ được thay thế cho phù hợp.

Thông qua các bước trên, môi trường thực thi tác vụ và các tài nguyên cần thiết đã sẵn sàng và tác vụ có thể chính thức bắt đầu thực thi.

Các loại nhiệm vụ khác nhau

Trong Apache DolphinScheduler, nhiều loại tác vụ khác nhau được hỗ trợ, mỗi loại áp dụng cho các tình huống và yêu cầu khác nhau. Dưới đây, chúng tôi giới thiệu một số loại tác vụ chính và các thành phần cụ thể của chúng.


Các thành phần này thường được sử dụng để thực thi các tệp tập lệnh, phù hợp với nhiều ngôn ngữ tập lệnh và giao thức khác nhau:

  • Shell: Thực thi các tập lệnh shell.
  • Python: Thực thi các tập lệnh Python.
  • SQL: Thực thi các câu lệnh SQL.
  • Quy trình lưu trữ: Thực thi các quy trình lưu trữ cơ sở dữ liệu.
  • HTTP: Thực hiện các yêu cầu HTTP.

Phiên bản thương mại (WhaleScheduler) cũng hỗ trợ chạy các ứng dụng Java bằng cách thực thi các gói JAR.

Các thành phần của nhiệm vụ logic

Các thành phần này được sử dụng để thực hiện kiểm soát logic và quản lý quy trình công việc:

  • Chuyển đổi: Nhiệm vụ điều khiển có điều kiện.
  • Phụ thuộc: Nhiệm vụ phụ thuộc.
  • Tiến trình con: Nhiệm vụ con.
  • NextLoop (Phiên bản thương mại): Nhiệm vụ kiểm soát vòng lặp phù hợp với các tình huống tài chính.
  • Thành phần kích hoạt: Giám sát xem tệp hoặc dữ liệu có tồn tại hay không.

Thành phần dữ liệu lớn

Các thành phần này chủ yếu được sử dụng để xử lý và phân tích dữ liệu lớn:

  • SeaTunnel: Tương ứng với phiên bản thương mại của WhaleTunnel, được sử dụng để tích hợp và xử lý dữ liệu lớn.
  • AWS EMR: Tích hợp Amazon EMR.
  • HiveCli: Nhiệm vụ dòng lệnh Hive.
  • Spark: Nhiệm vụ Spark.
  • Flink: Nhiệm vụ Flink.
  • DataX: Nhiệm vụ đồng bộ hóa dữ liệu.

Thành phần Container

Các thành phần này được sử dụng để chạy tác vụ trong môi trường chứa:

  • K8S: Nhiệm vụ Kubernetes.

Các thành phần chất lượng dữ liệu

Được sử dụng để đảm bảo chất lượng dữ liệu:

  • DataQuality: Nhiệm vụ kiểm tra chất lượng dữ liệu.

Thành phần tương tác

Các thành phần này được sử dụng để tương tác với môi trường khoa học dữ liệu và máy học:

  • Jupyter: Nhiệm vụ Jupyter Notebook.
  • Zeppelin: Nhiệm vụ sổ tay Zeppelin.

Thành phần học máy

Các thành phần này được sử dụng để quản lý và thực hiện các tác vụ học máy:

  • Kubeflow: Nhiệm vụ Kubeflow.
  • MlFlow: Nhiệm vụ MlFlow.
  • Dvc: Nhiệm vụ kiểm soát phiên bản dữ liệu.

Nhìn chung, Apache DolphinScheduler hỗ trợ ba đến bốn chục thành phần, bao gồm các lĩnh vực từ thực thi tập lệnh, xử lý dữ liệu lớn đến học máy. Để biết thêm thông tin, vui lòng truy cập trang web chính thức để xem tài liệu chi tiết.

Loại nhiệm vụ trừu tượng

Trong Apache DolphinScheduler, các loại tác vụ được tóm tắt thành nhiều chế độ xử lý để phù hợp với nhiều môi trường thời gian chạy và nhu cầu khác nhau.

Dưới đây chúng tôi giới thiệu chi tiết về quá trình trừu tượng hóa và thực hiện các loại tác vụ.


Worker là dịch vụ JVM được triển khai trên máy chủ. Đối với một số thành phần tập lệnh (như Shell và Python) và các tác vụ chạy cục bộ (như Spark Local), chúng sẽ bắt đầu một quy trình riêng để chạy.


Tại thời điểm này, người lao động tương tác với các tác vụ này thông qua ID quy trình (PID).


Các nguồn dữ liệu khác nhau có thể yêu cầu các điều chỉnh khác nhau. Đối với các tác vụ SQL và thủ tục được lưu trữ, chúng tôi đã trừu tượng hóa việc xử lý cho các nguồn dữ liệu khác nhau, chẳng hạn như MySQL, PostgreSQL, AWS Redshift, v.v. Sự trừu tượng hóa này cho phép điều chỉnh và mở rộng linh hoạt các loại cơ sở dữ liệu khác nhau.


Nhiệm vụ từ xa đề cập đến các nhiệm vụ được thực hiện trên các cụm từ xa, chẳng hạn như AWS EMR, cụm SeaTunnel, cụm Kubernetes, v.v. Worker không thực hiện các nhiệm vụ này cục bộ; thay vào đó, nó gửi chúng đến các cụm từ xa và theo dõi trạng thái và thông báo của chúng. Chế độ này đặc biệt phù hợp với các môi trường đám mây yêu cầu khả năng mở rộng.

Thực hiện nhiệm vụ

Bộ sưu tập nhật ký

Các plugin khác nhau sử dụng các chế độ xử lý khác nhau và do đó, việc thu thập nhật ký cũng khác nhau:

  • Quy trình cục bộ: Nhật ký được ghi lại bằng cách theo dõi đầu ra của quy trình.

  • Nhiệm vụ từ xa: Nhật ký được thu thập bằng cách kiểm tra định kỳ trạng thái nhiệm vụ và đầu ra từ cụm từ xa (ví dụ: AWS EMR) và ghi lại chúng vào nhật ký nhiệm vụ cục bộ.


Thay thế biến tham số

Hệ thống quét nhật ký tác vụ để xác định bất kỳ biến tham số nào cần được thay thế động. Ví dụ, Tác vụ A trong DAG có thể tạo ra một số tham số đầu ra cần được chuyển đến Tác vụ B hạ lưu.

Trong quá trình này, hệ thống sẽ đọc nhật ký và thay thế các biến tham số khi cần thiết.


Lấy ID tác vụ

  • Quy trình cục bộ: ID quy trình (PID) được lấy.
  • Nhiệm vụ từ xa: ID của nhiệm vụ từ xa (ví dụ: ID nhiệm vụ AWS EMR) sẽ được truy xuất.

Giữ các ID tác vụ này cho phép truy vấn dữ liệu và thao tác tác vụ từ xa. Ví dụ, khi một quy trình công việc dừng lại, API hủy tương ứng có thể được gọi bằng ID tác vụ để chấm dứt tác vụ đang chạy.


Xử lý chịu lỗi

  • Quy trình cục bộ: Nếu một nút Worker bị lỗi, quy trình cục bộ sẽ không biết về điều đó, yêu cầu phải gửi lại tác vụ.
  • Nhiệm vụ từ xa: Nếu nhiệm vụ đang chạy trên cụm từ xa (ví dụ: AWS), trạng thái của nhiệm vụ có thể được kiểm tra bằng ID nhiệm vụ và có thể thử tiếp quản nhiệm vụ. Nếu thành công, không cần phải gửi lại nhiệm vụ, giúp tiết kiệm thời gian.

Hoàn thành thực hiện nhiệm vụ

Sau khi một nhiệm vụ được thực hiện, một số hành động hoàn thành là cần thiết:

  • Kiểm tra hoàn thành tác vụ: Hệ thống sẽ kiểm tra xem có cần gửi cảnh báo hay không. Ví dụ, đối với tác vụ SQL, nếu kết quả truy vấn kích hoạt cảnh báo, hệ thống sẽ tương tác với dịch vụ cảnh báo qua RPC để gửi tin nhắn cảnh báo.

  • Phản hồi sự kiện: Worker sẽ gửi sự kiện hoàn thành nhiệm vụ (sự kiện kết thúc) trở lại Master. Master cập nhật trạng thái nhiệm vụ trong cơ sở dữ liệu và tiến hành chuyển đổi trạng thái DAG.

  • Dọn dẹp ngữ cảnh: Worker sẽ xóa ngữ cảnh tác vụ được tạo ra khi bắt đầu tác vụ khỏi bộ nhớ. Nó cũng sẽ dọn dẹp các đường dẫn tệp được tạo trong quá trình thực thi tác vụ. Nếu ở chế độ gỡ lỗi (chế độ phát triển), các tệp này sẽ không được dọn dẹp, cho phép khắc phục sự cố các tác vụ không thành công.


Thông qua các bước này, toàn bộ quá trình thực hiện của một phiên bản tác vụ được hoàn tất.

Đóng góp của cộng đồng

Nếu bạn quan tâm đến Apache DolphinScheduler và muốn đóng góp cho cộng đồng nguồn mở, bạn có thể tham khảo hướng dẫn đóng góp của chúng tôi.


Cộng đồng khuyến khích những đóng góp tích cực, bao gồm nhưng không giới hạn ở:

  • Báo cáo các vấn đề gặp phải trong quá trình sử dụng.
  • Nộp tài liệu và mã PR.
  • Thêm các bài kiểm tra đơn vị (UT).
  • Thêm chú thích cho mã.
  • Sửa lỗi hoặc thêm tính năng mới.
  • Viết các bài viết kỹ thuật hoặc tham gia các buổi gặp gỡ.

Hướng dẫn cho người đóng góp mới

Đối với những người đóng góp mới, bạn có thể tìm kiếm các vấn đề được gắn nhãn là good first issue trong các vấn đề GitHub của cộng đồng. Những vấn đề này thường đơn giản hơn và phù hợp với những người dùng đóng góp lần đầu.


Tóm lại, chúng ta đã tìm hiểu về thiết kế tổng thể của Apache DolphinScheduler và quy trình thực thi chi tiết của tác vụ Worker.

Tôi hy vọng nội dung này giúp bạn hiểu rõ hơn và sử dụng Apache DolphinScheduler. Nếu bạn có bất kỳ câu hỏi nào, hãy thoải mái liên hệ với tôi trong phần bình luận.