วัตถุประสงค์ของการสับและเรียงลำดับเฟสในตัวลดในแผนที่ลดการเขียนโปรแกรมคืออะไร?


113

ในการเขียนโปรแกรมแผนที่ลดระยะการลดจะมีการสับเรียงลำดับและลดเป็นส่วนย่อย การจัดเรียงเป็นเรื่องที่มีค่าใช้จ่ายสูง

วัตถุประสงค์ของการสับและเรียงลำดับเฟสในตัวลดในแผนที่ลดการเขียนโปรแกรมคืออะไร?


3
ฉันคิดว่าสิ่งนี้จำเป็นเสมอเนื่องจากเอาต์พุตจากตัวทำแผนที่เป็นอินพุตสำหรับตัวลดดังนั้นจึงถูกจัดเรียงตามคีย์สเปซจากนั้นแบ่งออกเป็นที่เก็บข้อมูลสำหรับอินพุตตัวลดแต่ละตัว
BasicHorizon

คำตอบ:


171

ก่อนอื่นshufflingคือกระบวนการถ่ายโอนข้อมูลจากเครื่องแมปไปยังตัวลดดังนั้นฉันคิดว่าเห็นได้ชัดว่าจำเป็นสำหรับตัวลดขนาดเนื่องจากมิฉะนั้นจะไม่สามารถรับอินพุตใด ๆ (หรืออินพุตจากผู้ทำแผนที่ทุกตัว) . การสุ่มสามารถเริ่มได้ก่อนที่เฟสของแผนที่จะเสร็จสิ้นเพื่อประหยัดเวลา นั่นเป็นเหตุผลที่คุณสามารถเห็นสถานะลดมากกว่า 0% (แต่น้อยกว่า 33%) เมื่อสถานะแผนที่ยังไม่ 100%

Sortingประหยัดเวลาสำหรับตัวลดช่วยให้แยกแยะได้ง่ายเมื่องานลดใหม่ควรเริ่มต้น เพียงแค่เริ่มงานการลดใหม่เมื่อคีย์ถัดไปในข้อมูลอินพุตที่เรียงลำดับแตกต่างจากก่อนหน้านี้ให้ใส่ลงไป งานลดแต่ละงานรับรายการคู่คีย์ - ค่า แต่ต้องเรียกใช้เมธอดลด () ซึ่งรับอินพุตรายการคีย์ (ค่า) ดังนั้นจึงต้องจัดกลุ่มค่าตามคีย์ เป็นเรื่องง่ายที่จะทำเช่นนั้นหากข้อมูลอินพุตถูกจัดเรียงไว้ล่วงหน้า (ในเครื่อง) ในเฟสแผนที่และเพียงแค่รวม - เรียงลำดับในเฟสลด (เนื่องจากตัวลดจะได้รับข้อมูลจากผู้ทำแผนที่จำนวนมาก)

Partitioningที่คุณพูดถึงในคำตอบข้อใดข้อหนึ่งเป็นกระบวนการที่แตกต่างกัน กำหนดว่าจะส่งตัวลดคู่ (คีย์, ค่า) คู่ผลลัพธ์ของเฟสแผนที่ Partitioner เริ่มต้นใช้การแฮชบนคีย์เพื่อแจกจ่ายให้กับงานลดขนาด แต่คุณสามารถแทนที่และใช้ Partitioner ที่คุณกำหนดเองได้

เป็นแหล่งที่ดีของข้อมูลสำหรับขั้นตอนเหล่านี้Yahoo กวดวิชา

การแสดงภาพกราฟิกที่ดีมีดังต่อไปนี้ (การสุ่มเรียกว่า "สำเนา" ในรูปนี้):

ใส่คำอธิบายภาพที่นี่

