ตัวอย่าง MapReduce ที่ดี [ปิด]


202

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

ฉันไม่ได้มองหาตัวอย่างโค้ดเพียงแค่ตัวอย่างที่เป็นข้อความ


1
ฉันคิดว่าตัวอย่างที่คล้ายกัน แต่ดีกว่านั้นคือการนับคำสำหรับไฟล์ข้อความทั้งหมดที่คุณมีในคอมพิวเตอร์ของคุณ ง่ายต่อการเข้าใจและแสดงพลังของ MapReduce
Peter Lee

5
สำหรับคำถามสี่ข้อสุดท้ายที่ฉันค้นหาฉันพบว่าพวกเขาปิดในลักษณะที่ไม่สร้างสรรค์บนไซต์นี้ โดยโชคลาภพวกเขามีคำตอบแล้ว ถึงผู้เขียนที่ฉันรับรองความกตัญญูของฉันและ ณ ตอนนี้มีมากกว่า 80 คนที่ไม่เข้าใจนโยบายปิด ไม่ว่ามันเป็นเรื่องสำคัญกับคนอื่น ๆ แต่ฉันเป็นโปรแกรมเมอร์มืออาชีพตั้งแต่จุดเริ่มต้นของยุค 80 และตอนนี้ผมพบว่าตัวเองถามคำถามที่ไม่ถูกต้อง :)
เฮลเดอ Velez

1
มันมีค่าที่จะได้ดูรูปแบบการออกแบบ MapReduce: เช่นบางส่วนที่ครอบคลุมในสไลด์เหล่านี้และอื่น ๆ สามารถเห็นได้ในหนังสือเล่มนี้
เดนิส

คำตอบ:


297

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

ตัวอย่างเช่นใน SQL ที่กำหนดวันเดือนปีเกิดเพื่อค้นหาว่ามีกี่คนที่มีอายุมากกว่า> 30 ล้านคนในการบันทึกหนึ่งล้านครั้งและสิ่งนี้จะเพิ่มขึ้นตามลำดับความสำคัญเมื่อความซับซ้อนของแบบสอบถามเพิ่มขึ้น การลดแผนที่จัดให้มีการใช้งานแบบคลัสเตอร์ซึ่งข้อมูลถูกประมวลผลในลักษณะกระจาย

นี่คือบทความวิกิพีเดียอธิบายสิ่งที่map-reduceเกี่ยวกับ

อีกตัวอย่างที่ดีคือการหาเพื่อนผ่านการลดแผนที่อาจเป็นตัวอย่างที่ทรงพลังในการทำความเข้าใจแนวคิดและกรณีการใช้งานที่ดี

โดยส่วนตัวแล้วลิงค์นี้มีประโยชน์มากในการทำความเข้าใจแนวคิด

คัดลอกคำอธิบายที่ให้ไว้ในบล็อก (ในกรณีที่ลิงค์ค้าง)

หาเพื่อน

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).


4
อีกตัวอย่างหนึ่งคือการวิเคราะห์ข้อมูลสภาพอากาศจากทั่วโลก ค้นหา Max และ min สำหรับภูมิภาคใด ๆ นี่เป็นตัวอย่างที่ดีมาก
rvphx

การสร้างสิ่งอันดับกลางทั้งหมดจากนั้นตรวจสอบจุดตัดของทุกคนในภายหลังไม่น่าเบื่อใช่ไหม จะเป็นการดีกว่าหรือถ้าจะสร้างคู่เพื่อนที่เป็นไปได้ทั้งหมดเช่น AB AC BC เป็นต้นและส่งต่อคู่เหล่านี้กับรายชื่อเพื่อนทั้งหมดของเพื่อนสองคนในคู่ไปยังเครื่องหนึ่งโดยเฉพาะและปล่อยให้มันคำนวณจุดตัด ฉันหายไปนี่อะไร
GrowinMan

