Tôi đang làm việc trên một dự án trong Spark và gần đây đã chuyển từ sử dụng Spark Standalone sang Mesos để quản lý cụm. Bây giờ tôi thấy mình bối rối về cách phân bổ tài nguyên khi gửi một công việc theo hệ thống mới.Tìm hiểu phân bổ nguồn lực cho các công việc về tia lửa trên mesos
Trong chế độ độc, tôi đã sử dụng một cái gì đó như thế này (sau đây một số khuyến nghị từ this Cloudera blog post:.
/opt/spark/bin/spark-submit --executor-memory 16G --executor-cores 8
--total-executor-cores 240 myscript.py
Đây là trên một cụm trong đó mỗi máy có 16 lõi và ~ 32 GB RAM
gì Điều tốt đẹp về điều này là tôi đã kiểm soát tốt số lượng người chạy và tài nguyên được phân bổ cho mỗi người. Trong ví dụ trên, tôi biết mình đã nhận được 240/8 = 30 người thực thi, mỗi bộ nhớ có 16GB bộ nhớ và 8 lõi. bộ nhớ trên mỗi máy trong cụm, điều này sẽ không vượt quá hai trình thực thi chạy trên mỗi máy. muốn nhiều chấp hành viên, tôi có thể làm một cái gì đó giống như
/opt/spark/bin/spark-submit --executor-memory 10G --executor-cores 5
--total-executor-cores 240 myscript.py
này bây giờ sẽ cho tôi 240/5 = 47 Chấp hành viên, mỗi 5 lõi và bộ nhớ 10GB, và sẽ cho phép lên đến 3 Chấp hành viên cho mỗi máy.
Nhưng giờ tôi đang sử dụng mesos, tôi hơi bối rối. Trước hết, tôi đang chạy ở chế độ thô để đảm bảo tôi có thể sửa và kiểm soát phân bổ tài nguyên của mình (đây là dịch vụ của mô hình khá phức tạp nơi chúng tôi muốn phân bổ trước tài nguyên).
Bây giờ, tôi có thể chỉ định --total-executor-cores
và --executor-memory
, nhưng tài liệu này cho tôi biết rằng --exeuctor-cores
chỉ áp dụng cho Spark độc lập và YARN, xác định tổng số người thực thi và tài nguyên được phân bổ cho từng khó khăn. Giả sử tôi chạy điều này:
/opt/spark/bin/spark-submit --total-executor-cores 240 --executor-memory 16G --conf spark.mesos.coarse=true myscript.py
Khi tôi kiểm tra công việc này trong giao diện người dùng web Mesos, mọi thứ bắt đầu trở nên khó hiểu. Vì vậy, đây là câu hỏi của tôi:
Thuật ngữ. Giao diện người dùng Web liệt kê "khung công tác", mà tôi giả định tương ứng với "công việc" trong giao diện người dùng độc lập. Nhưng khi tôi bấm vào các chi tiết cho một khuôn khổ nhất định, nó liệt kê "nhiệm vụ". Nhưng đây không phải là nhiệm vụ Spark thực sự, đúng không? Theo như tôi có thể nói, "nhiệm vụ" ở đây phải thực sự có nghĩa là "người thực thi" xa như Spark có liên quan. Điều này sẽ phù hợp với giao diện người dùng cho biết khung công việc của tôi có: 15 tác vụ hoạt động, 240 CPU và bộ nhớ 264 GB.
264/15 = 17.6, có vẻ như phù hợp với bộ nhớ 16GB trên mỗi trình thực thi mà tôi đã chỉ định (cộng với một số chi phí, tôi đoán). Tôi có đúng về cách tôi giải thích tất cả điều này không?
Giả sử có, khi tôi kiểm tra bất kỳ "nhiệm vụ" nào (người thực thi), tôi thấy rằng mỗi số có 16 lõi được gán. Do chúng tôi có 16 lõi trên mỗi máy, điều này dường như chỉ ra rằng về cơ bản tôi đang chạy một trình điều khiển trên mỗi máy 16, và mỗi người thực thi đều nhận được 16 lõi đầy đủ, nhưng chỉ có 16 GB RAM. (lưu ý rằng, ngay cả khi tôi thả
--executor-memory
xuống dưới, đến một cái gì đó như 4GB, mesos vẫn chỉ chạy một thực thi cho mỗi nút, với 16 lõi và 4GB RAM). Nhưng những gì tôi muốn thực hiện là một cái gì đó giống như hai ví dụ đầu tiên của tôi. Tức là, tôi muốn chạy nhiều trình thực thi cho mỗi nút, mỗi bộ nhớ chia sẻ RAM và lõi của nút đó (tức là số lượng lõi thực thi trung bình, 5-8). Xem xét tôi không thể chỉ định--executor-cores
trong Mesos, làm cách nào để thực hiện điều này? Hoặc tôi là cách ra khỏi cơ sở cho một số lý do thậm chí muốn thực hiện điều này? Mesos sẽ không cho phép nhiều exeuctors cho mỗi nút?
[Spark Doc] (https://spark.apache.org/docs/2.1.0/running-on-mesos.html#mesos-run-modes) "Spark có thể chạy qua Mesos ở hai chế độ:" thô-grained "(mặc định) và * * "Hạt mịn" (không được chấp nhận) **. " Bắt đầu với phiên bản Spark 2.0.0 – Vezir