โปรดสังเกตว่าshufflingและsortingจะไม่ดำเนินการเลยหากคุณระบุตัวลดค่าศูนย์ (setNumReduceTasks (0)) จากนั้นงาน MapReduce จะหยุดที่เฟสของแผนที่และเฟสของแผนที่จะไม่รวมการเรียงลำดับใด ๆ (ดังนั้นแม้เฟสของแผนที่จะเร็วกว่า)

อัปเดต:เนื่องจากคุณกำลังมองหาสิ่งที่เป็นทางการมากขึ้นคุณสามารถอ่านหนังสือ "Hadoop: The Definitive Guide" ของ Tom White ได้ นี่คือส่วนที่น่าสนใจสำหรับคำถามของคุณ
Tom White เป็นผู้ให้บริการ Apache Hadoop ตั้งแต่เดือนกุมภาพันธ์ 2550 และเป็นสมาชิกของ Apache Software Foundation ดังนั้นฉันคิดว่ามันค่อนข้างน่าเชื่อถือและเป็นทางการ ...


"การเรียงลำดับช่วยประหยัดเวลาสำหรับตัวลดช่วยให้แยกแยะได้ง่ายว่าเมื่อใดควรเริ่มงานการลดใหม่เพียงแค่เริ่มงานลดใหม่เมื่อคีย์ถัดไปในข้อมูลอินพุตที่เรียงลำดับแตกต่างจากก่อนหน้านี้เพื่อให้ง่ายขึ้น" ฉันไม่ได้รับส่วนนี้ Mapper ใช้ตัวแบ่งพาร์ติชันเพื่อแบ่งการรั่วไหลออกเป็นพาร์ติชันในเครื่องจากนั้นแต่ละพาร์ติชันจะส่งไปยังการลด การจัดเรียงช่วยได้อย่างไร?
MaxNevermind

1
@MaxNevermind หากคุณมี x ลดงาน (พาร์ติชั่น) ไม่ได้หมายความว่าคุณจะเรียกใช้วิธีการลด () x ครั้ง จะถูกเรียกหนึ่งครั้งสำหรับทุกคีย์ที่แตกต่างกัน ดังนั้นงานลดหนึ่งสามารถเรียกใช้วิธีการลด () ได้หลายครั้ง
vefthym

"มันจะถูกเรียกหนึ่งครั้งสำหรับทุกคีย์ที่แตกต่างกัน" ทำไม? Mapper สร้างพาร์ติชันตามที่ต้องการ (ไม่จำเป็นต้องมีพาร์ติชั่นเดียวสำหรับทุกคีย์ที่แตกต่างกัน) จากนั้นแต่ละพาร์ติชันจะไปที่ตัวลดหรือไม่?
MaxNevermind

1
@MaxNevermind Mapper ส่งออกคีย์และค่ามันไม่ได้สร้างพาร์ติชัน พาร์ติชันถูกกำหนดโดยจำนวนงานลดที่ผู้ใช้กำหนดและการใช้งานพาร์ติชัน ผลลัพธ์ของ Mappers ทั้งหมดที่มีคีย์เดียวกันจะใช้วิธีการลด () เดียวกัน สิ่งนี้ไม่สามารถเปลี่ยนแปลงได้ แต่สิ่งที่สามารถเปลี่ยนแปลงได้คือคีย์อื่น ๆ (ถ้ามี) จะถูกวางไว้ในพาร์ติชันเดียวกันดังนั้นงานเดียวกันจะถูกจัดการ งานลดสามารถเรียกใช้ฟังก์ชันลด () ได้มากกว่าหนึ่งครั้ง แต่เพียงครั้งเดียวสำหรับทุกปุ่ม
vefthym

