หลักการทำงานของ MapReduce และตัวอย่างการใช้

มีโอกาสได้เริ่มอ่านหนังสือ Hadoop: The Definitive Guide เขียนโดย Tom White แบบจริงๆ จังๆ เพราะในอนาคตจะได้ใช้แน่ๆ กะว่าอ่านไปแล้วก็มาเขียนบล็อกแปลไปจะได้เข้าใจได้มากขึ้น โพสต์นี้จะกล่าวถึงหลัการทำงาน และตัวอย่างการใช้ MapReduce เพื่อประมวลผลข้อมูลจำนวนมหาศาล

MapReduce คือ programming model ที่จะแบ่งส่วนการทำงานเป็น 2 ขั้นตอน คือ ขั้นตอน map และ ขั้นตอน reduce โดยแต่ละขั้นตอนจะมีคู่ key-value เป็น input และ output ซึ่งเราจะเป็นคนกำหนดเอง ส่วนนี้อาจจะต้องอาศัยประสบการณ์เล็กน้อย และความเข้าใจในข้อมูลนั้นๆ ถึงจะออกแบบคู่ key-value ในแต่ละขั้นออกมาได้ สำหรับคนที่ยังมองไม่ออกก็ไม่เป็นไร ค่อยๆ ศึกษาไปเรื่อยๆ เดี๋ยวจะรู้เองครับว่าเราควรจะออกแบบออกมาแบบไหนถึงจะดี นอกเหนือจากการออกแบบแล้ว เรายังจะต้องกำหนดฟังก์ชั่น map และฟังก์ชั่น reduce อีกด้วย ว่าจะให้ทำงานอย่างไร

ทีนี้เราลองมาดูตัวอย่างการใช้บ้าง จากส่วนหนึ่งของข้อมูลข้างล่างนี้ ย้ำนะครับว่าแค่ส่วนหนึ่ง ข้อมูลจริงนั้นมหาศาลมาก

0067011990999991950051507004...9999999N9+00001+99999999999...
0043011990999991950051512004...9999999N9+00221+99999999999...
0043011990999991950051518004...9999999N9-00111+99999999999...
0043012650999991949032412004...0500001N9+01111+99999999999...
0043012650999991949032418004...0500001N9+00781+99999999999...