8
เกิดอะไรขึ้นถ้าโปรไฟล์ของ A เยี่ยมชม E? ผลลัพธ์สุดท้าย (A, E) ไม่มีแม้ว่าพวกเขาจะมีเพื่อนเหมือนกัน
หยิก

1
@Pinch นั่นเป็นเพราะ A และ E ไม่ใช่เพื่อนกัน ในกรณีนี้วิธีการนี้ดูเหมือนจะไม่เพียงพอแน่นอน (เว้นแต่คุณจะคำนึงว่า A หรือ E สามารถซ่อนรายชื่อเพื่อนที่ไม่ใช่เพื่อน :))
Pega88

1
@karthikr: ฉันสับสนเกี่ยวกับขั้นตอนการจัดกลุ่ม เห็นได้ชัดว่าแผนที่และย่อขนาดสามารถวิ่งขนานกันได้ แต่ช่วงแบ่งกลุ่มเป็นอย่างไร จะต้องทำในหัวข้อเดียวหรือฉันหายไปบางอย่าง
Dinaiz

24

หนึ่งในตัวอย่างที่ดีที่สุดของ Hadoop เหมือนการดำเนินงาน

โปรดจำไว้ว่าพวกเขาถูก จำกัด การใช้งานตามค่าคีย์ของแนวคิด MapReduce (ดังนั้นพวกเขาจะ จำกัด ในการบังคับใช้)


คุณพูดถูก แต่ปัญหาที่เกิดขึ้นจริงในโลกส่วนใหญ่เป็นพื้นฐานของคีย์หรือสามารถแปลเป็นกระบวนทัศน์คีย์ - ค่าได้
Saumumanth Gopisetty

4

ชุดปฏิบัติการที่คุ้นเคยที่คุณสามารถทำได้ใน MapReduce หนึ่งชุดคือชุดปฏิบัติการ SQL ปกติ: SELECT, SELECT WHERE, GROUP BY, ect

อีกตัวอย่างที่ดีคือเมทริกซ์คูณที่คุณผ่านหนึ่งแถวของ M และเวกเตอร์ทั้งหมด x และคำนวณองค์ประกอบหนึ่งของ M * x


3

บางครั้งฉันนำเสนอแนวคิดของ MR ต่อผู้คน ฉันค้นหางานการประมวลผลที่ผู้คนคุ้นเคยและจากนั้นทำแผนที่กับกระบวนทัศน์ของ MR

ฉันมักจะทำสองสิ่ง:

  1. จัดกลุ่มตาม / การรวมตัว นี่คือข้อดีของขั้นตอนการสับที่ชัดเจน คำอธิบายที่การสับแบบกระจายยังเป็นการเรียง + การอธิบายของอัลกอริทึมการเรียงแบบกระจายก็ช่วยได้เช่นกัน

  2. เข้าร่วมของสองตาราง ผู้ที่ทำงานกับฐานข้อมูลคุ้นเคยกับแนวคิดและปัญหาการปรับขนาด แสดงให้เห็นว่าสามารถทำได้ใน MR


เพื่ออธิบายให้กับคนอื่นฉันใช้วิธีเด็ก: คุณมีกลุ่มเด็กที่กระตือรือร้นและการ์ดมากมาย คุณให้เด็กแต่ละคนมีการ์ดจำนวนหนึ่งบอกให้พวกเขาเรียงลำดับโดยด้านหลังของไพ่ * จากนั้นตามหมายเลข / รูปภาพแล้วตามความเหมาะสม - เช่นฟังก์ชั่นแผนที่ฟังก์ชั่นเด็กแต่ละคนทำเสร็จ ผู้ใหญ่แต่ละคน "ลด" กองเป็นกองเดียวแล้วผู้ใหญ่สองคนให้ผู้ใหญ่ฟรีมีกองบัตร นั่นคือโดยนิยามฟังก์ชั่นลดที่สามารถทำงานได้มากกว่าหนึ่งครั้งตามจำนวนของเด็ก / กอง คนส่วนใหญ่ได้รับมันในการลองครั้งแรก
Mickey Perlstein
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.