Bế tắc khi nhiều công việc tia lửa được lên lịch đồng thời


17

Sử dụng tia lửa 2.4.4 chạy trong chế độ cụm YARN với bộ lập lịch biểu đồ tia sáng FIFO.

Tôi đang gửi nhiều hoạt động cơ sở dữ liệu tia lửa (tức là ghi dữ liệu lên S3) bằng cách sử dụng bộ thực thi nhóm luồng với số lượng luồng khác nhau. Điều này hoạt động tốt nếu tôi có ~ 10 luồng, nhưng nếu tôi sử dụng hàng trăm luồng, dường như có một bế tắc, không có công việc nào được lên lịch theo Spark UI.

Những yếu tố kiểm soát bao nhiêu công việc có thể được lên lịch đồng thời? Tài nguyên trình điều khiển (ví dụ bộ nhớ / lõi)? Một số cài đặt cấu hình tia lửa khác?

BIÊN TẬP:

Đây là một bản tóm tắt ngắn gọn về mã của tôi

ExecutorService pool = Executors.newFixedThreadPool(nThreads);
ExecutorCompletionService<Void> ecs = new ExecutorCompletionService<>(pool);

Dataset<Row> aHugeDf = spark.read.json(hundredsOfPaths);

List<Future<Void>> futures = listOfSeveralHundredThings
  .stream()
  .map(aThing -> ecs.submit(() -> {
    df
      .filter(col("some_column").equalTo(aThing))
      .write()
      .format("org.apache.hudi")
      .options(writeOptions)
      .save(outputPathFor(aThing));
    return null;
  }))
  .collect(Collectors.toList());

IntStream.range(0, futures.size()).forEach(i -> ecs.poll(30, TimeUnit.MINUTES));
exec.shutdownNow();

Tại một số điểm, khi nThreadstăng, tia lửa dường như không còn lên lịch cho bất kỳ công việc nào như được chứng minh bằng:

  • ecs.poll(...) hết thời gian
  • Tab công việc Spark UI hiển thị không có công việc đang hoạt động
  • Tab người thực thi Spark UI hiển thị không có tác vụ nào cho bất kỳ người thực thi nào
  • Tab Spark UI SQL hiển thị nThreadscác truy vấn đang chạy mà không có ID công việc đang chạy

Môi trường thực thi của tôi là

  • AWS EMR 5.28.1
  • Tia lửa 2.4.4
  • Nút chủ = m5.4xlarge
  • Các nút lõi = 3x rd5.24xlarge
  • spark.driver.cores=24
  • spark.driver.memory=32g
  • spark.executor.memory=21g
  • spark.scheduler.mode=FIFO


Có một phần cụ thể thảo luận về điều này? Tôi đã đọc những tài liệu đó vài lần trong vài ngày qua và không tìm thấy câu trả lời mà tôi đang tìm kiếm.
Scott

2
Bạn có thể vui lòng hiển thị mã mà bạn sử dụng để gửi công việc Spark thông qua trình thực thi nhóm luồng không? Có vẻ như sự bế tắc đang xảy ra trước khi công việc Spark được gửi.
Salim

1
Bạn có thể gửi mã của bạn? Vui lòng cung cấp chi tiết về env của bạn: CPU, RAM; Ngoài ra, làm thế nào bạn tạo ra các chủ đề: đồng thời hoặc trong các nhóm nhỏ 10?
Saheed

Xin lỗi, làm thế nào để bạn có nghĩa là các công việc không được lên lịch? Chúng không xuất hiện trên Spark UI hoặc chúng xuất hiện trong danh sách các công việc, nhưng các tác vụ không được thực thi? Dù bằng cách nào, nếu bạn nghi ngờ bế tắc, vui lòng chạy jstack -lđể lấy kết xuất luồng với thông tin khóa.
Daniel Darabos

Câu trả lời:


0

Nếu có thể, hãy viết đầu ra của các công việc vào AWS Elastic MapReduce hdfs (để tận dụng các đổi tên gần như tức thời và tệp IO tốt hơn của các hdfs cục bộ) và thêm một bước dstcp để di chuyển các tệp sang S3, để tự cứu mình khỏi mọi rắc rối khi xử lý bộ phận của một cửa hàng đối tượng đang cố gắng trở thành một hệ thống tập tin. Ngoài ra, viết vào hdfs cục bộ sẽ cho phép bạn kích hoạt đầu cơ để kiểm soát các tác vụ chạy trốn mà không rơi vào bẫy bế tắc liên quan đến DirectOutputCommiter.

Nếu bạn phải sử dụng S3 làm thư mục đầu ra, hãy đảm bảo rằng các cấu hình Spark sau được đặt

spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2
spark.speculation false

Lưu ý: DirectParquetOutputCommitter bị xóa khỏi Spark 2.0 do khả năng mất dữ liệu. Thật không may cho đến khi chúng tôi đã cải thiện tính nhất quán từ S3a, chúng tôi phải làm việc với các cách giải quyết. Mọi thứ đang được cải thiện với Hadoop 2.8

Tránh các tên khóa theo thứ tự từ điển. Người ta có thể sử dụng băm / tiền tố ngẫu nhiên hoặc đảo ngược thời gian ngày để đi vòng quanh. Thủ thuật là đặt tên cho các khóa của bạn theo thứ bậc, đặt những thứ phổ biến nhất bạn lọc ở bên trái của khóa. Và không bao giờ có dấu gạch dưới trong tên xô do vấn đề DNS.

Việc kích hoạt fs.s3a.fast.upload uploadcác phần của một tệp duy nhất cho Amazon S3 song song

Tham khảo các bài viết này để biết thêm chi tiết-

Đặt spark.speculation trong Spark 2.1.0 trong khi ghi vào s3

https://medium.com/@subhojit20_27731/apache-spark-and-amazon-s3-gotchas-and-best-practices-a767242f3d98


AWS có committer riêng của mình docs.aws.amazon.com/emr/latest/ReleaseGuide/...
mazaneicha

0

IMO bạn có khả năng tiếp cận vấn đề này sai. Trừ khi bạn có thể đảm bảo rằng số lượng nhiệm vụ cho mỗi công việc rất thấp, bạn có thể sẽ không nhận được nhiều cải thiện hiệu suất bằng cách song song 100 công việc cùng một lúc. Cụm của bạn chỉ có thể hỗ trợ 300 tác vụ cùng một lúc, giả sử bạn đang sử dụng song song mặc định 200 chỉ có 1,5 công việc. Tôi khuyên bạn nên viết lại mã của mình để đạt được các truy vấn đồng thời tối đa ở mức 10. Tôi rất nghi ngờ rằng bạn có 300 truy vấn chỉ với một nhiệm vụ duy nhất là vài trăm thực sự đang chạy. Hầu hết các hệ thống xử lý dữ liệu OLTP có chủ ý có mức truy vấn đồng thời khá thấp so với các hệ thống RDS truyền thống hơn vì lý do này.

cũng thế

  1. Apache Hudi có sự song song mặc định là vài trăm FYI.
  2. Tại sao bạn không chỉ phân vùng dựa trên cột bộ lọc của mình?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.