ข้อมูลนี้เอามาจาก National Climatic Data Center (NCDC, http://www.ncdc.noaa.gov/) ซึ่งจะเก็บข้อมูลพวกสภาพดินฟ้าอากาศจากหลายๆ แห่งมารวมกัน ซึ่งจะมีค่าพวก stataion ID วันเวลา ละติจูด ลองจิจูด อยู่ในนั้นด้วย

ถามว่าถ้าเราต้องการจะหาว่าในแต่ละปีอุณหภูมิสูงสุดเป็นเท่าไหร่ โดยใช้ MapReduce?

เพื่อความง่าย ขอสนใจแค่ค่าปีกับอุณหภูมิเท่านั้นนะ จะเป็นค่าที่เป็นตัวหนา (ถ้าใครอยากรู้ว่าค่าอะไรอยู่ตรงไหนบ้าง ต้องตามไปอ่านในเว็บ NCDC นะครับ)

0067011990999991950051507004...9999999N9+00001+99999999999...
0043011990999991950051512004...9999999N9+00221+99999999999...
0043011990999991950051518004...9999999N9-00111+99999999999...
0043012650999991949032412004...0500001N9+01111+99999999999...
0043012650999991949032418004...0500001N9+00781+99999999999...

เริ่มแรกคือการออกแบบฟังก์ชั่น map การออกแบบฟังก์ชั่นไม่ว่าจะเป็น map หรือ reduce นั้นทำได้หลายวิธี ผมขอเอามาจากหนังสือเลยนะ ซึ่งได้ออกแบบไว้ว่าให้ map เป็นแค่ฟังก์ชั่นสำหรับการทำ data preparation ละกัน ให้เตรียมข้อมูลสำหรับใช้ในขั้นตอน reduce ซึ่งก็คือการหาค่าอุณหภูมิสูงสุดของแต่ละปี ดังนั้นให้ map ทำแค่ดึงข้อมูลปีและอุณหภูมิออกมาก็พอ

เราให้ input ของ map มีลักษณะนี้

(0, 0067011990999991950051507004...9999999N9+00001+99999999999...)
(106, 0043011990999991950051512004...9999999N9+00221+99999999999...)
(212, 0043011990999991950051518004...9999999N9-00111+99999999999...)
(318, 0043012650999991949032412004...0500001N9+01111+99999999999...)
(424, 0043012650999991949032418004...0500001N9+00781+99999999999...)

โดย key คือ เลขบรรทัดของข้อมูลนั้นๆ ซึ่งเราจะไม่เอาไปใช้ทำอะไร จุดประสงค์คือจะให้ input เป็นแค่คู่ key-value เฉยๆ ส่วน value ก็คือค่าสตริงข้อมูลยาวๆ ตัวฟังก์ชั่น map ของเราก็ให้ map คืนค่า output ออกมาเป็นคู่ key-value โดย key คือ ปี และ value คือ อุณหภูมิ (ที่โดนแปลงเป็น integer แล้ว) ดังนี้

(1950, 0)
(1950, 22)
(1950, -11)
(1949, 111)
(1949, 78)

แต่ก่อนที่จะส่งไปยังขั้นตอน reduce ตัวเฟรมเวิร์คของ MapReduce จะจัดเรียงข้อมูลและจัดกลุ่มค่าอุณหภูมิให้เราเอง ซึ่งขั้นตอน reduce จะเห็น input เป็นแบบนี้

(1949, [111, 78])
(1950, [0, 22, -11])

ขั้นตอนในส่วน reduce ก็ง่ายมาก เอา input ที่ได้มาหาค่าอุณหภูมิสูงสุดของแต่ละปี และส่ง output ออกมาในลักษณะคู่ key-value แบบนี้

(1949, 111)
(1950, 22)

เป็นอันเสร็จสิ้นกระบวนการ 🙂 ขั้นตอนดังกล่าวสามารถแสดงเป็นรูป data flow ข้างล่างนี้ เอามาจากในหนังสือ และส่วนพวกที่เป็น Unix command ไม่ต้องไปสนใจนะครับ (คลิกที่รูปเพื่อดูรูปใหญ่)

MapReduce-logical-data-flow

ถามว่าแล้วถ้าแยกคำนวณแต่ละปี แยกเครื่องคำนวณไปเลย เป็น distributed computing เหมือนกัน สั่งรันแล้วรอผลเป็นอันเสร็จ.. ปัญหาที่จะเจอคือ ถ้าสมมุติว่าปี 1990 มีข้อมูลแค่ 100 เรคคอร์ด ส่วนปี 1995 มีข้อมูลเป็นล้านล้านเรคคอร์ด จะเกิดอะไรขึ้น?

สิ่งที่เกิดคือ ไม่ว่าอย่างไรเราก็ต้องรอเครื่องที่คำนวณอุณหภูมิของปี 1995 ให้เสร็จอยู่ดี เครื่องที่คำนวณปี 1990 อาจจะเสร็จไปตั้งแต่ 1 วินาทีแรก แต่ต้องมารออีกเครื่องประมาณ 1-2 ชม. เป็น distributed computing ก็จริงอยู่ แต่ใช้ทรัพยากรได้ไม่คุ้มค่า ดังนั้นเราแบ่งข้อมูลออกเป็น chunk หรือออกเป็นส่วนๆ ดีกว่า ไม่ต้องสนใจเรื่องปี

 

เครดิต: Hadoop: The Definitive Guide เขียนโดย Tom White

Author: zkan

Soon to be a newbie data scientist. I ♥ machine learning, computer vision, robotics, image processing, data visualization, and data analytics.

7 thoughts on “หลักการทำงานของ MapReduce และตัวอย่างการใช้”

  1. ขอบคุณครับสำหรับบทความ
    เขียนเรื่องแนว Big Data เยอะๆ นะครับ รอติดตาม 😀

  2. ขอบคุณครับ เข้าใจง่าย รอติดตามนะครับ

  3. อธิบายดีอ่านง่าย เข้าใจมากขึ้นเลยครับ

  4. I see you don't monetize your website, don't waste your traffic, you can earn additional cash every month because you've got high quality
    content. If you want to know how to make extra $$$, search for:
    Boorfe's tips best adsense alternative

Leave a Reply

Your email address will not be published. Required fields are marked *