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 )
Comments
Post a Comment