ในการเขียนโปรแกรมแผนที่ลดระยะการลดจะมีการสับเรียงลำดับและลดเป็นส่วนย่อย การจัดเรียงเป็นเรื่องที่มีค่าใช้จ่ายสูง
วัตถุประสงค์ของการสับและเรียงลำดับเฟสในตัวลดในแผนที่ลดการเขียนโปรแกรมคืออะไร?
ในการเขียนโปรแกรมแผนที่ลดระยะการลดจะมีการสับเรียงลำดับและลดเป็นส่วนย่อย การจัดเรียงเป็นเรื่องที่มีค่าใช้จ่ายสูง
วัตถุประสงค์ของการสับและเรียงลำดับเฟสในตัวลดในแผนที่ลดการเขียนโปรแกรมคืออะไร?
คำตอบ:
ก่อนอื่น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 ดังนั้นฉันคิดว่ามันค่อนข้างน่าเชื่อถือและเป็นทางการ ...
มาทบทวนขั้นตอนสำคัญของโปรแกรม Mapreduce
เฟสแผนที่จะกระทำโดยการทำแผนที่ แมปเปอร์ทำงานบนคู่คีย์ / ค่าอินพุตที่ไม่ได้เรียงลำดับ ตัวทำแผนที่แต่ละตัวจะปล่อยคู่คีย์ / ค่าเอาต์พุตเป็นศูนย์หนึ่งหรือหลายคู่สำหรับคู่คีย์ / ค่าอินพุตแต่ละคู่
เฟสรวมจะกระทำโดย combiners ตัวรวมควรรวมคู่คีย์ / ค่าด้วยคีย์เดียวกัน Combiner แต่ละตัวอาจทำงานเป็นศูนย์หนึ่งครั้งหรือหลายครั้ง
ขั้นตอนการสับเปลี่ยนและการเรียงลำดับทำได้โดยเฟรมเวิร์ก ข้อมูลจากผู้ทำแผนที่ทั้งหมดจะถูกจัดกลุ่มตามคีย์แยกเป็นตัวลดและจัดเรียงตามคีย์ ตัวลดแต่ละตัวได้รับค่าทั้งหมดที่เกี่ยวข้องกับคีย์เดียวกัน โปรแกรมเมอร์อาจจัดหาฟังก์ชันเปรียบเทียบแบบกำหนดเองสำหรับการเรียงลำดับและพาร์ทิชันสำหรับแยกข้อมูล
partitionerตัดสินใจที่ลดจะได้รับค่าคีย์คู่โดยเฉพาะอย่างยิ่ง
ตัวลดจะได้รับคู่คีย์ที่เรียงลำดับ / [รายการค่า] โดยเรียงตามคีย์ รายการค่าประกอบด้วยค่าทั้งหมดที่มีคีย์เดียวกันที่สร้างโดยผู้ทำแผนที่ แต่ละส่งเสียงลดศูนย์หนึ่งหรือหลายเอาท์พุทคู่คีย์ / ค่าสำหรับแต่ละคีย์อินพุต / คู่ค่า
ดูบทความ javacodegeeks นี้โดย Maria Jurcovicova และบทความmssqltipsโดย Datta เพื่อความเข้าใจที่ดีขึ้น
ด้านล่างนี้คือภาพจากบทความsafaribooksonline
ie
สายภายใต้การลดขนาดและ Output is
จริงควรจะเป็น
ฉันคิดว่าจะเพิ่มบางจุดที่ขาดหายไปในคำตอบด้านบน แผนภาพที่นำมาจากที่นี่ระบุอย่างชัดเจนว่าเกิดอะไรขึ้น
ถ้าฉันระบุอีกครั้งถึงจุดประสงค์ที่แท้จริงของ
แยก:ปรับปรุงการประมวลผลแบบขนานโดยการกระจายภาระการประมวลผลไปยังโหนดต่างๆ (Mappers) ซึ่งจะช่วยประหยัดเวลาในการประมวลผลโดยรวม
รวม:ลดขนาดเอาต์พุตของ Mapper แต่ละตัว จะช่วยประหยัดเวลาในการย้ายข้อมูลจากโหนดหนึ่งไปยังอีกโหนดหนึ่ง
เรียงลำดับ (สลับและเรียงลำดับ):ทำให้เวลาทำงานสามารถกำหนดเวลา (วางไข่ / เริ่มต้น) ตัวลดใหม่ได้ง่ายโดยที่ในขณะที่ดำเนินการตามรายการรายการที่เรียงลำดับเมื่อใดก็ตามที่คีย์ปัจจุบันแตกต่างจากก่อนหน้านี้ก็สามารถวางไข่ตัวลดใหม่ได้ .
ฉันคิดว่าสิ่งนี้จำเป็นเสมอเนื่องจากเอาต์พุตจากตัวทำแผนที่เป็นอินพุตสำหรับตัวลดดังนั้นจึงถูกจัดเรียงตามคีย์สเปซจากนั้นแบ่งออกเป็นที่เก็บข้อมูลสำหรับอินพุตตัวลดแต่ละตัว คุณต้องการให้แน่ใจว่าค่าเดียวกันทั้งหมดของคีย์จะอยู่ในที่เก็บข้อมูลเดียวกันไปที่ตัวลดเพื่อให้ค่าเหล่านั้นลดลงพร้อมกัน ไม่มีจุดใดที่ส่ง K1, V2 และ K1, V4 ไปยังตัวลดที่แตกต่างกันเนื่องจากจำเป็นต้องอยู่ร่วมกันเพื่อที่จะลดลง
พยายามอธิบายอย่างง่ายที่สุด
การสับเป็นกระบวนการที่ข้อมูลระดับกลางจากผู้ทำแผนที่จะถูกโอนไปยังตัวลด 0,1 หรือมากกว่า ตัวลดแต่ละตัวได้รับ 1 คีย์ขึ้นไปและค่าที่เกี่ยวข้องขึ้นอยู่กับจำนวนตัวลด (สำหรับโหลดที่สมดุล) นอกจากนี้ค่าที่เกี่ยวข้องกับแต่ละคีย์จะถูกจัดเรียงแบบโลคัล
มีเพียงสองสิ่งที่ MapReduce ทำ NATIVELY: Sort และ (ดำเนินการโดยเรียงลำดับ) GroupBy ที่ปรับขนาดได้
แอปพลิเคชันและรูปแบบการออกแบบส่วนใหญ่บน MapReduce สร้างขึ้นจากการดำเนินการทั้งสองนี้ซึ่งจัดทำโดยการสุ่มและการเรียงลำดับ
นี่คือการอ่านที่ดี หวังว่าจะช่วยได้ ในแง่ของการจัดเรียงที่คุณเกี่ยวข้องฉันคิดว่ามันมีไว้สำหรับการดำเนินการผสานในขั้นตอนสุดท้ายของแผนที่ เมื่อการดำเนินการแผนที่เสร็จสิ้นและจำเป็นต้องเขียนผลลัพธ์ลงในโลคัลดิสก์การผสานหลายรายการจะดำเนินการบนตัวแยกที่สร้างจากบัฟเฟอร์ และสำหรับการดำเนินการผสานการเรียงลำดับแต่ละพาร์ติชันในขั้นสูงจะเป็นประโยชน์
ใน 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
โปรดทราบว่าขั้นตอนเหล่านี้ทั้งหมดเป็นการดำเนินการเชิงตรรกะเท่านั้นไม่เปลี่ยนแปลงข้อมูลเดิม
คำถามของคุณ: จุดประสงค์ของการสับและเรียงลำดับเฟสในตัวลดในแผนที่ลดการเขียนโปรแกรมคืออะไร?
คำตอบสั้น ๆ : เพื่อประมวลผลข้อมูลเพื่อให้ได้ผลลัพธ์ที่ต้องการ การสับเป็นการรวมข้อมูลการลดจะได้รับผลลัพธ์ที่คาดหวัง