6

Tôi đã gặp phải nhiều sự cố trong một số mô hình chủ đề Spark LDA (chủ yếu là các lỗi phân tách trong các khoảng thời gian dường như ngẫu nhiên). . Điều này có vẻ liên quan đến cấu hình cụm tự động có vấn đề. Nỗ lực mới nhất của tôi sử dụng các máy n1-standard-8 (8 lõi, 30GB RAM) cho cả nút chủ và nút công nhân (6 công nhân, do đó tổng cộng 48 lõi).Các sự cố cấu hình Google Cloud Dataproc

Nhưng khi tôi nhìn vào /etc/spark/conf/spark-defaults.conf Tôi thấy điều này:

spark.master yarn-client 
spark.eventLog.enabled true 
spark.eventLog.dir hdfs://cluster-3-m/user/spark/eventlog 

# Dynamic allocation on YARN 
spark.dynamicAllocation.enabled true 
spark.dynamicAllocation.minExecutors 1 
spark.dynamicAllocation.initialExecutors 100000 
spark.dynamicAllocation.maxExecutors 100000 
spark.shuffle.service.enabled true 
spark.scheduler.minRegisteredResourcesRatio 0.0 

spark.yarn.historyServer.address cluster-3-m:18080 
spark.history.fs.logDirectory hdfs://cluster-3-m/user/spark/eventlog 

spark.executor.cores 4 
spark.executor.memory 9310m 
spark.yarn.executor.memoryOverhead 930 

# Overkill 
spark.yarn.am.memory 9310m 
spark.yarn.am.memoryOverhead 930 

spark.driver.memory 7556m 
spark.driver.maxResultSize 3778m 
spark.akka.frameSize 512 

# Add ALPN for Bigtable 
spark.driver.extraJavaOptions -Xbootclasspath/p:/usr/local/share/google/alpn/alpn-boot-8.1.3.v20150130.jar 
spark.executor.extraJavaOptions -Xbootclasspath/p:/usr/local/share/google/alpn/alpn-boot-8.1.3.v20150130.jar 

Nhưng những giá trị này không có ý nghĩa nhiều. Tại sao chỉ sử dụng 4/8 lõi thực thi? Và chỉ có 9,3/30GB RAM? Ấn tượng của tôi là tất cả cấu hình này được cho là được xử lý tự động, nhưng ngay cả những nỗ lực của tôi trong việc tinh chỉnh thủ công cũng không khiến tôi ở bất cứ đâu.

Ví dụ, tôi đã cố gắng tung ra vỏ với:

spark-shell --conf spark.executor.cores=8 --conf spark.executor.memory=24g 

Nhưng sau đó này thất bại với

java.lang.IllegalArgumentException: Required executor memory (24576+930 MB) is above the max threshold (22528 MB) of this cluster! Please increase the value of 'yarn.scheduler.maximum-allocation-mb'. 

tôi đã cố gắng thay đổi giá trị liên quan trong /etc/hadoop/conf/yarn-site.xml, để không ảnh hưởng gì. Ngay cả khi tôi thử thiết lập cụm khác (ví dụ: sử dụng các trình thực thi có RAM trên 60 GB), tôi cũng gặp phải vấn đề tương tự. Vì lý do nào đó, ngưỡng tối đa vẫn ở mức 22528MB.

Có điều gì đó tôi đang làm sai ở đây hay đây là vấn đề với cấu hình tự động của Google?

Trả lời

7

Có một số sự cố đã biết với cấu hình bộ nhớ mặc định trong các cụm nơi loại máy chủ khác với loại máy của nhân viên, mặc dù trong trường hợp của bạn dường như không phải là vấn đề chính.

Khi bạn nhìn thấy những điều sau đây:

spark.executor.cores 4 
spark.executor.memory 9310m 

này thực sự có nghĩa là mỗi nút công nhân sẽ chạy 2 chấp hành viên, và mỗi chấp hành viên sẽ sử dụng 4 lõi như rằng tất cả 8 lõi được thực sự sử dụng hết trên mỗi công nhân. Bằng cách này, nếu chúng tôi cung cấp cho AppMaster một nửa máy, AppMaster có thể được đóng gói thành công bên cạnh một người thực thi.

Lượng bộ nhớ được cung cấp cho NodeManagers cần phải để lại một số chi phí cho chính daemon NodeManager và misc. các dịch vụ daemon khác như DataNode, vì vậy ~ 80% còn lại cho NodeManagers. Ngoài ra, phân bổ phải là bội số của phân bổ YARN tối thiểu, do đó, sau khi sàn đến bội số phân bổ gần nhất, đó là nơi 22528MB đến từ n1-standard-8.

Nếu bạn thêm công nhân có RAM trên 60 GB, thì miễn là bạn sử dụng nút chính có cùng kích thước bộ nhớ thì bạn nên sẽ thấy số ngưỡng tối đa cao hơn.

Dù bằng cách nào, nếu bạn đang gặp sự cố OOM, thì không quá nhiều bộ nhớ cho mỗi người thực thi quan trọng nhất, mà đúng hơn là bộ nhớ cho mỗi tác vụ. Và nếu bạn đang tăng spark.executor.cores cùng lúc với spark.executor.memory thì bộ nhớ trên mỗi tác vụ không thực sự được tăng lên, do đó bạn sẽ không thực sự đưa ra khoảng không nhiều hơn cho logic ứng dụng của bạn trong trường hợp đó; Spark sẽ sử dụng spark.executor.cores để xác định số lượng tác vụ đồng thời chạy trong cùng một không gian bộ nhớ.

Để thực sự có được nhiều bộ nhớ hơn mỗi nhiệm vụ, bạn chủ yếu nên thử:

  1. Sử dụng n1-highmem- loại * Máy
  2. Hãy thử giảm spark.executor.cores khi rời khỏi spark.executor .memory giống nhau
  3. Hãy thử tăng spark.executor.memory trong khi rời khỏi spark.executor.cores giống nhau

Nếu bạn thực hiện (2) hoặc (3) ở trên thì bạn sẽ không còn thiếu lõi so với cấu hình mặc định cố gắng chiếm tất cả các lõi, nhưng đó thực sự là cách duy nhất để có thêm bộ nhớ cho mỗi tác vụ ngoài việc highmem trường hợp.

+0

Ahhh, điều này thực sự hữu ích. Cần phải làm một số xác nhận rằng điều này thực sự là vấn đề, và sẽ chấp nhận câu trả lời nếu có. Không nhận ra rằng bạn có thể có nhiều người thực hiện trên cùng một nút, vì vậy điều này có ý nghĩa hơn nhiều bây giờ. – moustachio

+0

Và tôi khá chắc chắn rằng vấn đề bộ nhớ là vấn đề ở đây, nhưng lỗi ngăn xếp Spark thường ít rõ ràng hơn. Tôi về cơ bản đã chạy một loạt các mô hình chủ đề LDA, với số lượng ngày càng tăng của các chủ đề (nhiều chủ đề -> thất bại nhiều hơn), do đó, bộ nhớ có vẻ như thủ phạm có khả năng. – moustachio

+0

Vâng, kích thước của người thi hành là một trong những điểm gây nhầm lẫn được biết đến của Spark, và thật không may là rất khó để có các cấu hình một kích thước phù hợp; [bài đăng trên blog Cloudera này] (http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/) có thêm chi tiết về các tác động của việc định kích thước của người thi hành . –

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