MapReduce ใน Hadoop คืออะไร Archiแผนผังและไดอะแกรม

⚡ สรุปอย่างชาญฉลาด

MapReduce คือโมเดลการเขียนโปรแกรมของ Hadoop ที่แปลงชุดข้อมูลขนาดใหญ่ให้เป็นผลลัพธ์ขนาดเล็กโดยการเรียกใช้ฟังก์ชัน map กับทุกส่วนย่อยของข้อมูลขาเข้า จากนั้นจึงเรียกใช้ฟังก์ชัน reduce กับค่ากลางที่จัดกลุ่มไว้

  • 🔘 4 ระยะ: ทุกงานทำงานโดยการแบ่งและแมปpingโดยการสับเปลี่ยนและลดจำนวนลง พร้อมกับการไหลเวียนของคู่คีย์-ค่าระหว่างแต่ละขั้นตอน
  • ☑️ ตัวอย่างการทำงาน: ข้อความสามบรรทัดกลายเป็นจำนวนคำเจ็ดคำ ซึ่งแสดงให้เห็นอย่างชัดเจนว่าแต่ละขั้นตอนมีส่วนช่วยอะไรบ้าง
  • การแบ่งขนาด: จะมีการทำงานของเมธอดแมปหนึ่งครั้งต่อการแบ่งข้อมูลเข้าแต่ละครั้ง และขนาดของการแบ่งข้อมูลมักจะเท่ากับขนาดบล็อกของ HDFS
  • 🧪 ข้อมูลขั้นกลาง: ผลลัพธ์ของแผนที่ถูกเขียนลงดิสก์ภายในเครื่องแทนที่จะเป็น HDFS เพราะการทำสำเนาข้อมูลที่ไม่จำเป็นนั้นสิ้นเปลือง
  • 🛠️ การประสานงาน: งานTracker กำหนดตารางงานและภารกิจTracระบบ KERS จะรายงานความคืบหน้าผ่านสัญญาณจังหวะการเต้นของหัวใจเป็นระยะๆ
  • ⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: YARN ได้แทนที่ส่วนประกอบทั้งสองนั้นด้วย ResourceManager, NodeManagers และ ApplicationMaster สำหรับแต่ละงานจาก Hadoop 2.x

สถาปัตยกรรม MapReduce ใน Hadoop อธิบายพร้อมตัวอย่าง

MapReduce ใน Hadoop คืออะไร

MapReduce เป็นเฟรมเวิร์กซอฟต์แวร์และแบบจำลองการเขียนโปรแกรมที่ใช้สำหรับการประมวลผลข้อมูลจำนวนมหาศาล โปรแกรม MapReduce ทำงานในสองขั้นตอน ได้แก่ Map และ Reduce งาน Map เกี่ยวข้องกับการแบ่งและแมปข้อมูลping ของข้อมูลในขณะที่งานลดจำนวนลงจะสลับและลดขนาดข้อมูลลง

Hadoop สามารถรันโปรแกรม MapReduce ที่เขียนด้วยภาษาต่างๆ ได้: Javaทับทิม Pythonและ C++โปรแกรม MapReduce มีลักษณะการทำงานแบบขนาน ดังนั้นจึงมีประโยชน์อย่างมากสำหรับการวิเคราะห์ข้อมูลขนาดใหญ่โดยใช้เครื่องหลายเครื่องในคลัสเตอร์

ข้อมูลที่ป้อนเข้าสู่แต่ละขั้นตอนคือคู่คีย์-ค่า นอกจากนี้ โปรแกรมเมอร์ทุกคนต้องระบุฟังก์ชันสองฟังก์ชัน ได้แก่ ฟังก์ชัน map และฟังก์ชัน reduce

แผนที่ลด Archiการสอนใน Big Data อธิบายด้วยตัวอย่าง

กระบวนการทั้งหมดประกอบด้วยสี่ขั้นตอนหลัก ได้แก่ การแบ่ง การแมปpingการสับเปลี่ยน และการลดจำนวน

ในบทเรียน MapReduce นี้ เรามาทำความเข้าใจ MapReduce ด้วยตัวอย่างกันครับ

สมมติว่าคุณมีข้อมูลป้อนเข้าต่อไปนี้สำหรับ MapReduce ของคุณ ข้อมูลขนาดใหญ่ โปรแกรม:

Welcome to Hadoop Class
Hadoop is good
Hadoop is bad

