2015-12-11 17 views
5

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--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:

  1. 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?

  2. 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?

Trả lời

4

Câu hỏi 1: Trong chế độ hạt thô, chấp hành viên Spark (org.apache.spark.executor.CoarseGrainedExecutorBackend) được đưa ra như Mesos nhiệm vụ. Mesos Framework thực sự là Spark Driver. One Spark Driver có thể gửi nhiều công việc Spark. Nó phụ thuộc vào ứng dụng Spark của bạn. Spark và Mesos đều đến từ AMPLab của UC Berkeley và được phát triển song song, vì vậy họ sử dụng các thuật ngữ tương tự (executor, task ...) có thể gây nhầm lẫn cho bạn :-).

Câu hỏi 2: Ở chế độ thô, Spark chỉ khởi chạy một trình điều khiển cho mỗi máy chủ (vui lòng tham khảo https://issues.apache.org/jira/browse/SPARK-5095 để biết chi tiết). Vì vậy, đối với trường hợp của bạn, Spark sẽ khởi chạy một trình thực thi cho mỗi máy chủ (mỗi bộ thực thi tiêu thụ bộ nhớ 16G và tất cả các lõi có sẵn trong máy chủ là 16 lõi nếu không có khối lượng công việc khác) cho đến khi tổng số lõi thực thi đạt 240 lõi. Sẽ có 240/16 = 15 người thi hành.

Tuân theo spark.mesos.mesosExecutor.cores, nó chỉ hoạt động ở chế độ chi tiết. Trong chế độ chi tiết, Spark sẽ khởi chạy một trình thực thi (org.apache.spark.executor.MesosExecutorBackend) cho mỗi máy chủ. Người thi hành tiêu thụ số lõi của spark.mesos.mesosExecutor.cores mặc dù không có nhiệm vụ nào. Mỗi tác vụ sẽ tiêu thụ một số lõi khác của spark.task.cpus.

+1

[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

0

Về 1)

Đây là hiểu biết của tôi là tốt. Một nhiệm vụ Mesos thực sự là một Spark Executor (nhiệm vụ).

Về 2)

Từ sự hiểu biết của tôi, bạn sẽ có thể sử dụng thuộc tính spark.mesos.mesosExecutor.cores cấu hình:

(chế độ Fine-grained chỉ) Số lượng lõi để cung cấp cho mỗi người thi hành Mesos. Điều này không bao gồm các lõi được sử dụng để chạy các tác vụ Spark. Nói cách khác, ngay cả khi không có nhiệm vụ Spark đang được chạy, mỗi người thực hiện Mesos sẽ chiếm số lượng lõi được cấu hình ở đây. Giá trị có thể là số dấu phẩy động.

Xem

+0

Hmm ... có lẽ tôi đã sai khi nghĩ rằng tôi nên sử dụng chế độ thô-hạt? Nếu tôi hiểu chính xác, điều này sẽ cho phép chúng tôi sửa số lõi/người thi hành, nhưng sau đó chúng tôi vẫn chạy vào tự động mở rộng quy mô tài nguyên mà tôi không muốn ở đây ... – moustachio

Các vấn đề liên quan