2
โอเคฉันคิดว่าฉันเข้าใจแล้ว ปัญหาของฉันคือฉันลืมไปว่าการลดใช้รายการของค่าเป็นอาร์กิวเมนต์ไม่ใช่แค่คู่คีย์ - ค่าเดียว ฉันคิดว่าคุณควรอธิบายสิ่งนี้อย่างละเอียดในคำตอบของคุณ: "งานลดแต่ละรายการจะมีรายการคู่คีย์ - ค่า แต่ต้องเรียกวิธีการลดซึ่งใช้คีย์ - ลิสต์ <value> ดังนั้นจึงต้องจัดกลุ่มค่าตามคีย์จึงทำได้ง่าย สิ่งที่ต้องทำหากข้อมูลอินพุตถูกจัดเรียงไว้ล่วงหน้าในขั้นตอนการทำแผนที่ "
MaxNevermind

42

มาทบทวนขั้นตอนสำคัญของโปรแกรม Mapreduce

เฟสแผนที่จะกระทำโดยการทำแผนที่ แมปเปอร์ทำงานบนคู่คีย์ / ค่าอินพุตที่ไม่ได้เรียงลำดับ ตัวทำแผนที่แต่ละตัวจะปล่อยคู่คีย์ / ค่าเอาต์พุตเป็นศูนย์หนึ่งหรือหลายคู่สำหรับคู่คีย์ / ค่าอินพุตแต่ละคู่

เฟสรวมจะกระทำโดย combiners ตัวรวมควรรวมคู่คีย์ / ค่าด้วยคีย์เดียวกัน Combiner แต่ละตัวอาจทำงานเป็นศูนย์หนึ่งครั้งหรือหลายครั้ง

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

partitionerตัดสินใจที่ลดจะได้รับค่าคีย์คู่โดยเฉพาะอย่างยิ่ง

ตัวลดจะได้รับคู่คีย์ที่เรียงลำดับ / [รายการค่า] โดยเรียงตามคีย์ รายการค่าประกอบด้วยค่าทั้งหมดที่มีคีย์เดียวกันที่สร้างโดยผู้ทำแผนที่ แต่ละส่งเสียงลดศูนย์หนึ่งหรือหลายเอาท์พุทคู่คีย์ / ค่าสำหรับแต่ละคีย์อินพุต / คู่ค่า

ดูบทความ javacodegeeks นี้โดย Maria Jurcovicova และบทความmssqltipsโดย Datta เพื่อความเข้าใจที่ดีขึ้น

ด้านล่างนี้คือภาพจากบทความsafaribooksonline

ใส่คำอธิบายภาพที่นี่


ฉันคิดว่ามีการพิมพ์ผิดในภาพ (ซึ่งฉันรู้ว่าคัดลอกมาที่นี่) ผมเชื่อว่าieสายภายใต้การลดขนาดและ Output isจริงควรจะเป็น
Jeff Evans

32

ฉันคิดว่าจะเพิ่มบางจุดที่ขาดหายไปในคำตอบด้านบน แผนภาพที่นำมาจากที่นี่ระบุอย่างชัดเจนว่าเกิดอะไรขึ้น

ใส่คำอธิบายภาพที่นี่

ถ้าฉันระบุอีกครั้งถึงจุดประสงค์ที่แท้จริงของ

  • แยก:ปรับปรุงการประมวลผลแบบขนานโดยการกระจายภาระการประมวลผลไปยังโหนดต่างๆ (Mappers) ซึ่งจะช่วยประหยัดเวลาในการประมวลผลโดยรวม

  • รวม:ลดขนาดเอาต์พุตของ Mapper แต่ละตัว จะช่วยประหยัดเวลาในการย้ายข้อมูลจากโหนดหนึ่งไปยังอีกโหนดหนึ่ง

  • เรียงลำดับ (สลับและเรียงลำดับ):ทำให้เวลาทำงานสามารถกำหนดเวลา (วางไข่ / เริ่มต้น) ตัวลดใหม่ได้ง่ายโดยที่ในขณะที่ดำเนินการตามรายการรายการที่เรียงลำดับเมื่อใดก็ตามที่คีย์ปัจจุบันแตกต่างจากก่อนหน้านี้ก็สามารถวางไข่ตัวลดใหม่ได้ .


