การหยุดชะงักเมื่องาน spark หลายงานถูกกำหนดเวลาไว้พร้อมกัน


17

การใช้ spark 2.4.4 ทำงานในโหมดคลัสเตอร์ YARN พร้อมด้วยตัวกำหนดตารางเวลาประกายไฟ FIFO

ฉันกำลังส่งการดำเนินการ spark dataframe หลายรายการ (เช่นการเขียนข้อมูลไปยัง S3) โดยใช้ตัวจัดการเธรดพูลที่มีเธรดจำนวนตัวแปร สิ่งนี้ใช้ได้ดีถ้าฉันมีเธรด ~ 10 แต่ถ้าฉันใช้เธรดนับร้อยรายการดูเหมือนว่าจะเป็นการหยุดชะงักโดยไม่มีงานที่กำหนดไว้ตาม Spark UI

ปัจจัยอะไรที่ควบคุมว่าสามารถจัดตารางเวลางานได้พร้อมกันกี่งาน ทรัพยากรไดร์เวอร์ (เช่นหน่วยความจำ / แกนประมวลผล)? การตั้งค่าการกำหนดค่า Spark อื่น ๆ

แก้ไข:

นี่เป็นบทสรุปโดยย่อของรหัสของฉัน

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();

เมื่อถึงจุดหนึ่งเมื่อมีการnThreadsเพิ่มจำนวนขึ้นประกายไฟก็ดูเหมือนว่าจะไม่ได้กำหนดเวลางานใด ๆ ตามที่ได้รับการพิสูจน์โดย:

  • ecs.poll(...) หมดเวลาในที่สุด
  • แท็บงาน Spark UI แสดงไม่มีงานที่ใช้งานอยู่
  • แท็บตัวจัดการ Spark UI แสดงงานที่ไม่ทำงานสำหรับผู้ปฏิบัติการใด ๆ
  • แท็บ Spark UI SQL แสดงคิวรีที่nThreadsกำลังรันโดยไม่มี ID งานที่รันอยู่

สภาพแวดล้อมการดำเนินการของฉันคือ

  • AWS EMR 5.28.1
  • Spark 2.4.4
  • โหนดหลัก = m5.4xlarge
  • โหนดหลัก = 3x rd5.24xlarge
  • spark.driver.cores=24
  • spark.driver.memory=32g
  • spark.executor.memory=21g
  • spark.scheduler.mode=FIFO

โปรดตรวจสอบspark.apache.org/docs/latest/job-scheduling.html
dassum

มีส่วนเฉพาะที่กล่าวถึงเรื่องนี้หรือไม่? ฉันอ่านเอกสารเหล่านั้นหลายครั้งในช่วงไม่กี่วันที่ผ่านมาและไม่พบคำตอบที่ฉันต้องการ
สกอตต์

2
คุณกรุณาแสดงรหัสที่คุณใช้ส่งงาน Spark ผ่านตัวจัดการเธรดพูลหรือไม่ ดูเหมือนว่าการหยุดชะงักเกิดขึ้นก่อนที่จะส่งงาน Spark
ซาลิม

1
คุณสามารถโพสต์รหัสของคุณได้ไหม โปรดระบุรายละเอียดเกี่ยวกับ env ของคุณ: CPU, RAM; คุณจะสร้างเธรดได้อย่างไร: พร้อมกันหรือในกลุ่มเล็ก ๆ 10 กลุ่ม
Saheed

ขออภัยคุณหมายถึงงานที่ไม่ได้จัดตารางเวลาไว้อย่างไร ไม่ปรากฏบน Spark UI หรือปรากฏในรายการของงาน แต่งานไม่ได้ถูกดำเนินการ ไม่ว่าจะด้วยวิธีใดหากคุณสงสัยว่ามีการหยุดชะงักโปรดเรียกใช้jstack -lเพื่อรับเธรดการถ่ายโอนข้อมูลพร้อมข้อมูลล็อค
Daniel Darabos

คำตอบ:


0

