ฉันได้อ่านเกี่ยวกับ MapReduce มาระยะหนึ่งแล้ว แต่สิ่งที่ฉันไม่เข้าใจคือคนที่ตัดสินใจใช้ MapReduce (หรือไม่ใช้)
ฉันหมายถึงรูปแบบของปัญหาที่บ่งบอกว่าสามารถใช้ MapReduce ได้
ฉันได้อ่านเกี่ยวกับ MapReduce มาระยะหนึ่งแล้ว แต่สิ่งที่ฉันไม่เข้าใจคือคนที่ตัดสินใจใช้ MapReduce (หรือไม่ใช้)
ฉันหมายถึงรูปแบบของปัญหาที่บ่งบอกว่าสามารถใช้ MapReduce ได้
คำตอบ:
มันเป็นปัญหาที่ใหญ่ แต่ก็ไม่ยาก พนักงานขายที่เดินทางขึ้นอยู่กับระยะทางระหว่างเมืองคู่ใด ๆ ที่สำคัญดังนั้นในขณะที่สามารถแบ่งออกเป็นหลายส่วนผลลัพธ์บางส่วนไม่สามารถรวมกันอีกครั้งเพื่อให้ทางออกที่ดีที่สุดทั่วโลกปรากฏ (ดีอาจไม่ถ้าคุณรู้วิธี กรุณาสมัครเหรียญฟิลด์ของคุณตอนนี้)
ในทางกลับกันการนับความถี่ของคำในคลังข้อมูลขนาดยักษ์นั้นสามารถทำการแบ่งพาร์ติชันได้เล็กน้อยและสามารถทำการคอมไพล์ซ้ำได้อีกเล็กน้อย (คุณเพียงแค่เพิ่มเวกเตอร์ที่คำนวณสำหรับส่วนของคลังข้อมูล) ดังนั้นการลดแผนที่จึงเป็นทางออกที่ชัดเจน
ในทางปฏิบัติปัญหาที่เกิดขึ้นมีแนวโน้มที่จะสามารถ recombinable ได้ง่ายกว่าไม่ดังนั้นการตัดสินใจว่าจะทำขนานงานหรือไม่ต้องทำอะไรกับงานที่มีขนาดใหญ่และไม่ยากเท่าไหร่
สามารถแก้ไขปัญหาได้อย่างมีประสิทธิภาพโดยใช้การคำนวณแบบกระจายหรือไม่
หากคำตอบสำหรับคำถามนี้คือใช่แสดงว่าคุณมีปัญหาของผู้สมัครสำหรับ MapReduce นั่นเป็นเพราะรูปแบบของปัญหาทำให้ตัวเองถูกแยกออกเป็นปัญหาเล็ก ๆ ที่แยกกันอยู่
งานของคุณ: แยกวิเคราะห์หนังสือเล่มนี้
ตัวอย่างทำงานได้ดีในการลบล้างสิ่งนี้ คุณมีเอกสารขนาดใหญ่ ( Moby Dick โดย Herman Melville ) และงานของคุณคือการวิเคราะห์ความถี่ของคำทั้งหมดที่ใช้
วิธีการต่อเนื่อง
คุณสามารถทำสิ่งนี้ได้ตามลำดับโดยการนำเครื่องจักรที่เร็วที่สุดของคุณ (คุณนอนราบไปรอบ ๆ ) และวิ่งข้ามข้อความตั้งแต่ต้นจนจบรักษาแผนที่แฮชของทุกคำที่คุณพบ (ปุ่ม) และเพิ่มความถี่ (ค่า) ทุกครั้ง คุณแยกวิเคราะห์คำ เรียบง่ายตรงไปตรงมาและช้า
วิธีการ MapReduce
เมื่อเข้าใกล้สิ่งนี้จากมุมมองที่แตกต่างคุณสังเกตว่าคุณมีเครื่องจักรสำรองเหล่านี้วางอยู่รอบ ๆ และคุณสามารถแบ่งงานนี้ออกเป็นชิ้น ๆ ให้เครื่องแต่ละบล็อกมีขนาด 1Mb เพื่อแยกวิเคราะห์ลงในแผนที่แฮชจากนั้นเปรียบเทียบแผนที่แฮชทั้งหมดจากแต่ละเครื่องเป็นผลลัพธ์เดียว นี่เป็นโซลูชั่น MapReduce แบบชั้น
กระบวนการอ่านบรรทัดข้อความและรวบรวมคำคือขั้นตอนแผนที่ (คุณสร้างแผนที่อย่างง่ายที่แสดงคำในบรรทัดที่มีความถี่ 1,2,3 ฯลฯ ) จากนั้นขั้นตอนการลดคือเมื่อแต่ละเครื่องเรียงแถว แผนที่เป็นแผนที่รวมเดียว
โซลูชันโดยรวมนั้นมาจากขั้นตอนการลดเพิ่มเติมซึ่งแผนที่รวมทั้งหมดจะถูกรวมเข้าด้วยกัน (คำนั้นอีกครั้ง) ลงในแผนที่สุดท้าย ซับซ้อนมากขึ้นเล็กน้อยขนานกันอย่างหนาแน่นและรวดเร็ว
สรุป
ดังนั้นเพื่อสรุปว่าหากปัญหาของคุณทำให้ตัวเองถูกแทนที่ด้วยคีย์ค่าการดำเนินการรวมในค่าเหล่านั้นแยกคุณก็มีปัญหาในการสมัครสำหรับ MapReduce
รูปแบบ MapReduce ถูกนำมาจากโลกของการเขียนโปรแกรมการทำงาน มันเป็นกระบวนการที่ใช้สิ่งที่เรียกว่า catamorphism บนโครงสร้างข้อมูลแบบขนาน โปรแกรมเมอร์หน้าที่ใช้ catamorphisms สำหรับการแปลงหรือการสรุปง่ายๆ
สมมติว่าข้อมูลของคุณเป็นต้นไม้ปัจจัยในการตัดสินใจคือคุณสามารถคำนวณค่าสำหรับโหนดโดยใช้เฉพาะข้อมูลที่มีอยู่ในโหนดนั้นและค่าที่คำนวณได้สำหรับลูก ๆ ของมัน
ตัวอย่างเช่นคุณสามารถคำนวณขนาดของต้นไม้โดยใช้ catamorphism คุณจะคำนวณผลรวมของค่าที่คำนวณได้สำหรับเด็กทุกคนบวกหนึ่ง
WPIนี้- แอปพลิเคชั่นแผนที่ลด (ppt)อาจเป็นที่สนใจของคุณ มันกล่าวถึงการใช้งานที่แตกต่างกันของ MR และเป็นหนึ่งในกรณีที่กล่าวถึงมันแสดงให้เห็นว่าการใช้อินสแตนซ์ 100 EC2 และ 24 ชั่วโมงที่ New York Times สามารถแปลงบทความที่สแกน 4TB เป็น 1.5TB ของเอกสาร PDF
อีกตัวอย่างหนึ่งที่ MR ช่วยในการเร่งประสิทธิภาพคือ: Aster - SQL Map Reduceแสดงกรณีศึกษาบางส่วนเกี่ยวกับเทคโนโลยี SQL-Map ลดรวมถึงการตรวจจับการฉ้อโกงการแปลงและอื่น ๆ
Map / Reduce เป็นรูปแบบเฉพาะของอัลกอริทึมเฉพาะ คุณใช้เพื่อแปลงชุดข้อมูลขนาดใหญ่หนึ่งชุดเป็นชุดข้อมูลอื่น (ชุดข้อมูลผลลัพธ์อาจมีหรือมีขนาดไม่ใหญ่มาก) หากคุณไม่ต้องการให้มีการตั้งค่าเอาต์พุตข้อมูลสแตติกอันเป็นผลมาจากการป้อนข้อมูลแบบสแตติกแผนที่ / ย่อขนาดจะไม่เหมาะสม แผนที่ / ย่อสามารถบอกคุณได้ว่าจอห์นสมิ ธ มีกี่เล่มในสมุดโทรศัพท์แมนฮัตตัน แต่มันไม่เหมาะที่จะสร้างเว็บเซิร์ฟเวอร์
วิธีแผนที่ / ลดงานคือ:
ผลลัพธ์คือรายการของคู่ (k1, v1) จะถูกแปลงเป็นรายการของ (v3) s (แน่นอนค่า "v3" อาจเป็นคอมโพสิตที่มี k2 ซึ่งสามารถกำหนดให้เท่ากับ k1)
ดังนั้นคุณใช้มัน:
หากคุณมีข้อมูลมากมายที่จะเริ่มต้นด้วยการรันข้อมูลทั้งหมดตามลำดับผ่านเซิร์ฟเวอร์หนึ่งหรือสองเซิร์ฟเวอร์อาจใช้เวลานานเกินไปและ
คุณสามารถเข้าใจถึงข้อมูลเอาต์พุตว่าเป็นรายการของค่าหรือคู่ของค่าคีย์ (โดยทั่วไปไม่ยากเกินไปเมื่อคุณจำ "คีย์" เท่านั้นหมายถึง "ฉลากเฉพาะ") และ
ไม่ว่าคุณจะมีความสัมพันธ์แบบใดคุณมั่นใจได้ว่าข้อมูลอินพุตแต่ละส่วนจะมีผลต่อค่าเอาต์พุตสำหรับคีย์เอาต์พุตหนึ่งคีย์เท่านั้น
หากข้อมูลทั้งหมดของคุณสามารถประมวลผลตามลำดับโดยเซิร์ฟเวอร์เดียวตั้งแต่นั้นเป็นกระบวนทัศน์การคำนวณที่โดดเด่น (เซิร์ฟเวอร์คนที่ถูกสร้างขึ้นสำหรับและโปรแกรมเมอร์ได้รับการฝึกฝนในการใช้) ให้ใช้เซิร์ฟเวอร์เดียว
สเตจแผนที่จะต้องแบ่งพาร์ติชันข้อมูลอินพุตทั้งหมดโดยใช้คีย์เอาต์พุต ไม่จำเป็นต้องสร้างมูลค่าส่งออกที่เกี่ยวข้องกับเอาท์พุทคีย์ (ซึ่งดำเนินการโดยขั้นตอนลดขนาด) แต่จะต้องกำหนดคู่ค่าคีย์อินพุตแต่ละคู่ให้มีส่วนร่วมกับค่าของคีย์เอาต์พุตหนึ่งค่า หากข้อมูลมีความสัมพันธ์กันมากเกินไปการลดขนาดแผนที่อาจไม่สามารถจัดการกับปัญหาได้ ในอีกทางหนึ่งอาจเป็นเพราะคุณจำเป็นต้องใช้แผนที่หลายรอบ / ลด
หากคุณไม่สามารถหาวิธีเปลี่ยนการแปลงข้อมูลเป็นแผนที่ / ลดได้แน่นอนว่าไม่ใช่วิธีแก้ปัญหา
มีศิลปะที่แท้จริงในการหาว่าปัญหาสามารถย่อยสลายเป็นสิ่งที่ Map / Reduce สามารถจัดการได้ ตัวอย่างเช่น v1 และ v2 อาจไม่อยู่ในชุดข้อมูลอินพุตหรือเอาต์พุตเลย หากคุณเพียงต้องการนับรายการที่ไม่ซ้ำในข้อมูลอินพุตดังนั้น k1 = k2 = รายการและ v1 = v2 = 1 หรือ 0 หรืออะไรก็ได้ ลดการสร้าง v3 เพียงผลรวมของจำนวน k2 ที่ได้รับ
ดังนั้นจึงเป็นการยากที่จะบอกว่าการแปลงข้อมูลไม่สามารถทำได้โดยใช้แผนที่ / ลด แต่สิ่งที่กล่าวมาข้างต้นให้คำแนะนำบางอย่างแก่คุณ
MapReduce ทำงานกับปัญหาใด ๆ ที่ประกอบด้วยฟังก์ชัน 2 ฟังก์ชันในระดับที่เป็นนามธรรม ฟังก์ชั่นแรกถูกนำไปใช้กับแต่ละรายการในชุดอินพุตและฟังก์ชั่นที่สองรวมผลลัพธ์
ดังนั้นเมื่อใดก็ตามที่คุณต้องการได้รับ (1) ผลลัพธ์จาก (n) อินพุตและอินพุตทั้งหมดสามารถตรวจสอบ / ใช้งานโดย (1) ฟังก์ชั่นคุณสามารถใช้ MapReduce อีกครั้งนี่เป็นระดับเฉพาะของนามธรรม ฟังก์ชั่น (1) อาจเป็นฟังก์ชั่นการจัดกลุ่มที่ตรวจสอบอินพุตและตัดสินใจว่าจะใช้ฟังก์ชั่นอื่น ๆ อีกมากมาย
สิ่งนี้มีประโยชน์เมื่อคุณไม่ทราบล่วงหน้าว่าคุณจะป้อนข้อมูลเข้าจำนวนเท่าใดเมื่อคุณต้องการแบ่งปัน "หน่วยงาน" ที่รอบคอบหรือเมื่อคุณต้องการให้ผลตอบแทนเพียงครั้งเดียวเพื่อแสดงผลลัพธ์ทั้งหมด (IE ใช้การทดสอบห้าพันหน่วย) และถ้าน้อยกว่า x% ล้มเหลวให้ส่งคืนความสำเร็จ)
คำตอบส่วนใหญ่ที่นี่ดูเหมือนจะเป็นรูปแบบของการอธิบายสิ่งที่ลดแผนที่ทำซึ่งถูกต้อง แต่เพื่อตอบคำถามซึ่งรูปแบบใดที่จะเป็นสัญญาณว่าคุณสามารถใช้การลดแผนที่ได้นั้นไม่ได้รับการแก้ไข
หากไร้เดียงสาไม่ทำงานการใช้งานของปัญหาที่คุณกำลังดูเกี่ยวข้องกับการวนรอบบางสิ่งบางอย่างแล้วปรับปรุงบางสิ่งนอกวงด้วยสถานะบางอย่างจากภายในวงโอกาสที่คุณมีสิ่งที่พอร์ตที่ดีในการทำแผนที่ลด โดยเฉพาะอย่างยิ่งถ้าคุณสามารถทำให้การอัพเดตสถานะกลางเป็นฟังก์ชั่นที่ใช้งานได้กับพารามิเตอร์เพียงสองตัวและสามารถรับประกันได้ว่าฟังก์ชั่นนี้จะสลับกันและเชื่อมโยงกัน
เหตุผลที่คุณอาจต้องการใช้การย่อแผนที่ถ้าเป็นจริงนั้นมีสองเท่า: 1) มันอาจจะสะอาดกว่าและทดสอบและแก้ไขได้ง่ายขึ้นถ้าคุณแบ่งสิ่งต่าง ๆ ลงในแผนที่และลดฟังก์ชั่น 2) ฟังก์ชั่นลดแผนที่ไม่มีสถานะและอาจทำงานพร้อมกันซึ่งจะช่วยเพิ่มความเร็วหากคุณมีซีพียูหลายตัวและบางอย่างเช่น hadoop หรือประกายไฟที่ใช้ในการรันสิ่งต่างๆในคลัสเตอร์
นี่เป็นสิ่งที่ดีถ้าคุณวนซ้ำหลาย ๆ อย่าง แต่ระยะทางของคุณอาจแตกต่างกันไปขึ้นอยู่กับความซับซ้อนของแผนที่ / การลดขนาด มันเป็นเรื่องธรรมดาที่จะจบลงด้วยการลดลงของลำดับตามลำดับหรือแผนผังการลดทอนแผนที่ซึ่งท้ายที่สุดแล้วทุกอย่างยังคงมีปัญหาในขั้นตอนการลดความซับซ้อนที่ปลายโซ่ ตัวอย่างเช่นอัลกอริธึมกราฟจำนวนมากนั้นยากต่อการปรับขนาดอย่างมีประสิทธิภาพด้วยการลดแผนที่
ตัวอย่างที่ง่ายที่สุดที่ใช้งานได้ดีกับการลดแผนที่คือการนับสิ่งของซึ่งเป็นการลดราคาที่ถูกมาก นี่คือเหตุผลที่การนับจำนวนคำเป็นตัวอย่างที่ใช้กันบ่อยในการลดแผนที่ คุณสามารถคาดหวังความยืดหยุ่นเชิงเส้นของประสิทธิภาพการทำงานด้วย usecase: ซีพียูที่คุณเพิ่มทุกตัวทำให้มันเร็วขึ้น
หากคุณเขียนโปรแกรมใช้งานได้มากคุณจะเริ่มทำงานในสถานการณ์ที่เรียกใช้แผนที่ทั่วไปและลดขนาดลง คุณอาจเห็นพวกเขาในการเขียนโปรแกรมที่จำเป็น แต่ไม่รู้จักพวกเขาหลังหน้ากากของลูปและตัวสะสม
เป็นตัวอย่างหนึ่งที่เพิ่งเกิดขึ้นกับฉันเมื่อเร็ว ๆ นี้ฉันได้ทำงานกับ parser ใน Haskell ในการทดสอบตัวแยกวิเคราะห์ฉันจะปั๊มรายการของตัวแยกส่วนของสตริงผ่านตัวแยกวิเคราะห์แล้วฉันต้องการรับสายเดี่ยวที่ฉันสามารถส่งออกผลลัพธ์เพื่อดูว่าแยกวิเคราะห์ได้ถูกต้องหรือไม่ ดังนั้นดูเหมือนว่า:
--my initial set of test data, a list
tests = ["string1", "string2", "string3", ...]
--Map Step: turn strings into parsed results
--note the type, which demonstrates the map
applyParser :: [String] -> [Token]
--The actual function
applyParser input = map parser input
--Second map, turn tokens into output
showTokens :: [Token] -> [String]
showTokens t = map show t
--Reduce step, concat the results
combineResults :: [String] -> String
--In haskell, reduce is the foldl function, which takes an operation to fold with, a starting element, and a list to fold on
combineResults strings = foldl concat "" strings
--Finished program
testParser = print (combineResults(showTokens(applyParser tests)))
แน่นอนนี่เป็นเพียงการสอน รหัสจริงของฉันมีลักษณะแตกต่างกันเล็กน้อยและใช้ฟังก์ชั่นภายในมากขึ้น (เช่นfold concat
ไม่จำเป็นต้องตั้งแต่ Haskell อยู่แล้วรวมถึงunlines
ที่ไม่[String]->String
) ประเด็นหลักของฉันคือฉันไม่ได้คาดหวังว่าจะใช้แผนที่ / ลดขนาดเมื่อเริ่มต้นมันสอดคล้องกับความต้องการของฉัน ฉันต้องการทำบางสิ่งบางอย่างด้วยรายการจากนั้นเปลี่ยนรายการของฉันให้เป็นองค์ประกอบเดียวของผลลัพธ์ การใช้แผนที่ / ลดการเกิดขึ้นตามธรรมชาติ
การประมวลผลสตริง (เช่นการแยกวิเคราะห์) คือการลดการใช้แผนที่อย่างเห็นได้ชัดอย่างหนึ่งการแมปเป็นแอปพลิเคชันของการแปลงที่หลากหลายในข้อความอินพุตและลดการใส่ข้อความผลลัพธ์กลับมารวมกันเป็นเอาท์พุท คอมไพเลอร์อาจคล้ายกันโดยใช้การพับเพื่อเปลี่ยนองค์ประกอบของแผนภูมิต้นไม้ให้เป็นรูปแบบที่ดีขึ้น (ปรับให้เหมาะสม)
มันขนานกันไหม
ปัญหาขนานใด ๆ คือแผนที่และพับ; ตรงกันข้ามขั้นตอนแผนที่เป็นแบบขนานโดยเนื้อแท้ (และขั้นตอนการพับอาจจะขึ้นอยู่กับโครงสร้างที่มันพับ) ดังนั้นนี่คือคุณสมบัติแบบสองทิศทาง
สมมติว่าคุณกำลังค้นหากลุ่มของเซิร์ฟเวอร์และไม่สามารถตอบได้ในขณะนั้น สิ่งที่ mapReduce จะทำคือเนื่องจากไม่สามารถเข้าถึงโหนดต้นไม้นั้นไปยังแผนที่ขนาดใหญ่ได้เพราะมันจะทำการกำหนดตารางเวลาใหม่ในภายหลังและดำเนินการทั้งแผนที่หรือย่อจากนั้น โดยพื้นฐานแล้วมันพยายามที่จะรับประกันว่าข้อมูลทั้งหมดนั้นมีอยู่ในความไม่แน่นอนของซอฟต์แวร์และฮาร์ดแวร์ในสภาพแวดล้อม
ต่อไปนี้เป็นคำถามสำคัญที่ฉันใช้เพื่อสอบสวนการตัดสินใจใช้ MapReduce (หรือไม่ใช้)
ปัญหาที่ฉันพยายามแก้ไขแยกย่อยลงในแผนที่และลดการดำเนินการหรือไม่
ผลก็คือรูปแบบ "การหารและการพิชิต" ทั่วไปดังนั้นวิธีแก้ปัญหาสำหรับการแจกจ่ายการคำนวณสามารถเขียนได้โดยทั่วไป
ตัวอย่างง่ายๆเป็นเหมือนเอกสารขนาดใหญ่ ปัญหาคือคุณต้องการนับจำนวนตัวอักษรในเอกสารนั้น แทนที่จะเรียกใช้บนเครื่องเดียวคุณสามารถแบ่งมันเป็นอาร์เรย์ของคำทั้งหมดในเอกสาร จากนั้นคุณสามารถประมวลผลคำแต่ละคำแยกกันและผลลัพธ์กลับมารวมกัน
รูปแบบมีประโยชน์เพราะเมื่อคุณได้รับแผนที่ทั่วไป / ลดการใช้งานคุณสามารถแก้ปัญหาโดยใช้เลเยอร์ซอฟต์แวร์เดียวกันนั้นคุณเพียงแค่ต้องแสดงปัญหาของคุณในแง่ของมัน