ขั้นตอนของพาร์ติชันจะมาอยู่ที่ไหนในกราฟนี้ หลังจากแผนที่และก่อนรวม?
Joel

@ Joel ฉันหวังว่าคุณจะอ้างถึงขั้นตอน 'แยก'?
Supun Wijerathne

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

1
@ โจเอลฉันไม่ค่อยชัดเจนในสิ่งที่คุณตั้งใจจะอธิบาย โดยสรุปลำดับขั้นตอนที่แน่นอนอาจเป็นปัญหาเฉพาะ ฉันสามารถพูดได้ว่าสำหรับบางสถานการณ์แม้จะไม่จำเป็นต้องเรียงลำดับ กลับมาที่ข้อมูลที่คุณป้อนหากฉันพูดถึงตัวอย่างการนับจำนวนคำง่ายๆข้างต้นโดยเฉพาะฉันไม่เห็นความจำเป็นใด ๆ สำหรับการแบ่งพาร์ติชันดังกล่าวเพื่อตัดสินใจตัวลด ที่นี่มันค่อนข้างตรงไปตรงมาเพื่อลดการวางไข่ต่อคีย์ แต่ฉันเดาได้ว่าประเด็นของคุณสามารถใช้ได้กับบางสถานการณ์ ตรงไปตรงมาฉันไม่มีความคิดที่ชัดเจนเกี่ยวกับเรื่องนี้
Supun Wijerathne

4

ข้อกำหนดการประมวลผลข้อมูลบางอย่างไม่จำเป็นต้องเรียงลำดับเลย Syncsort ทำการเรียงลำดับใน Hadoop แบบเสียบได้ นี่คือบล็อกที่ดีจากพวกเขาในการจัดเรียง กระบวนการของการย้ายข้อมูลจากผู้ทำแผนที่เพื่อ reducers ที่เรียกว่าสับตรวจสอบนี้บทความสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเดียวกัน


2

ฉันคิดว่าสิ่งนี้จำเป็นเสมอเนื่องจากเอาต์พุตจากตัวทำแผนที่เป็นอินพุตสำหรับตัวลดดังนั้นจึงถูกจัดเรียงตามคีย์สเปซจากนั้นแบ่งออกเป็นที่เก็บข้อมูลสำหรับอินพุตตัวลดแต่ละตัว คุณต้องการให้แน่ใจว่าค่าเดียวกันทั้งหมดของคีย์จะอยู่ในที่เก็บข้อมูลเดียวกันไปที่ตัวลดเพื่อให้ค่าเหล่านั้นลดลงพร้อมกัน ไม่มีจุดใดที่ส่ง K1, V2 และ K1, V4 ไปยังตัวลดที่แตกต่างกันเนื่องจากจำเป็นต้องอยู่ร่วมกันเพื่อที่จะลดลง

พยายามอธิบายอย่างง่ายที่สุด


หากเราต้องการส่ง k1, v1 และ k1, v4 ไปยังตัวลดเดียวกันเราสามารถทำการสับได้ แล้วจุดประสงค์ของการจัดเรียงคืออะไร?
Nithin K Anil

ทำการเรียงลำดับด้วยเหตุผลหลายประการสาเหตุหนึ่งคือเมื่องาน MapReduce ส่งคู่ KV ทั้งหมดไปยังตัวลดหากอินพุตไม่ได้เรียงลำดับจะต้องสแกนเอาต์พุต Mapper ทั้งหมดเพื่อรับทุกอินสแตนซ์ของ K1, VX . ในขณะที่หากเอาต์พุต Mapper ถูกจัดเรียงทันทีที่ K2 VX จะถูกหยิบขึ้นมาคุณจะรู้ว่า K1, VX ทั้งหมดถูกหยิบขึ้นมาและชุดนั้นสามารถส่งออกไปยังตัวลดเพื่อประมวลผลประโยชน์ของสิ่งนี้คือคุณไม่ทำ ต้องรอให้ตัวลดทุกตัวพร้อมเพื่อให้แต่ละตัวลดลง
BasicHorizon