ถ้าเป็นไปได้เขียนผลลัพธ์ของงานไปยัง AWS Elastic MapReduce hdfs (เพื่อใช้ประโยชน์จากการเปลี่ยนชื่อทันทีและไฟล์ IO ที่ดีกว่าของ hdfs ในพื้นที่) และเพิ่มขั้นตอน dstcp เพื่อย้ายไฟล์ไปยัง S3 เพื่อช่วยตัวคุณเองทุกปัญหาในการจัดการ อวัยวะภายในของที่เก็บอ็อบเจ็กต์ที่พยายามเป็นระบบไฟล์ การเขียนไปยัง hdfs ในเครื่องจะช่วยให้คุณสามารถเปิดใช้งานการเก็งกำไรเพื่อควบคุมภารกิจที่ต้องหลบหนีโดยไม่ต้องตกอยู่ในกับดักดักจับที่เกี่ยวข้องกับ DirectOutputCommiter

หากคุณต้องใช้ S3 เป็นไดเรกทอรีผลลัพธ์ให้ตรวจสอบว่ามีการตั้งค่า Spark ดังต่อไปนี้

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

หมายเหตุ: DirectParquetOutputCommitter จะถูกลบออกจาก Spark 2.0 เนื่องจากโอกาสในการสูญหายของข้อมูล น่าเสียดายจนกว่าเราจะปรับปรุงความสอดคล้องจาก S3a เราต้องทำงานกับวิธีแก้ปัญหา สิ่งต่าง ๆ กำลังดีขึ้นด้วย Hadoop 2.8

หลีกเลี่ยงชื่อคีย์ตามลำดับพจนานุกรม หนึ่งสามารถใช้คำนำหน้า hashing / สุ่มหรือย้อนกลับวันเวลาเพื่อรับเคล็ดลับคือการตั้งชื่อคีย์ของคุณตามลำดับชั้นวางสิ่งที่พบบ่อยที่สุดที่คุณกรองโดยทางด้านซ้ายของคีย์ของคุณ และไม่เคยมีการขีดเส้นใต้ในชื่อที่ฝากข้อมูลเนื่องจากปัญหา DNS

การเปิดใช้งานfs.s3a.fast.upload uploadบางส่วนของไฟล์เดียวกับ Amazon S3 ในแบบคู่ขนาน

อ้างถึงบทความเหล่านี้สำหรับรายละเอียดเพิ่มเติม -

การตั้งค่า spark.speculation ใน Spark 2.1.0 ขณะที่เขียนเป็น s3

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



0

IMO คุณอาจเข้าใกล้ปัญหานี้ผิด หากคุณไม่สามารถรับประกันได้ว่าจำนวนงานต่องานต่ำมากคุณอาจจะไม่ได้รับการพัฒนาประสิทธิภาพมากนักโดยการทำขนาน 100s งานพร้อมกัน คลัสเตอร์ของคุณสามารถรองรับได้ 300 งานในคราวเดียวโดยสมมติว่าคุณใช้ความขนานเริ่มต้นที่ 200 นั่นเพียง 1.5 งานเท่านั้น ฉันขอแนะนำให้เขียนรหัสของคุณใหม่เพื่อให้ครอบคลุมการค้นหาพร้อมกันสูงสุดที่ 10 ฉันสงสัยอย่างมากว่าคุณมีการค้นหา 300 ครั้งโดยมีเพียงงานเดียวที่ทำงานหลายร้อยรายการ ระบบประมวลผลข้อมูล OLTP ส่วนใหญ่มีเจตนาสอบถามพร้อมกันในระดับที่ค่อนข้างต่ำเมื่อเทียบกับระบบ RDS แบบดั้งเดิมมากขึ้นด้วยเหตุนี้

ด้วย

  1. Apache Hudi มีความเท่าเทียมเริ่มต้นของหลายร้อย FYI
  2. ทำไมคุณไม่เพียงแค่แบ่งพาร์ติชันตามคอลัมน์ตัวกรองของคุณ?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.