Job Scheduling in Apache Spark

Job Scheduling in Apache Spark

Job Scheduling

Job scheduling có thể nằm ở 2 level: Cluster level hoặc Spark apps level

Cluster level: ở đây job sẽ là từng cái Spark apps, từng apps sẽ yêu cầu tài nguyên từ Cluster Manager cho việc xử lý job, khi yêu cầu đc chấp nhận, các tài nguyên này sẽ lock lại và k đc sử dụng bởi các Spark apps khác cho đến khi tài nguyên đc giải phóng

Application level: ở đây job sẽ là từng Action đc trigger trong 1 Spark apps. Sẽ có lúc có nhiều job được yêu cầu thực hiện cùng lúc, lúc này Job Scheduling sẽ sắp xếp thực hiện các job này 1 cách phù hợp ( FIFO, FAIR, … )

Job Scheduling at Cluster Level

Job Scheduling ở Cluster level có thể hiểu là Resource Availability của cụm. Khi 1 Spark apps được submit và chạy thì nó sẽ có các resource của riêng nó và các resource này sẽ ko share với các apps khác. Nếu có nhiều apps trên cùng 1 cluster cần share các resource với nhau thì chúng ta có 2 cách để phân bổ và quản lý resource:

Static Allocation ( phân bổ tĩnh )

Ở cách phân bổ này, 1 số lượng resource của cụm sẽ đc gán cứng cho 1 Spark apps trong lúc apps đang chạy. Các resource này sẽ đc giải phóng khi apps chạy xong.

Dynamic Allocation ( phân bổ động )

Ở cách phân bổ này, số lượng executor sẽ đc add và remove khỏi Spark apps theo nhu cầu, dựa vào lượng resource ước tính cần được sử dụng. Tính năng này sẽ rất có ích khi các Spark apps cần share lượng resource đang có trong cụm.

1 số config cơ bản

spark.dynamicAllocation.enabled”, “spark.dynamicAllocation.minExecutors”, “spark.dynamicAllocation.maxExecutors”, “spark.dynamicAllocation.initialExecutors”.

config để khi executor bị remove, chúng sẽ ko xóa các file shuffle đã được ghi

spark.shuffle.service.enabled”, “spark.dynamicAllocation.shuffleTracking.enabled”.

Add Request

spark.dynamicAllocation.schedulerBacklogTimeout” , “spark.dynamicAllocation.sustainedSchedulerBacklogTimeout”.

Remove Request cho phép Spark apps remove 1 executor khi nó vượt quá số giây đc set bởi config dưới đây

spark.dynamicAllocation.executorIdleTimeout

khi executor đc add để thực thi task và sau đó remove, để bảo toàn đc cached data ta có thể nghiên cứu các config sau  “spark.shuffle.service.enabled”  “spark.dynamicAllocation.cachedExecutorIdleTimeout”, “spark.shuffle.service.fetch.rdd.enabled

Job Scheduling at Application Level

FIFO ( Mặc định )

Nếu job đầu tiên ko dùng hết resource, job thứ 2 sẽ được start

Tuy nhiên nhược điểm là khi nếu bạn có 1 job đầu tiên chạy vài tiếng và job thứ 2 chỉ chạy vài giây thôi, nếu mà job đầu tiên lấy hết resource thì job thứ 2 sẽ phải đợi job đầu chạy xong mới đc chạy :((

⇒ Trường hợp này ta có thể dùng FAIR scheduling

FAIR ( sử dụng config “spark.scheduler.mode”: “FAIR” )

Fair scheduler sẽ phân bổ các task từ nhiều job khác nhau đến các con executor theo “round-robin fashion”. Cách scheduling có thể giúp job đc phân bổ resource đồng đều hơn.

Fair scheduler còn hỗ trợ chúng ta bỏ các job vào pool và phân bổ mức ưu tiên khác nhau đến các pool đó. Các pool sẽ được phân bổ resource dựa vào weight của chúng. Sử dụng pool có thể đảm bảo các job quan trọng sẽ được hoàn thành ( vì đc ưu tiên resource hơn )

Reference

https://medium.com/@badwaik.ojas/job-scheduling-in-apache-spark-e7b2ce2fbd

Comments

Popular posts from this blog

Introduction to Apache Doris

Một số câu hỏi về 'difference between'

Introduction to Apache Hudi