2014-09-19 15 views
19

Cho một ứng dụng SparkYếu tố nào quyết định số lượng người thực thi trong chế độ độc lập?

  1. Yếu tố nào quyết định số lượng người thực thi trong chế độ độc lập? Trong Mesos và YARN theo tài liệu this, chúng tôi có thể chỉ định số lượng người thực hiện/lõi và bộ nhớ.

  2. Khi một số người thực thi bắt đầu. Spark có bắt đầu các nhiệm vụ theo kiểu vòng tròn hay không và có đủ thông minh để xem liệu một số người thực thi có rảnh/bận không và sau đó lên lịch các nhiệm vụ tương ứng.

  3. Ngoài ra, Spark quyết định số nhiệm vụ như thế nào? Tôi đã làm write một chương trình nhiệt độ tối đa đơn giản với tập dữ liệu nhỏ và Spark sinh ra hai nhiệm vụ trong một người thi hành duy nhất. Đây là chế độ độc lập Spark.

Trả lời

2

Spark chọn số lượng tác vụ dựa trên số lượng phân vùng trong tập dữ liệu gốc. Nếu bạn đang sử dụng HDFS làm nguồn dữ liệu, thì theo mặc định, số lượng phân vùng bằng số khối HDFS. Bạn có thể thay đổi số lượng phân vùng theo một số cách khác nhau. Hai đầu: là một đối số bổ sung cho phương thức SparkContext.textFile; bằng cách gọi phương thức RDD.repartion.

+0

Tôi đã đặt một tệp gồm 5 khối và xem 5 tác vụ là Spark. Hình như cho một khối hai phân vùng được tạo ra. Đối với nhiều hơn một khối, cùng một số phân vùng được tạo. –

19

Trả lời câu hỏi của bạn:

  1. Các chế độ độc lập sử dụng biến cấu hình tương tự như Mesos và chế độ Sợi để thiết lập số lượng Chấp hành viên. Biến số spark.cores.max xác định số lượng lõi tối đa được sử dụng trong Ngữ cảnh tia lửa. Giá trị mặc định là vô cùng nên Spark sẽ sử dụng tất cả các lõi trong cụm. Biến spark.task.cpus xác định số lượng CPU mà Spark sẽ phân bổ cho một tác vụ duy nhất, giá trị mặc định là 1. Với hai biến này, bạn có thể xác định số lượng tác vụ song song tối đa trong cụm của bạn.

  2. Khi bạn tạo một subDlass RDD, bạn có thể xác định trong đó máy chạy nhiệm vụ của bạn. Điều này được xác định theo phương pháp getPreferredLocations. Nhưng khi các phương thức chữ ký gợi ý đây chỉ là một sở thích vì vậy nếu Spark phát hiện ra rằng một máy không bận, nó sẽ khởi chạy tác vụ trong máy nhàn rỗi này. Tuy nhiên tôi không biết cơ chế được sử dụng bởi Spark để biết những gì máy đang nhàn rỗi. Để đạt được địa phương, chúng tôi (Stratio) quyết định làm cho từng Phần nhỏ hơn để công việc mất ít thời gian hơn và đạt được địa phương.

  3. Số tác vụ của mỗi hoạt động của Spark được xác định theo độ dài của phân vùng RDD. Vector này là kết quả của phương thức getPartitions mà bạn phải ghi đè nếu bạn muốn phát triển một subClass RDD mới. Phương thức này trả về cách RDD được phân tách, nơi thông tin và phân vùng. Khi bạn tham gia hai hoặc nhiều RDD bằng cách sử dụng, ví dụ, các nghiệp vụ kết hợp hoặc nối, số nhiệm vụ của RDD kết quả là số nhiệm vụ tối đa của các RDD liên quan đến hoạt động. Ví dụ: nếu bạn tham gia RDD1 có 100 tác vụ và RDD2 có 1000 tác vụ, hoạt động tiếp theo của RDD kết quả sẽ có 1000 tác vụ. Lưu ý rằng số lượng phân vùng cao không nhất thiết phải đồng nghĩa với nhiều dữ liệu hơn.

Tôi hy vọng điều này sẽ hữu ích.

+1

Kiểm tra thiết lập tham số num-executors, chế độ độc lập luôn sử dụng một trình thực thi. –

7

Tôi đồng ý với @jlopezmat về cách Spark chọn cấu hình của nó. Đối với mã thử nghiệm của bạn, bạn đang thấy hai nhiệm vụ do cách thức textFile được triển khai.Từ SparkContext.scala:

/** 
    * Read a text file from HDFS, a local file system (available on all nodes), or any 
    * Hadoop-supported file system URI, and return it as an RDD of Strings. 
    */ 
    def textFile(path: String, minPartitions: Int = defaultMinPartitions): RDD[String] = { 
    hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text], 
     minPartitions).map(pair => pair._2.toString) 
    } 

và nếu chúng ta kiểm tra giá trị của defaultMinPartitions là gì:

/** Default min number of partitions for Hadoop RDDs when not given by user */ 
    def defaultMinPartitions: Int = math.min(defaultParallelism, 2) 
+1

Cảm ơn Daniel - Khi tôi tải tệp nhỏ từ HDFS, số lượng phân vùng mặc định là hai (RDD.getNumPartitions()) như bạn đã đề cập. Vì vậy, hai nhiệm vụ đã được bắt đầu một cho mỗi phân vùng và do đó, hai tập tin trong HDFS. Tôi đã kết hợp (1) và số lượng tệp trong đầu ra là 1. –

0

Trả lời một số điểm mà không được đề cập đến trong câu trả lời trước:

  • trong chế độ độc lập, bạn cần phải chơi với --executor-cores--max-executor-cores để đặt số lượng người thực thi sẽ được khởi chạy (miễn là bạn có đủ bộ nhớ để phù hợp với số đó nếu bạn chỉ định --executor-memory)

  • Spark không phân bổ nhiệm vụ theo cách vòng tròn, nó sử dụng cơ chế được gọi là "Delay Scheduling", cho phép mỗi người thực hiện cung cấp tính khả dụng bậc thầy, sẽ quyết định có hay không gửi một nhiệm vụ trên đó.

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