แผนภาพด้านล่าง tracใช้เส้นสามเส้นนั้นในทุกขั้นตอน ตั้งแต่การแบ่งข้อมูลขาเข้าทางด้านซ้าย ไปจนถึงจำนวนคำสุดท้ายทางด้านขวา

แผนภาพสถาปัตยกรรม MapReduce tracการรวมสามบรรทัดอินพุตผ่านการแยกและแมปpingการสับเปลี่ยนและการลดจำนวน

ผลลัพธ์สุดท้ายของงาน MapReduce คือ

ไม่ดี 1
ชั้น 1
ดี 1
Hadoop 3
is 2
ไปยัง 1
ยินดีต้อนรับ 1

ข้อมูลจะผ่านขั้นตอนต่างๆ ของ MapReduce ใน Big Data ดังต่อไปนี้

การแบ่งอินพุต

ข้อมูลนำเข้าสำหรับงาน MapReduce ใน Big Data จะถูกแบ่งออกเป็นส่วนย่อยขนาดคงที่ที่เรียกว่า input split input split คือส่วนหนึ่งของข้อมูลนำเข้าที่จะถูกประมวลผลโดย map เดียว

แผนที่แสดงที่ตั้งบริษัทping

นี่คือขั้นตอนแรกสุดในการทำงานของโปรแกรม MapReduce ในขั้นตอนนี้ ข้อมูลในแต่ละส่วนจะถูกส่งไปยังแผนที่ (map)ping ฟังก์ชันสำหรับสร้างค่าเอาต์พุต ในตัวอย่างของเรา หน้าที่ของแผนที่คือการสร้างค่าเอาต์พุตping ขั้นตอนต่อไปคือการนับจำนวนครั้งที่แต่ละคำปรากฏจากคำที่แยกออกมา (รายละเอียดเพิ่มเติมเกี่ยวกับการแยกคำจะกล่าวถึงด้านล่าง) และจัดทำรายการในรูปแบบดังนี้ .

สับ

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

ลด

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

ในตัวอย่างของเรา ขั้นตอนนี้จะรวบรวมค่าจากขั้นตอนการสุ่มสลับคำ กล่าวคือ จะคำนวณจำนวนครั้งทั้งหมดที่แต่ละคำปรากฏ

แผนที่ลด Architecture อธิบายอย่างละเอียด

