การเขียนโปรแกรม Spark ขั้นสูง

Spark มีตัวแปรที่ใช้ร่วมกันสองประเภทที่แตกต่างกันหนึ่งคือ broadcast variables และที่สองคือ accumulators.

  • Broadcast variables - ใช้เพื่อกระจายมูลค่าจำนวนมากอย่างมีประสิทธิภาพ

  • Accumulators - ใช้เพื่อรวบรวมข้อมูลของคอลเลกชันเฉพาะ

ตัวแปรการออกอากาศ

ตัวแปร Broadcast ช่วยให้โปรแกรมเมอร์เก็บตัวแปรแบบอ่านอย่างเดียวที่แคชไว้ในแต่ละเครื่องแทนที่จะส่งสำเนาไปพร้อมกับงาน ตัวอย่างเช่นสามารถใช้เพื่อให้ทุกโหนดสำเนาของชุดข้อมูลอินพุตขนาดใหญ่ได้อย่างมีประสิทธิภาพ นอกจากนี้ Spark ยังพยายามกระจายตัวแปรออกอากาศโดยใช้อัลกอริทึมการออกอากาศที่มีประสิทธิภาพเพื่อลดต้นทุนการสื่อสาร

การดำเนินการของ Spark จะดำเนินการผ่านชุดของขั้นตอนโดยคั่นด้วยการดำเนินการแบบ "สุ่ม" แบบกระจาย Spark ออกอากาศข้อมูลทั่วไปที่จำเป็นสำหรับงานในแต่ละขั้นตอนโดยอัตโนมัติ

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

ตัวแปรออกอากาศถูกสร้างขึ้นจากตัวแปร v โทร SparkContext.broadcast(v). ตัวแปรการออกอากาศคือกระดาษห่อหุ้มรอบ ๆvและสามารถเข้าถึงค่าได้โดยเรียกไฟล์ valueวิธี. รหัสที่ระบุด้านล่างแสดงสิ่งนี้ -

scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))

Output -

broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

หลังจากสร้างตัวแปรออกอากาศแล้วควรใช้แทนค่า v ในฟังก์ชันใด ๆ ที่รันบนคลัสเตอร์ดังนั้น vจะไม่ถูกส่งไปยังโหนดมากกว่าหนึ่งครั้ง นอกจากนี้วัตถุv ไม่ควรแก้ไขหลังจากการออกอากาศเพื่อให้แน่ใจว่าโหนดทั้งหมดได้รับค่าตัวแปรออกอากาศเท่ากัน

ผู้สะสม

ตัวสะสมเป็นตัวแปรที่ "เพิ่ม" ผ่านการดำเนินการเชื่อมโยงเท่านั้นดังนั้นจึงสามารถรองรับได้อย่างมีประสิทธิภาพควบคู่กันไป สามารถใช้เพื่อใช้ตัวนับ (เช่นเดียวกับ MapReduce) หรือผลรวม Spark รองรับตัวสะสมประเภทตัวเลขและโปรแกรมเมอร์สามารถเพิ่มการรองรับสำหรับประเภทใหม่ได้ หากมีการสร้างตัวสะสมด้วยชื่อจะปรากฏในSpark’s UI. สิ่งนี้จะเป็นประโยชน์สำหรับการทำความเข้าใจความคืบหน้าของขั้นตอนการทำงาน (หมายเหตุ - ยังไม่รองรับ Python)

ตัวสะสมถูกสร้างขึ้นจากค่าเริ่มต้น v โทร SparkContext.accumulator(v). งานที่รันบนคลัสเตอร์สามารถเพิ่มเข้าไปได้โดยใช้addmethod หรือตัวดำเนินการ + = (ใน Scala และ Python) อย่างไรก็ตามพวกเขาไม่สามารถอ่านค่าของมันได้ เฉพาะโปรแกรมไดรเวอร์เท่านั้นที่สามารถอ่านค่าของตัวสะสมโดยใช้ไฟล์value วิธี.

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

scala> val accum = sc.accumulator(0) 
 
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)

หากคุณต้องการดูผลลัพธ์ของโค้ดด้านบนให้ใช้คำสั่งต่อไปนี้ -

scala> accum.value

เอาต์พุต

res2: Int = 10

การดำเนินการ RDD ตัวเลข

Spark ช่วยให้คุณดำเนินการต่างๆกับข้อมูลตัวเลขโดยใช้หนึ่งในวิธี API ที่กำหนดไว้ล่วงหน้า การดำเนินการเชิงตัวเลขของ Spark ถูกนำไปใช้กับอัลกอริทึมการสตรีมที่ช่วยให้สร้างโมเดลทีละองค์ประกอบ

การดำเนินการเหล่านี้คำนวณและส่งคืนเป็นไฟล์ StatusCounter วัตถุโดยการโทร status() วิธี.

ต่อไปนี้เป็นรายการวิธีการตัวเลขที่มีอยู่ใน StatusCounter.

ส. เลขที่ วิธีการและความหมาย
1

count()

จำนวนองค์ประกอบใน RDD

2

Mean()

ค่าเฉลี่ยขององค์ประกอบใน RDD

3

Sum()

มูลค่ารวมขององค์ประกอบใน RDD

4

Max()

ค่าสูงสุดขององค์ประกอบทั้งหมดใน RDD

5

Min()

ค่าต่ำสุดขององค์ประกอบทั้งหมดใน RDD

6

Variance()

ความแปรปรวนขององค์ประกอบ

7

Stdev()

ส่วนเบี่ยงเบนมาตรฐาน.

หากคุณต้องการใช้เพียงวิธีใดวิธีหนึ่งคุณสามารถเรียกใช้วิธีการที่เกี่ยวข้องได้โดยตรงบน RDD