2015-06-08 22 views
15

Tôi đang cố gắng tối đa hóa việc sử dụng cụm cho một tác vụ đơn giản.Tài nguyên Spark không được phân bổ đầy đủ trên Amazon EMR

Cụm là 1 + 2 x m3.xlarge, runnning Spark 1.3.1, Hadoop 2.4, Amazon AMI 3,7

Nhiệm vụ đọc tất cả các dòng của một tập tin văn bản và phân tích chúng dưới dạng csv.

Khi tôi châm ngòi khi gửi một nhiệm vụ như một chế độ sợi cụm, tôi nhận được một trong những kết quả sau:

  • 0 người thi hành: công việc chờ đợi vô hạn cho đến khi tôi tự giết nó
  • 1 chấp hành viên: công việc dưới sử dụng tài nguyên với chỉ 1 máy làm việc
  • oom khi tôi không gán đủ bộ nhớ trên tài xế

những gì tôi dự kiến ​​sẽ có:

  • Trình điều khiển Spark chạy trên máy chủ cụm với tất cả bộ nhớ khả dụng, cộng với 2 trình điều khiển với 9404MB mỗi (được xác định bởi tập lệnh cài đặt tia lửa).

Đôi khi, khi tôi thực hiện "thành công" với 1 người thi hành, nhân bản và khởi động lại bước kết thúc bằng 0 người thi hành.

Tôi tạo ra cụm của tôi sử dụng lệnh này:

aws emr --region us-east-1 create-cluster --name "Spark Test" 
--ec2-attributes KeyName=mykey 
--ami-version 3.7.0 
--use-default-roles 
--instance-type m3.xlarge 
--instance-count 3 
--log-uri s3://mybucket/logs/ 
--bootstrap-actions Path=s3://support.elasticmapreduce/spark/install-spark,Args=["-x"] 
--steps Name=Sample,Jar=s3://elasticmapreduce/libs/script-runner/script-runner.jar,Args=[/home/hadoop/spark/bin/spark-submit,--master,yarn,--deploy-mode,cluster,--class,my.sample.spark.Sample,s3://mybucket/test/sample_2.10-1.0.0-SNAPSHOT-shaded.jar,s3://mybucket/data/],ActionOnFailure=CONTINUE 

Với một số biến thể bước bao gồm:

--driver bộ nhớ 8G --driver-lõi 4 --num-Chấp hành 2


tập lệnh cài đặt tia lửa với -x tạo các cấu hình mặc định tia lửa sau.conf:

$ cat spark-defaults.conf 
spark.eventLog.enabled false 
spark.executor.extraJavaOptions   -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxHeapFreeRatio=70 
spark.driver.extraJavaOptions   -Dspark.driver.log.level=INFO 
spark.executor.instances  2 
spark.executor.cores 4 
spark.executor.memory 9404M 
spark.default.parallelism  8 

Cập nhật 1

tôi nhận được hành vi tương tự với một ví dụ JavaWordCount generic:

/home/hadoop/spark/bin/spark-submit --verbose --master yarn --deploy-mode cluster --driver-memory 8G --class org.apache.spark.examples.JavaWordCount /home/hadoop/spark/lib/spark-examples-1.3.1-hadoop2.4.0.jar s3://mybucket/data/ 

Tuy nhiên, nếu tôi loại bỏ các '--driver bộ nhớ 8G, nhiệm vụ được giao 2 Chấp hành viên và kết thúc chính xác.

Vì vậy, vấn đề gì với bộ nhớ điều khiển ngăn cản nhiệm vụ của tôi để có được người thực thi?

Trình điều khiển có được thực thi trên nút chính của cụm cùng với Hộp chứa chủ sợi như được giải thích here không?

Làm cách nào để cung cấp thêm bộ nhớ cho trình điều khiển công việc phát tia lửa của tôi? (Nơi thu thập và một số hoạt động hữu ích khác phát sinh)

Trả lời

17

Giải pháp tối đa hóa việc sử dụng cụm là quên tham số '-x' khi cài đặt tia lửa trên EMR và điều chỉnh bộ nhớ và lõi bộ nhớ thực thi bằng tay.