นอกจากนี้เมื่อพูดถึงการรวมถ้าคุณระบุว่าคุณต้องการรวม K1 ทั้งหมด V1 หากอินพุตไปยังตัวลดถูกจัดเรียงทันทีที่ตัวลดรับบน K2 V2 จะรู้ว่าไม่มีอินสแตนซ์ของ K1, V1 อีกต่อไป สามารถเสร็จสิ้นการรวมในขณะที่หากไม่ได้จัดเรียงอินพุตตัวลดจะต้องสแกนอินพุตทั้งหมดสำหรับ K1, V1
BasicHorizon

2

การสับเป็นกระบวนการที่ข้อมูลระดับกลางจากผู้ทำแผนที่จะถูกโอนไปยังตัวลด 0,1 หรือมากกว่า ตัวลดแต่ละตัวได้รับ 1 คีย์ขึ้นไปและค่าที่เกี่ยวข้องขึ้นอยู่กับจำนวนตัวลด (สำหรับโหลดที่สมดุล) นอกจากนี้ค่าที่เกี่ยวข้องกับแต่ละคีย์จะถูกจัดเรียงแบบโลคัล


0

มีเพียงสองสิ่งที่ MapReduce ทำ NATIVELY: Sort และ (ดำเนินการโดยเรียงลำดับ) GroupBy ที่ปรับขนาดได้

แอปพลิเคชันและรูปแบบการออกแบบส่วนใหญ่บน MapReduce สร้างขึ้นจากการดำเนินการทั้งสองนี้ซึ่งจัดทำโดยการสุ่มและการเรียงลำดับ


0

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


0

ใน Mapreduce มีวลีสำคัญสองคำที่เรียกว่าMapperและตัวลดทั้งสองมีความสำคัญเกินไป แต่ตัวลดมีผลบังคับ ตัวลดในบางโปรแกรมเป็นทางเลือก ตอนนี้มาถึงคำถามของคุณ การสลับและการเรียงลำดับเป็นการดำเนินการที่สำคัญสองอย่างใน Mapreduce First Hadoop framework ใช้ข้อมูลที่มีโครงสร้าง / ไม่มีโครงสร้างและแยกข้อมูลออกเป็น Key, Value

ตอนนี้โปรแกรม Mapper แยกและจัดเรียงข้อมูลเป็นคีย์และค่าที่จะประมวลผล สร้างคีย์ 2 และค่า 2 ค่า ค่านี้ควรประมวลผลและจัดเรียงใหม่เพื่อให้ได้โซลูชันที่ต้องการ ตอนนี้การสุ่มและการเรียงลำดับเสร็จสิ้นในระบบโลคัลของคุณ (Framework ดูแลมัน) และดำเนินการในระบบโลคัลหลังจากกระบวนการเฟรมเวิร์กล้างข้อมูลในระบบโลคัล ตกลง

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

K1, V1 -> K2, V2 (เราจะเขียนโปรแกรม Mapper), -> K2, V '(ที่นี่สับเปลี่ยนและทำให้ข้อมูลอ่อนลง) -> K3, V3 สร้างเอาต์พุต K4, V4

โปรดทราบว่าขั้นตอนเหล่านี้ทั้งหมดเป็นการดำเนินการเชิงตรรกะเท่านั้นไม่เปลี่ยนแปลงข้อมูลเดิม

คำถามของคุณ: จุดประสงค์ของการสับและเรียงลำดับเฟสในตัวลดในแผนที่ลดการเขียนโปรแกรมคืออะไร?

คำตอบสั้น ๆ : เพื่อประมวลผลข้อมูลเพื่อให้ได้ผลลัพธ์ที่ต้องการ การสับเป็นการรวมข้อมูลการลดจะได้รับผลลัพธ์ที่คาดหวัง

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