2015-10-12 24 views
20

Tôi gặp sự cố với việc cân bằng lại tài nguyên công việc của Apache Spark trên YARN Fair Scheduled hàng đợi.YARN không hỗ trợ tài nguyên dựa trên cổ phần hợp lý khi chạy công việc Spark

Đối với các thử nghiệm tôi đã định cấu hình Hadoop 2.6 (đã thử 2.7 cũng) để chạy ở chế độ phân phối giả với HDFS cục bộ trên MacOS. Đối với công việc gửi sử dụng "Pre-xây dựng Spark 1.4 cho Hadoop 2.6 và sau đó" (đã thử 1,5 cũng) phân phối từ Spark's website.

Khi thử nghiệm với cấu hình cơ bản trên Hadoop MapReduce công việc, Công cụ lập lịch biểu hoạt động như mong đợi: Khi tài nguyên của cụm vượt quá số lượng tối đa, cổ phần công bằng được tính toán và tài nguyên cho công việc trong hàng đợi khác nhau được cân nhắc và cân bằng dựa trên các tính toán này.

Thử nghiệm tương tự được thực hiện với công việc Spark, trong trường hợp đó YARN đang tính toán đúng số cổ phần hợp lý cho mỗi công việc, nhưng tài nguyên cho các thùng chứa Spark không được cân bằng lại.

Dưới đây là file conf của tôi:

$ HADOOP_HOME/etc/hadoop/sợi-site.xml

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
<configuration> 
    <property> 
     <name>yarn.nodemanager.aux-services</name> 
     <value>mapreduce_shuffle</value> 
    </property> 
    <property> 
     <name>yarn.nodemanager.aux-services.spark_shuffle.class</name> 
     <value>org.apache.spark.network.yarn.YarnShuffleService</value> 
    </property> 
    <property> 
     <name>yarn.resourcemanager.scheduler.class</name> 
     <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> 
    </property> 
    <property> 
     <name>yarn.scheduler.fair.preemption</name> 
     <value>true</value> 
    </property> 
</configuration> 

$ HADOOP_HOME/etc/hadoop/fair-scheduler.xml

<?xml version="1.0" encoding="UTF-8"?> 
<allocations> 
    <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy> 
    <queue name="prod"> 
     <weight>40</weight> 
     <schedulingPolicy>fifo</schedulingPolicy> 
    </queue> 
    <queue name="dev"> 
     <weight>60</weight> 
     <queue name="eng" /> 
     <queue name="science" /> 
    </queue> 
    <queuePlacementPolicy> 
     <rule name="specified" create="false" /> 
     <rule name="primaryGroup" create="false" /> 
     <rule name="default" queue="dev.eng" /> 
    </queuePlacementPolicy> 
</allocations> 

$ HADOOP_HOME/etc/hadoop/core-site.xml

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
<configuration> 
    <property> 
     <name>fs.defaultFS</name> 
     <value>hdfs://localhost:9000</value> 
    </property> 
</configuration> 

$ HADOOP_HOME/etc/hadoop/core-site.xml

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
<configuration> 
    <property> 
     <name>dfs.replication</name> 
     <value>1</value> 
    </property> 
</configuration> 

Và trường hợp thử nghiệm là:

Chạy một công việc trên "prod" hàng đợi với trọng lượng 40 (phải phân bổ 40% của tất cả các tài nguyên), như mong đợi công việc mất tất cả các nguồn lực miễn phí cần thiết (62,5% tài nguyên cụm).

./bin/spark-submit --class org.apache.spark.examples.SparkPi \ 
--master yarn-cluster \ 
--driver-memory 512M \ 
--executor-memory 768M \ 
--executor-cores 1 \ 
--num-executors 2 \ 
--queue prod \ 
lib/spark-examples*.jar 100000 

Sau đó chạy các công việc tương tự trên "dev.eng" hàng đợi với trọng lượng 60, có nghĩa là công việc phải phân bổ 60% của tất cả các nguồn lực và giảm các nguồn lực công việc đầu tiên để ~ 40%.

./bin/spark-submit --class org.apache.spark.examples.SparkPi \ 
--master yarn-cluster \ 
--driver-memory 512M \ 
--executor-memory 768M \ 
--executor-cores 1 \ 
--num-executors 2 \ 
--queue dev.eng \ 
lib/spark-examples*.jar 100000 

Thật không may, tài nguyên cụm không thay đổi - 62,5% cho công việc đầu tiên và 37,5% cho giây.

Trả lời

0

Trình lập lịch biểu công bằng không giết các vùng chứa cho công việc đầu tiên, Nó chỉ đợi cho đến khi một số tài nguyên được giải phóng và dự trữ chúng được sử dụng bởi công việc thứ hai. Nếu tài nguyên không được miễn phí từ công việc đầu tiên, người lập lịch không thể gán các tài nguyên đó cho công việc thứ hai.

Trong công việc MapReduce, mỗi tác vụ bản đồ hoặc giảm yêu cầu tạo nhanh vùng chứa mới và trình lên lịch có thể chặn công việc tạo nhanh container mới nếu nó vượt quá báo giá (dựa trên dung lượng hàng đợi).

Trong Spark những thứ khác nhau, các giám đốc điều hành đang được bắt đầu vào lúc bắt đầu công việc và các nhiệm vụ (giai đoạn) khác nhau được gửi đến họ. Sau đó, các nguồn lực không được miễn phí và họ không thể được phân bổ lại.

Có thể phân bổ năng động có thể giúp: http://spark.apache.org/docs/1.6.1/configuration.html#dynamic-allocation

+0

Thực ra nó sẽ giết các thùng chứa trong công việc đầu tiên. Tất cả phụ thuộc vào cách bạn thiết lập ưu đãi. – tk421

4

Bạn cần phải thiết lập một trong những timeouts đòn phủ đầu trong xml phân bổ của bạn. Một cho chia sẻ tối thiểu và một cho chia sẻ công bằng, cả hai đều trong vài giây. Theo mặc định, thời gian chờ không được đặt.

Từ Hadoop: The Definitive Guide 4th Edition

Nếu một hàng đợi chờ càng lâu càng timeout phần đòn phủ đầu tối thiểu của nó mà không nhận tối thiểu của nó đảm bảo phần, sau đó có thể lên lịch Ðể tránh container khác. Thời gian chờ mặc định được đặt cho tất cả các hàng đợi thông qua phần tử cấp cao nhất mặc địnhMinSharePreemptionTimeout trong tệp phân bổ và trên cơ sở mỗi hàng đợi bằng cách đặt phần tử minminSharePreemptionTimeout cho hàng đợi. Tương tự, nếu một hàng đợi vẫn còn dưới một nửa số cổ phần công bằng của nó trong thời gian chờ là thời gian chờ ưu tiên chia sẻ công bằng, thì trình lên lịch có thể trước các vùng chứa khác. Thời gian chờ mặc định được đặt cho tất cả các hàng đợi thông qua phần tử cấp cao nhất trong số defaultFairSharePreemptionTimeout trong tệp phân bổ và trên cơ sở mỗi hàng đợi bằng cách đặt fairSharePreemptionTimeout trên hàng đợi. Ngưỡng cũng có thể được thay đổi từ giá trị mặc định là 0,5 bằng cách đặt defaultFairSharePreemptionThreshold và fairSharePreemptionThreshold (mỗi hàng đợi).

+0

Giá trị thời gian chờ hợp lệ là gì? –

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