Điều này post đưa ra một giải thích khá tốt về cách phân bổ nguồn lực được thực hiện khi chạy Spark trên YARN.

Một điều quan trọng cần nhớ là tất cả các nhà thực thi phải có cùng tài nguyên được phân bổ! Như chúng ta đã nói, Spark không hỗ trợ các nhà thực thi không đồng nhất. (Một số công việc hiện đang được thực hiện để hỗ trợ GPU nhưng đó là một chủ đề khác)

Vì vậy, để nhận bộ nhớ tối đa được cấp cho trình điều khiển trong khi tối đa bộ nhớ cho người thực thi, tôi nên chia các nút như thế này (slideshare) ở trang 25):

  • Node 0 - Thạc sĩ (quản lý tài nguyên Sợi)
  • Node 1 - NodeManager (container (driver) + container (Executor))
  • Node 2 - NodeManager (container (Executor) + Container (Executor))

LƯU Ý: Một tùy chọn khác sẽ là spark-submit với --master yarn --deploy-mode client từ nút chính 0. Có ví dụ truy cập nào là ý tưởng tồi không?

Trong ví dụ của tôi, tôi có thể có tối đa 3 người thực thi 2 vcores với 4736 MB mỗi trình điều khiển có cùng thông số kỹ thuật.

4736 bộ nhớ có nguồn gốc từ giá trị yarn.nodemanager.resource.memory-mb được xác định trong /home/hadoop/conf/yarn-site.xml. Trên một m3.xlarge, nó được thiết lập để 11520 mb (xem here cho tất cả các giá trị liên quan đến từng loại chẳng hạn)

Sau đó, chúng tôi nhận được:

(11.520-1.024)/2 (Chấp hành viên mỗi nút) = 5248 => 5120 (làm tròn xuống đến tăng 256 mb theo quy định tại yarn.scheduler.minimum phân bổ-mb)

7% * 5120 = 367 làm tròn lên đến 384 (bộ nhớ overhead) sẽ trở thành 10% tia lửa 1.4

5120 - 384 = 4736

liên kết thú vị khác:

+0

Đúng, về cơ bản, người dùng cần điều chỉnh cài đặt để phù hợp với nội dung mong muốn. Các tài liệu Spark liên quan đến việc tung ra sợi thảo luận về điều này. – ChristopherB

+0

Phân tích nút của bạn ngụ ý rằng trình điều khiển không chạy trên trình quản lý tài nguyên (ví dụ chính trong EMR). Đây có phải là trường hợp không? (cố gắng quấn đầu của tôi xung quanh tất cả điều này) (khi chạy như sợi-cluster) – noli

+0

Vâng, đó là những gì nó nói .. Trừ khi tôi là nhầm lẫn, tôi đã không nhìn thấy bất cứ điều gì chạy trên nút chủ khi sử dụng chế độ sợi-cluster . –

2

Vấn đề là xung quanh kỳ vọng về cách Spark hoạt động trên YARN. Khi Spark được chạy với một chế độ triển khai cụm hoặc bộ chủ để nhóm sợi trình điều khiển là không được thực thi trên nút chính nhưng trong vùng chứa Ứng dụng chính trên một trong các nút phụ.Để biết thêm chi tiết, hãy xem https://spark.apache.org/docs/latest/running-on-yarn.html

Tôi mong đợi điều xảy ra là cụm không thể đáp ứng các yêu cầu bộ nhớ cho trình điều khiển (nhớ rằng bộ nhớ thực sự yêu cầu của cụm là những gì bạn yêu cầu cộng với phí trên) và do đó chờ đợi mãi mãi để phân bổ ứng dụng Master nơi trình điều khiển sẽ chạy hoặc cho người thực thi.

Để cung cấp cho trình điều khiển số lượng bộ nhớ bạn đang yêu cầu, bạn sẽ cần phải sử dụng thêm nô lệ để cung cấp tài nguyên cho trình điều khiển dựa trên cụm và trình điều khiển cùng một lúc. Với chi phí trên trình điều khiển, tôi nghi ngờ bạn có thể cần phải sử dụng một loại cá thể với nhiều bộ nhớ hơn. Khi bạn yêu cầu 8G cho người lái xe hãy xem nhật ký trình quản lý tài nguyên và xác minh số tiền thực được yêu cầu.

