2015-05-04 26 views
9

Tôi đang chạy cụm tia lửa trên mã C++ được gói trong python. Tôi hiện đang thử nghiệm các cấu hình khác nhau của các tùy chọn đa luồng (ở cấp độ Python hoặc mức Spark).Apache spark, spark-submit, hành vi của tùy chọn --total-executor-core là gì

Tôi đang sử dụng tia lửa với các tệp nhị phân độc lập, qua cụm HDFS 2.5.4. Cụm này hiện được làm bằng 10 nô lệ, với 4 lõi mỗi.

Từ những gì tôi có thể thấy, theo mặc định, Spark khởi chạy 4 nô lệ mỗi nút (Tôi có 4 python hoạt động trên một nút nô lệ tại một thời điểm).

Tôi làm cách nào để giới hạn số này? Tôi có thể thấy rằng tôi có tùy chọn --total-executor-cores cho "spark-submit", nhưng có rất ít tài liệu về cách nó tác động đến việc phân phối các nhà thực thi trên cụm sao!

Tôi sẽ chạy thử nghiệm để có ý tưởng rõ ràng, nhưng nếu ai đó có kiến ​​thức có đầu mối về tùy chọn này, điều đó có thể hữu ích.

Cập nhật:

tôi đã đi qua tài liệu tia lửa một lần nữa, đây là những gì tôi hiểu:

  • Theo mặc định, tôi có một chấp hành viên của mỗi công nhân nút (ở đây nút 10 người lao động, do đó 10 người thi hành)
  • Tuy nhiên, mỗi nhân viên có thể chạy một số tác vụ song song. Trong chế độ độc lập, hành vi mặc định là sử dụng tất cả các lõi có sẵn, giải thích tại sao tôi có thể quan sát 4 python.
  • Để hạn chế số lượng lõi sử dụng mỗi người lao động, và hạn chế số lượng nhiệm vụ song song, tôi có ít nhất 3 lựa chọn:
    • sử dụng --total-executor-cores whith spark-submit (thỏa đáng nhất, vì không có đầu mối về cách các vũng lõi được xử lý)
    • sử dụng SPARK_WORKER_CORES trong file cấu hình
    • sử dụng -c tùy chọn với các kịch bản bắt đầu

Các dòng sau của tài liệu này http://spark.apache.org/docs/latest/spark-standalone.html giúp tôi tìm ra những gì đang xảy ra:

SPARK_WORKER_INSTANCES
Số trường hợp người lao động để chạy trên mỗi máy (mặc định: 1). Bạn có thể thực hiện điều này nhiều hơn 1 nếu bạn có các máy rất lớn và muốn có nhiều quy trình nhân viên Spark. Nếu bạn thiết lập điều này, hãy chắc chắn cũng đặt SPARK_WORKER_CORES một cách rõ ràng để giới hạn các lõi cho mỗi nhân viên, hoặc người nào khác mỗi nhân viên sẽ cố gắng sử dụng tất cả các lõi.

Điều chưa rõ đối với tôi là lý do tại sao tốt hơn trong trường hợp của tôi là giới hạn số lượng tác vụ song song trên mỗi nút công nhân thành 1 và dựa vào đa luồng mã C++ của tôi. Tôi sẽ cập nhật bài đăng này với kết quả thử nghiệm, khi tôi hoàn thành nghiên cứu của mình.

+0

Từ bản cập nhật của bạn, những gì có vẻ không rõ ràng với tôi là cách bạn đã đạt đến kết luận rằng tốt hơn là giới hạn số tác vụ song song và dựa vào mã đa luồng C++ của bạn. –

+0

