Demystifying Partitioning ใน Spark



บล็อกนี้จะบอกคุณทั้งหมดที่คุณต้องรู้เกี่ยวกับการแบ่งพาร์ติชันใน Spark ประเภทพาร์ติชันและวิธีปรับปรุงความเร็วในการดำเนินการสำหรับการแปลงตามคีย์

สนับสนุนโดย Prithviraj Bose

Spark’s ชุดข้อมูลแบบกระจายที่ยืดหยุ่น (สิ่งที่เป็นนามธรรมการเขียนโปรแกรม) ได้รับการประเมินอย่างเฉื่อยชาและการแปลงจะถูกจัดเก็บไว้ในรูปแบบกราฟอะไซคลิก (DAG) ดังนั้นทุกการกระทำบน RDD จะทำให้ Spark คำนวณ DAG ใหม่ นี่คือวิธีการบรรลุความยืดหยุ่นใน Spark เนื่องจากหากโหนดของผู้ปฏิบัติงานล้มเหลว DAG ก็จะต้องได้รับการคำนวณใหม่





นอกจากนี้ยังเป็น บังคับให้แคช (ยังคงมีระดับการจัดเก็บที่เหมาะสม) RDD ดังนั้นการดำเนินการบ่อยๆใน RDD จะไม่บังคับให้ Spark คำนวณ DAG ใหม่หัวข้อที่กล่าวถึงในบล็อกนี้จำเป็นสำหรับการรับรอง Apache Spark และ Scala หัวข้อที่ครอบคลุมในบล็อกนี้จำเป็นสำหรับ .

ทำไมต้องใช้ Partitioner?

ในการประมวลผลแบบคลัสเตอร์ความท้าทายหลักคือการลดปริมาณการใช้งานเครือข่าย เมื่อข้อมูลเป็นแบบเน้นคีย์ - ค่าการแบ่งพาร์ติชันจะกลายเป็นสิ่งที่จำเป็นเพราะสำหรับการเปลี่ยนแปลงในภายหลังบน RDD จะมีการสับข้อมูลจำนวนพอสมควรในเครือข่าย หากคีย์ที่คล้ายกันหรือช่วงของคีย์ถูกเก็บไว้ในพาร์ติชันเดียวกันการสับจะลดลงและการประมวลผลจะเร็วมาก



การแปลงที่ต้องการการสับข้อมูลข้ามโหนดของผู้ปฏิบัติงานจะได้รับประโยชน์อย่างมากจากการแบ่ง การเปลี่ยนแปลงดังกล่าวคือ cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey, reduceByKey, combinationByKey และ ค้นหา .

พาร์ติชันสามารถกำหนดค่าได้หาก RDD เป็นคีย์ - ค่า

คุณสมบัติของพาร์ติชัน

  1. สิ่งทอในพาร์ติชันเดียวกันรับประกันว่าจะอยู่ในเครื่องเดียวกัน
  2. แต่ละโหนดในคลัสเตอร์สามารถมีพาร์ติชันได้มากกว่าหนึ่งพาร์ติชัน
  3. จำนวนพาร์ติชันทั้งหมดสามารถกำหนดค่าได้โดยค่าเริ่มต้นจะถูกตั้งค่าเป็นจำนวนคอร์ทั้งหมดบนโหนดตัวดำเนินการทั้งหมด

ประเภทของการแบ่งพาร์ติชันใน Spark

Spark รองรับการแบ่งพาร์ติชันสองประเภท

วิธีการโคลนวัตถุใน java
  • การแบ่งพาร์ติชันแฮช : ใช้ Java’s Object.hashCode วิธีการกำหนดพาร์ติชันเป็น พาร์ติชัน = key.hashCode ()% numPartitions

hash-partitioning-demystifying-partitioning-in-spark



  • การแบ่งช่วง : ใช้ช่วงเพื่อแจกจ่ายไปยังพาร์ติชันที่เกี่ยวข้องกับคีย์ที่อยู่ในช่วง วิธีนี้เหมาะสำหรับกรณีที่มีการเรียงลำดับตามปกติในคีย์และคีย์ไม่เป็นค่าลบ ข้อมูลโค้ดด้านล่างแสดงการใช้งานของ range partitioner

ตัวอย่างรหัส

มาดูตัวอย่างวิธีแบ่งข้อมูลระหว่างโหนดของผู้ปฏิบัติงาน มีรหัส Scala แบบเต็ม ที่นี่ .

ต่อไปนี้เป็นข้อมูลการทดสอบของพิกัด 12 พิกัด (เป็น tuples)

coupling ใน java คืออะไร

สร้างไฟล์ org.apache.spark.HashPartitioner ขนาด 2 ซึ่งคีย์จะถูกแบ่งพาร์ติชันทั้งสองพาร์ติชั่นนี้ตามรหัสแฮชของคีย์

จากนั้นเราสามารถตรวจสอบคู่และทำการแปลงตามคีย์ต่างๆเช่น foldByKey และ ReduceByKey

การสรุปการแบ่งพาร์ติชันช่วยเพิ่มความเร็วในการดำเนินการอย่างมากสำหรับการแปลงตามคีย์

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นแล้วเราจะติดต่อกลับไป

กระทู้ที่เกี่ยวข้อง:

ซ็อกเก็ตใน java คืออะไร

ทำไมคุณควรเรียนรู้ Spark หลังจากเรียนรู้ Hadoop

Apache Spark Vs Hadoop MapReduce