Để chạy trình điều khiển trên nút chính, chế độ triển khai sẽ cần phải là ứng dụng khách. Điều này vẫn có thể được thực hiện với các bước EMR nếu bạn sử dụng một bước để gọi một tập lệnh để bản địa hóa các jars trình điều khiển trên nút chính và sau đó bước tiếp theo có thể gọi là bộ trình chiếu tia lửa cho khách hàng chế độ triển khai và tham chiếu JAR trên tệp chủ cục bộ. hệ thống.

+0

Sau đó, tôi hy vọng sẽ luôn có ít nhất một trình điều khiển trên thiết lập 3 máy. Khi tôi nhìn vào giao diện người dùng Spark trong phần thi hành viên, tôi thường chỉ thấy một người lái xe và không có người điều hành. Và tại sao Spark không thực hiện bất cứ điều gì trên chính trình điều khiển? Điều đó có vẻ hợp lý để sử dụng trình điều khiển cho một số công việc. Tuy nhiên, nó không có vẻ là làm bất cứ điều gì cả theo giao diện người dùng lửa .. –

+0

Trình điều khiển không dành cho người thực thi/công việc song song. Chỉ dành cho mọi thứ được thu thập lại và xử lý tương tác/lập lịch SparkContext. Với một thiết lập 3 máy sẽ chỉ có 2 nút cho các thùng chứa. Nếu bạn thấy trình điều khiển nhưng không có người thực thi ... sẽ phải xem xét kỹ hơn các nhật ký từ trình điều khiển và trình quản lý tài nguyên để xác định lý do tại sao một người thực thi không thể bật lên nút thứ hai. – ChristopherB

0

bài Michel Lemay là đọc nền tốt, và ông đưa ra câu trả lời cho 1 cấu hình cụm cụ thể. Tôi đã nhúng logic đó vào một bảng tính sẽ hiển thị các tùy chọn tốt nhất cho bất kỳ cụm nào. Để sử dụng, điền vào số lượng các nút trong cụm, số lõi/nút ảo và số lượng bộ nhớ/nút có thể phân bổ. Sau khi thực hiện việc này, trang tính sẽ cung cấp cho bạn các tùy chọn cho các lệnh khởi chạy sẽ sử dụng toàn bộ cụm của bạn cho cả chế độ nhóm & cho các trình thực thi 1, 2, 4 và 8 trên mỗi nút. Tôi đã đánh dấu hàng tương ứng với 2 người thi hành mỗi nút vì điều này luôn là lựa chọn tốt nhất trong các bài kiểm tra của tôi. Vui lòng sao chép trang tính này hoặc thêm các tab cho các loại cụm khác nhau tùy thích.

https://docs.google.com/spreadsheets/d/1VH7Qly308hoRPu5VoLIg0ceolrzen-nBktRFkXHRrY4/edit?usp=sharing

0

Dưới đây là làm thế nào tôi có được xung quanh các vấn đề:

Bằng cách đặt spark.executor.memory + tài xế bộ nhớ thấp hơn tổng số của bất kỳ nút chính nhất định, sau đó sợi có thể đặt cả Thạc sĩ và người thực hiện trên một nút cho trước .. Bạn hy sinh một số bộ nhớ bị mất trên các nút khác, nhưng quan trọng hơn là tôi có các CPU đang chạy. Dưới đây là ví dụ (trên r3.8xlớn):

aws emr add-steps --cluster-id j-1234 --steps Type=Spark,Name=foob3,Args=[--conf,spark.memory.fraction=0.95,--conf,spark.memory.storageFraction=0.1,--conf,spark.yarn.executor.memoryOverhead=8000,--conf,spark.executor.memory=200g,--conf,spark.executor.cores=32,--conf,spark.executor.instances=4,--conf,spark.dynamicAllocation.enabled=false,--class,myclass.Foo,--deploy-mode,cluster,--master,yarn,--driver-memory,10g,s3://myjar-1.0-SNAPSHOT.jar],ActionOnFailure=CONTINUE 
Các vấn đề liên quan