หัวข้อด้านล่างนี้จะอธิบายวิธีการจัดวางและจัดเก็บงานแยกย่อย งานแมป และงานลดขนาดในคลัสเตอร์

  • จะมีการสร้างงานแมปหนึ่งงานสำหรับแต่ละส่วนแบ่ง จากนั้นงานแมปจะเรียกใช้ฟังก์ชันแมปสำหรับแต่ละเรคอร์ดในส่วนแบ่งนั้น
  • การแบ่งข้อมูลออกเป็นส่วนย่อยๆ หลายส่วนนั้นมีประโยชน์เสมอ เพราะเวลาที่ใช้ในการประมวลผลแต่ละส่วนย่อยนั้นน้อยกว่าเวลาที่ใช้ในการประมวลผลข้อมูลทั้งหมด การแบ่งข้อมูลให้เป็นส่วนย่อยๆ จะช่วยให้การประมวลผลมีความสมดุลมากขึ้น เนื่องจากส่วนย่อยต่างๆ จะถูกประมวลผลแบบขนานกัน
  • อย่างไรก็ตาม การแบ่งงานที่เล็กเกินไปก็ไม่ใช่เรื่องที่พึงประสงค์เช่นกัน เมื่อการแบ่งงานเล็กเกินไป ค่าใช้จ่ายในการจัดการการแบ่งงานและการสร้างงานแผนที่ (map task) จะเริ่มครอบงำเวลาการทำงานโดยรวม
  • สำหรับงานส่วนใหญ่ การกำหนดขนาดการแบ่งให้เท่ากับขนาดของงานจะดีกว่า เอชดีเอฟเอส บล็อกซึ่งมีค่าเริ่มต้นที่ 128 MB ตั้งแต่ Hadoop 2.x เป็นต้นไป (เดิมคือ 64 MB ใน Hadoop 1.x) และถูกควบคุมโดย dfs.blocksize คุณสมบัติ
  • การดำเนินการของงานแผนที่ส่งผลให้มีการเขียนผลลัพธ์ลงในดิสก์ภายในเครื่องของโหนดนั้นๆ ไม่ใช่ลงใน HDFS
  • เหตุผลที่เลือกใช้ดิสก์ภายในเครื่องแทน HDFS ก็เพื่อหลีกเลี่ยงการจำลองข้อมูลที่เกิดขึ้นระหว่างการดำเนินการจัดเก็บข้อมูลบน HDFS
  • เอาต์พุตแผนที่เป็นเอาต์พุตระดับกลางซึ่งถูกประมวลผลโดยลดงานเพื่อสร้างเอาต์พุตสุดท้าย
  • เมื่องานเสร็จสมบูรณ์ เอาต์พุตแผนที่จะถูกโยนทิ้งไป ดังนั้นการจัดเก็บไว้ใน HDFS พร้อมการจำลองแบบจึงเกินความจำเป็น
  • ในกรณีที่โหนดล้มเหลว ก่อนที่งานลดจะใช้เอาท์พุตแผนที่ Hadoop จะรันงานแมปบนโหนดอื่นอีกครั้ง และสร้างเอาท์พุตแมปขึ้นใหม่
  • คำสั่ง Reduce ไม่ทำงานบนแนวคิดเรื่องตำแหน่งที่ตั้งของข้อมูล เอาต์พุตของคำสั่ง Map ทุกคำสั่งจะถูกส่งไปยังคำสั่ง Reduce ส่วนเอาต์พุตของคำสั่ง Map จะถูกส่งไปยังเครื่องที่คำสั่ง Reduce กำลังทำงานอยู่
  • บนเครื่องนี้ เอาต์พุตจะถูกรวมเข้าด้วยกัน แล้วส่งต่อไปยังฟังก์ชันลดขนาดที่ผู้ใช้กำหนด
  • ต่างจากผลลัพธ์ของคำสั่ง map ผลลัพธ์ของคำสั่ง reduce จะถูกจัดเก็บไว้ใน HDFS (สำเนาแรกจะถูกจัดเก็บไว้ในโหนดภายในเครื่อง และสำเนาอื่นๆ จะถูกจัดเก็บไว้ในโหนดภายนอก) ดังนั้น การเขียนผลลัพธ์ของคำสั่ง reduce จึงใช้แบนด์วิดท์เครือข่าย แต่ใช้เพียงเท่ากับปริมาณการเขียนข้อมูลลง HDFS ตามปกติเท่านั้น

การจัดระเบียบ MapReduce ทำงานอย่างไร

ในบทเรียน MapReduce นี้ เราจะเรียนรู้วิธีการทำงานของ MapReduce

Hadoop แบ่งงานออกเป็นงานย่อย โดยมีงานย่อยอยู่สองประเภท:

  1. งานแผนที่ (การแบ่งและแผนที่)ping)
  2. ลดจำนวนงาน (การสลับงาน การลดจำนวนงาน)

กระบวนการดำเนินการทั้งหมด ซึ่งก็คือการดำเนินการทั้งงาน Map และ Reduce นั้น ถูกควบคุมโดยเอนทิตีสองประเภทที่เรียกว่า:

  1. การสัมภาษณ์Tracker: ทำหน้าที่เสมือนมาสเตอร์และรับผิดชอบการดำเนินการทั้งหมดของงานที่ส่งเข้ามา
  2. งานหลายอย่างTracพวกเขาทำตัวเหมือนทาส แต่ละคนทำหน้าที่คนละส่วน

สำหรับทุกงานที่ส่งเข้ามาเพื่อดำเนินการในระบบ จะมีงานหนึ่งงานTracเคอร์ที่อยู่ในเนมโนด และมีงานหลายงานTrackers ซึ่งอยู่ใน DataNodes

หมายเหตุ งานTracเคอร์และงานTracker pair เป็นส่วนหนึ่งของ MapReduce เวอร์ชัน 1 (Hadoop 1.x) ตั้งแต่ Hadoop 2.x เป็นต้นไป YARN จะแบ่งหน้าที่เหล่านั้นออกเป็น ResourceManager ทั่วทั้งคลัสเตอร์, NodeManager บนทุกโหนด และ ApplicationMaster หนึ่งตัวต่อหนึ่งงาน แม้ว่าขั้นตอนการแมป การสับเปลี่ยน และการลดทอนจะยังคงไม่เปลี่ยนแปลงก็ตาม

แผนภาพด้านล่างแสดงให้เห็นว่างานที่ส่งเข้ามานั้นถูกแบ่งออกเป็นงานย่อยอย่างไร tracกระจายอยู่ทั่วคลัสเตอร์