Vâng, tôi thực sự đang chạy một tập hợp các thử nghiệm cụ thể, để kiểm tra thời tiết, nó liên tục dựa vào đa luồng thông thường hoặc sử dụng phương pháp tiếp cận Spark. Tôi đang chạy trên google cloud và trong trường hợp xử lý hình ảnh _specific_ của tôi, thỏa hiệp tốt nhất là: đối với một nhân viên có lõi N, có N/2 công việc song song bằng cách sử dụng tia lửa, mỗi công việc đa luồng trên 2 luồng bằng cách sử dụng openMP. Ví dụ: 8 nút công nhân với 16 lõi, thỏa hiệp tốt nhất là 64 công việc song song, và mỗi người trong số họ đa luồng trên 2 lõi. Ngược lại (16 công việc song song, mỗi công việc trên MT trên 8 lõi chậm hơn gấp đôi). – MathiasOrtner

+0

Cảm ơn bạn đã đăng ký. –

Trả lời

2

Để đảm bảo số lượng công nhân bắt đầu trên mỗi nô lệ, hãy mở trình duyệt web, nhập http://master-ip:8080 và xem phần workers về số lượng công nhân đã bắt đầu chính xác và công nhân nào có nô lệ nào. (Tôi đề cập đến những điều trên bởi vì tôi không chắc chắn ý của bạn là gì khi nói '4 nô lệ mỗi nút')

Theo mặc định, tia lửa sẽ bắt đầu chính xác 1 công nhân trên mỗi nô lệ trừ khi bạn chỉ định SPARK_WORKER_INSTANCES=n trong conf/spark-env .sh, trong đó n là số phiên bản công nhân bạn muốn bắt đầu trên mỗi nô lệ.

Khi bạn gửi một công việc phát tia lửa qua trình phát tia lửa, tia lửa sẽ bắt đầu trình điều khiển ứng dụng và một số người thực thi cho công việc của bạn.

  • Nếu không được chỉ định rõ ràng, tia lửa sẽ bắt đầu một người thực hiện cho mỗi công nhân, nghĩa là tổng số người thực hiện bằng tổng số nhân viên và tất cả các lõi sẽ có sẵn cho công việc này.
  • --total-executor-cores bạn chỉ định sẽ giới hạn tổng số lõi khả dụng cho ứng dụng này.
+0

Cảm ơn câu trả lời, tôi đã cập nhật bài đăng của mình với sự phân biệt rõ ràng giữa "người thi hành" và "nhiệm vụ" – MathiasOrtner

1

Tài liệu dường như không rõ ràng.

Từ kinh nghiệm của tôi, việc thực hành phổ biến nhất để phân bổ nguồn lực là bằng cách chỉ ra số lượng Chấp hành viên và số lượng lõi mỗi chấp hành viên, ví dụ (lấy từ here):

$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \ 
--master yarn-cluster \ 
--num-executors 10 \ 
--driver-memory 4g \ 
--executor-memory 2g \ 
--executor-cores 4 \ 
--queue thequeue \ 
lib/spark-examples*.jar \ 
10 

Tuy nhiên, phương pháp này là giới hạn ở YARN và không áp dụng cho độc lập và mesos dựa Spark, theo số this.

Thay vào đó, tham số --total-executor-cores có thể được sử dụng, đại diện cho tổng số lõi - của tất cả các nhà thi hành - được giao cho công việc Spark. Trong trường hợp của bạn, có tổng cộng 40 lõi, việc thiết lập thuộc tính --total-executor-cores 40 sẽ tận dụng tất cả các tài nguyên có sẵn.

Thật không may, tôi không biết cách Spark phân phối khối lượng công việc khi ít tài nguyên hơn tổng số có sẵn được cung cấp. Tuy nhiên, nếu làm việc với hai hoặc nhiều công việc đồng thời, cần phải minh bạch cho người dùng, trong đó Spark (hoặc bất kỳ người quản lý tài nguyên nào) sẽ quản lý cách quản lý tài nguyên tùy thuộc vào cài đặt người dùng.

+0

Cảm ơn, từ thí nghiệm đầu tiên của tôi, có vẻ như các lõi được phân phối trong số các trình thực thi sẵn có (không có bộ thực thi nào được đặt thành lõi không). – MathiasOrtner

+0

Đó là những gì tôi nghĩ rằng nó sẽ làm. Tuy nhiên, nó là một thực tế thú vị mà bây giờ đã được chứng minh. –

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