การเขียนโปรแกรม 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