แผนภาพแสดงการแบ่งงานออกเป็นงาน Map และ Reduce tracถูกจ้างโดยงานTracเคอร์และงานTracKERS

  • งานหนึ่งๆ จะถูกแบ่งออกเป็นหลายภารกิจ ซึ่งแต่ละภารกิจจะถูกประมวลผลบนโหนดข้อมูลหลายๆ โหนดในคลัสเตอร์
  • นั่นเป็นความรับผิดชอบของงาน tracker ทำหน้าที่ประสานงานกิจกรรมโดยการกำหนดตารางเวลาให้งานต่างๆ ทำงานบนโหนดข้อมูลที่แตกต่างกัน
  • จากนั้น การดำเนินการของแต่ละภารกิจจะได้รับการดูแลโดยภารกิจนั้นๆ tracker ซึ่งเป็นไฟล์ที่อยู่บนโหนดข้อมูลทุกโหนดที่กำลังประมวลผลส่วนหนึ่งของงาน
  • งาน tracหน้าที่ของเคอร์คือการส่งรายงานความคืบหน้าไปยังผู้ที่เกี่ยวข้องในงาน tracเคอร์
  • นอกจากนี้ งานดังกล่าว tracker จะส่งสัญญาณ 'หัวใจเต้น' ไปยัง Job เป็นระยะTracเพื่อแจ้งให้ทราบถึงสถานะปัจจุบันของระบบ
  • ดังนั้นงานจึงเสร็จสิ้น tracเคอร์เก็บ track ของความคืบหน้าโดยรวมของแต่ละงาน ในกรณีที่งานล้มเหลว งานนั้นจะถูกยกเลิก tracker สามารถกำหนดเวลาใหม่ให้กับงานอื่นได้ tracเคอร์

คำถามที่พบบ่อย

YARN ทำเช่นนั้นมาตั้งแต่ Hadoop เวอร์ชัน 2.x เป็นต้นไป โดยมี ResourceManager ที่ทำงานทั่วทั้งคลัสเตอร์เพื่อจัดการการจัดตารางเวลา NodeManager ทำงานบนแต่ละโหนด และ ApplicationMaster หนึ่งตัวต่อหนึ่งงาน tracks ทำหน้าที่ของมัน ขั้นตอนการแมปและการลดทอนยังคงไม่เปลี่ยนแปลง

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

Copilot จัดการโครงสร้างพื้นฐานได้ดี เช่น ลายเซ็นของ mapper และ reducer, generics, imports และการเรียกใช้การกำหนดค่า driver การตัดสินใจเกี่ยวกับ schema เช่น ฟิลด์ใดเป็นกลุ่มping สิ่งสำคัญคือ ยังคงต้องการนักพัฒนาที่รู้จักข้อมูลเป็นอย่างดี

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

Combiner คือ mini-reducer เสริมที่ทำงานกับเอาต์พุตของ map ก่อนที่จะส่งผ่านเครือข่าย มันช่วยลดปริมาณการรับส่งข้อมูล shuffle ได้อย่างมาก แต่สามารถใช้ได้เฉพาะเมื่อการดำเนินการ reduce นั้นเป็นทั้ง associative และ commutative เท่านั้น

Spark MapReduce จะเก็บผลลัพธ์ระหว่างขั้นตอนไว้ในหน่วยความจำและแสดงงานเป็นกราฟแบบมีทิศทางของขั้นตอนต่างๆ ในขณะที่ MapReduce จะเขียนผลลัพธ์ระหว่างขั้นตอนลงดิสก์ระหว่างแต่ละเฟส Spark ดังนั้นจึงเร็วกว่ามากสำหรับงานที่ต้องทำซ้ำหลายครั้ง

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

Hadoop สร้างงานแมป (map task) หนึ่งงานต่อส่วนแบ่งข้อมูล (split) หนึ่งส่วน โดยส่วนแบ่งข้อมูลนั้นเป็นช่วงของไบต์ ไม่ใช่ทั้งไฟล์ ไฟล์ขนาดใหญ่หนึ่งไฟล์จะสร้างส่วนแบ่งข้อมูลจำนวนมาก ในขณะที่ไฟล์ขนาดเล็กจำนวนมากจะสร้างงานแมปขนาดเล็กที่ไม่มีประสิทธิภาพ

สรุปโพสต์นี้ด้วย: