การลดแผนที่เป็นกรอบที่พัฒนาขึ้นเพื่อประมวลผลข้อมูลจำนวนมหาศาลอย่างมีประสิทธิภาพ ตัวอย่างเช่นถ้าเรามี 1 ล้านบันทึกในชุดข้อมูลและมันถูกเก็บไว้ในการเป็นตัวแทนเชิงสัมพันธ์ - มันมีราคาแพงมากที่จะได้รับค่าและดำเนินการแปลงใด ๆ กับสิ่งเหล่านี้
ตัวอย่างเช่นใน SQL ที่กำหนดวันเดือนปีเกิดเพื่อค้นหาว่ามีกี่คนที่มีอายุมากกว่า> 30 ล้านคนในการบันทึกหนึ่งล้านครั้งและสิ่งนี้จะเพิ่มขึ้นตามลำดับความสำคัญเมื่อความซับซ้อนของแบบสอบถามเพิ่มขึ้น การลดแผนที่จัดให้มีการใช้งานแบบคลัสเตอร์ซึ่งข้อมูลถูกประมวลผลในลักษณะกระจาย
อีกตัวอย่างที่ดีคือการหาเพื่อนผ่านการลดแผนที่อาจเป็นตัวอย่างที่ทรงพลังในการทำความเข้าใจแนวคิดและกรณีการใช้งานที่ดี
หาเพื่อน
MapReduce เป็นเฟรมเวิร์กที่พัฒนาโดย Google ซึ่งอนุญาตให้ใช้งานคอมพิวเตอร์ขนาดใหญ่แบบกระจายข้ามโดเมนจำนวนมากได้ง่าย Apache Hadoop เป็นการใช้งานแบบโอเพ่นซอร์ส
ฉันจะปัดเศษรายละเอียดลงไป แต่มันลงมาเพื่อกำหนดสองฟังก์ชั่น: ฟังก์ชั่นแผนที่และฟังก์ชั่นลด ฟังก์ชั่นแผนที่ใช้คู่ค่าและเอาต์พุตคีย์: คู่ค่า ตัวอย่างเช่นถ้าเรากำหนดฟังก์ชั่นแผนที่ที่ใช้สตริงและเอาท์พุทความยาวของคำว่าเป็นคีย์และคำตัวเองเป็นค่าจากนั้นแผนที่ (สตีฟ) จะกลับ 5: สตีฟและแผนที่ (สะวันนา) จะกลับ 8: สะวันนา . คุณอาจสังเกตเห็นว่าฟังก์ชั่นแผนที่ไร้สัญชาติและต้องการเพียงค่าอินพุทเพื่อคำนวณค่าเอาท์พุต สิ่งนี้ทำให้เราสามารถเรียกใช้ฟังก์ชั่นแผนที่เทียบกับค่าแบบขนานและให้ประโยชน์มาก ก่อนที่เราจะไปที่ฟังก์ชั่นการลดกรอบการทำแผนที่ mapreduce จัดกลุ่มค่าทั้งหมดเข้าด้วยกันด้วยคีย์ดังนั้นหากแผนที่ทำหน้าที่ส่งออกคีย์ต่อไปนี้: คู่ค่า:
3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research
พวกเขาได้รับการจัดกลุ่มเป็น:
3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]
แต่ละบรรทัดเหล่านี้จะถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชั่นลดซึ่งรับคีย์และรายการของค่า ในตัวอย่างนี้เราอาจพยายามคิดจำนวนคำที่มีความยาวดังนั้นฟังก์ชันลดของเราจะนับจำนวนรายการในรายการและส่งออกคีย์ด้วยขนาดของรายการเช่น:
3 : 3
4 : 3
5 : 2
8 : 2
การลดลงสามารถทำได้ในแบบคู่ขนานอีกครั้งให้ประโยชน์มาก จากนั้นเราสามารถดูผลลัพธ์สุดท้ายเหล่านี้และเห็นว่ามีเพียงสองคำที่มีความยาว 5 ในคลังของเรา ฯลฯ ...
ตัวอย่างที่พบบ่อยที่สุดของ mapreduce คือการนับจำนวนครั้งที่คำเกิดขึ้นในคลังข้อมูล สมมติว่าคุณมีสำเนาของอินเทอร์เน็ต (ฉันโชคดีพอที่จะทำงานในสถานการณ์เช่นนี้) และคุณต้องการรายการคำทุกคำบนอินเทอร์เน็ตรวมถึงจำนวนครั้งที่มันเกิดขึ้น
วิธีที่คุณจะเข้าใกล้สิ่งนี้จะเป็นการโทเค็นเอกสารที่คุณมี (แยกเป็นคำ) และส่งแต่ละคำไปยังผู้ทำแผนที่ 1
แมปเปอร์ก็จะคายกลับออกคำพร้อมกับมูลค่าของ ขั้นตอนการจัดกลุ่มจะใช้คีย์ทั้งหมด (ในกรณีคำนี้) และทำรายการของ 1 ขั้นตอนการลดจะใช้คีย์ (คำ) และรายการ (รายการ 1 สำหรับทุกครั้งที่ปรากฏคีย์บนอินเทอร์เน็ต) และสรุปรายการ ตัวลดจะแสดงผลคำพร้อมกับนับ เมื่อทุกคนพูดและทำคุณจะมีรายการคำทุกคำบนอินเทอร์เน็ตพร้อมกับจำนวนครั้งที่ปรากฏ
ง่ายใช่มั้ย หากคุณเคยอ่านเกี่ยวกับ mapreduce สถานการณ์ข้างต้นไม่ใช่เรื่องใหม่ ... มันคือ "Hello, World" ของ mapreduce ดังนั้นนี่คือกรณีการใช้งานจริง (Facebook อาจหรืออาจไม่ทำสิ่งต่อไปนี้เป็นเพียงตัวอย่าง):
Facebook มีรายชื่อเพื่อน (โปรดทราบว่าเพื่อนเป็นสิ่งที่มีสองทิศทางบน Facebook หากฉันเป็นเพื่อนของคุณ พวกเขายังมีพื้นที่ดิสก์จำนวนมากและให้บริการหลายร้อยล้านคำขอทุกวัน พวกเขาได้ตัดสินใจคำนวณล่วงหน้าล่วงหน้าเมื่อสามารถลดเวลาประมวลผลของคำขอได้ คำขอการประมวลผลทั่วไปอย่างหนึ่งคือฟีเจอร์ "คุณและโจมีเพื่อนร่วมกัน 230 คน" เมื่อคุณเยี่ยมชมโปรไฟล์ของใครบางคนคุณจะเห็นรายชื่อเพื่อนที่คุณมีเหมือนกัน รายการนี้ไม่เปลี่ยนแปลงบ่อยนักดังนั้นจึงเป็นการสิ้นเปลืองที่จะต้องคำนวณใหม่ทุกครั้งที่คุณเข้าเยี่ยมชมโปรไฟล์ (แน่ใจว่าคุณสามารถใช้กลยุทธ์การแคชที่ดี แต่แล้วฉันจะไม่สามารถเขียนเกี่ยวกับ mapreduce ต่อไปสำหรับปัญหานี้) เราจะใช้ mapreduce เพื่อให้เราสามารถคำนวณทุกคนได้ มีเพื่อนร่วมกันวันละครั้งและจัดเก็บผลลัพธ์เหล่านั้น ต่อมาเป็นเพียงการค้นหาอย่างรวดเร็ว เรามีดิสก์เยอะมากราคาถูก
สมมติว่าเพื่อนถูกเก็บเป็นบุคคล -> [รายชื่อเพื่อน] รายชื่อเพื่อนของเราคือ:
A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D
แต่ละบรรทัดจะเป็นอาร์กิวเมนต์ของผู้ทำแผนที่ สำหรับเพื่อนทุกคนในรายชื่อเพื่อน mapper จะส่งออกคู่ค่าคีย์ กุญแจจะเป็นเพื่อนพร้อมกับบุคคลนั้น ค่าจะเป็นรายชื่อเพื่อน กุญแจจะถูกจัดเรียงเพื่อให้เพื่อนอยู่ในระเบียบทำให้เพื่อนทุกคู่ไปที่ตัวลดเดียวกัน นี่เป็นการยากที่จะอธิบายด้วยข้อความดังนั้นเราจะทำมันและดูว่าคุณสามารถเห็นรูปแบบ หลังจากที่ตัวแม็พทั้งหมดทำงานเสร็จสิ้นคุณจะมีรายการดังนี้:
For map(A -> B C D) :
(A B) -> B C D
(A C) -> B C D
(A D) -> B C D
For map(B -> A C D E) : (Note that A comes before B in the key)
(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :
(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :
(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):
(B E) -> B C D
(C E) -> B C D
(D E) -> B C D
Before we send these key-value pairs to the reducers, we group them by their keys and get:
(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)
แต่ละบรรทัดจะถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังตัวลด ฟังก์ชั่นลดจะแยกรายการค่าและเอาท์พุทคีย์เดียวกันกับผลลัพธ์ของการแยก ตัวอย่างเช่นลด ((AB) -> (ACDE) (BCD)) จะส่งออก (AB): (CD) และหมายความว่าเพื่อน A และ B มี C และ D เป็นเพื่อนทั่วไป
ผลลัพธ์หลังการลดคือ:
(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)
ตอนนี้เมื่อ D เข้าชมโปรไฟล์ของ B เราสามารถค้นหา(B D)
และดูว่าพวกเขามีเพื่อนร่วมกันสามคน, (A C E)
.