באחד מהפוסטים הקודמים כתבתי על Hadoop – אחת המערכות הנפוצות בעולם לניהול ולניתוח Big Data.  היום ארצה להתמקד ולהסביר בצורה פשוטה מהו ה- HDFS – מערכת הקבצים של Hadoop, ומהו MapReduce – הטכנולוגיה המרכזית בה האדופ משתמשת כדי לנתח את הנתונים הנמצאים בה.

אחסון נתונים באמצעות HDFS

כדי להבין מהו MapReduce, ראשית יש להבין מהו ה HDFS – הטכנולוגיה בה האדופ משתמשת כדי לשמור את ולנהל את מערכת הקבצים.

כיום צואר הבקבוק העיקרי במסדי נתונים הוא I/O. בקצבים מאסיביים, הדיסקים הפיזיים בשרתי ה- Database יכולים לתת מענה עד רמה מסויימת (של בקשות קריאה\כתיבה), והגישה בה אנו מחליפים שרת אחד בשרת חזק יותר לא ישימה לאורך זמן. גרייס הופר פעם אמרה – בימים בהם היו חורשים את האדמה באמצעות שוורים, ושור אחד לא היה מתאים יותר למשימה, אנשים לא ניסו לגדל שור יותר חזק, אלא במקום – אנשים היו מצרפים עוד שוורים למלאכת החרישה. את אותה גישה יש לאמץ גם בתחום עיבוד הנתונים 🙂

באמצעות ה- Hadoop Distributed File System נתונים לא מתקבצים יותר תחת מכונה אחת, אלא על פני מספר מכונות. אם בעבר היינו קוראים\כותבים קובץ של 50 ג’יגה מתוך מכונה אחת, היום נוכל לקרוא\לכתוב באמצעות מספר מכונות במקביל ובכך לשפר את ביצועי ה- I\O (אם פיזרנו את הנתונים על פני 5 מכונות לדוגמה, קיבלנו ביצועים טובים פי 5. כל מכונה צריכה לקרוא\לכתוב רק חמישית מהנתונים).

בתרשים מטה ניתן לראות דוגמה לחלוקת קובץ בגודל 150 מגה, המתפזר על פני שלוש מכונות.

Hadoop HDFS

ניתוח נתונים באמצעות MapReduce

MapReduce היא לוגיקה אשר מאפשרת חילוץ נתונים מתוך מערכת הקבצים של Hadoop בצורה מקבילית.

Hadoop Map Reduce

כדי להסביר כיצד היא עובדת אשתמש בדוגמה הבאה: דמיינו לעצמם ספר המתאר את מכירות חברה מסויימת בשנת 2013. בכל עמוד בספר ניתן למצוא 3 עמודות – עיר, תאריך וסכום מכירה :

Map Reduce דוגמא

קבוצה של ארבעה אנשים התבקשו לקחת את הנתונים הנמצאים בספר ולהציג את סכום המכירה לפי כל עיר. אם נתרגם את הבקשה לשאילתת SQL, הבקשה תראה כך :

SELECT SUM(sales), City
FROM sales_2013
GROUP BY city

עיבוד רציף – אם אותה קבוצה החליטה למנות אדם אחד שיבצע את המטלה, הצורה בה הוא היה ייגש לסכימת הנתונים תהיה רציפה (הוא יקרא את הנתונים שורה אחר שורה, ירשום בצד את הערכים לפי הערים השונות ויבצע את הסכימה) – זוהי הגישה הקלאסית של ניתוח ה- Data בעולם הנתונים הרלציוני.

עיבוד מקבילי – לעומת זאת, אם הפעם אותה קבוצה תנהל אסטרטגיה אחרת: כל אחד מהאנשים בקבוצה יקבל רבע מהנתונים (לדוגמה כל אדם יעבוד על רבעון אחר),  ובשלב הראשון יבצע על הנתונים שהוא קיבל מיפוי.

Map

בשלב הראשון כל אדם, עבור הרבעון שהוא קיבל, יעבור על הרשומות ויכתוב את העיר ואת כל סכומי המכירה הרלוונטיים עבורה. אם נניח כי הנתונים אשר צורפו מעלה מייצגים את המכירות ברבעון הראשון, התוצאה הרצויה תראה כך :

Haifa - 33.45, 15.99, 67.90
Tel Aviv - 22.12, 33.12, 43.20
Jerusalem - 41.70, 45.30

שלב זה ניקרא שלב המיפוי, בשלב זה בו אנו ממפים מפתח (Key) לערכים הרלוונטיים עבורו (Values).

Map Reduce דוגמא

Reduce

בשלב השני, לאחר שכל אחד מהאנשים ביצע את המיפוי הרלוונטי לרבעון שלו, אנו נבחר אדם או קבוצה של אנשים אשר יהיו אחראים על מלאכת הקיבוץ, ה Reduce. לכל אדם בתוך קבוצה זו אנו נגדיר ערים אשר נמצאים בתוך תחום אחריותו, בהתאם הוא יקבל את המיפויים השונים ויאגד אותם לפי מה שהתבקש (ממוצע \ סכימה \ ערך מקסימלי \ מינימלי וכד’).

Map Reduce דוגמא

לאחר ששלב זה הסתיים, נוכל לקבל חזרה את המידע אותו רצינו – סכום מכירה עבור ערים שונות.

חשוב לזכור ש Map Reduce נועדה לניתוח כמויות גדולות של נתונים, אם קיים צורך לנתח נתונים על כמות רשומות בינונית \ נמוכה, לרוב מאגרי מידע טבלאיים יהוו אלטרנטיבה טובה יותר. בנוסף, בצורת עיבוד זו, השונה מהעיבוד הרציף, יכולת העיבוד תמיד נמצאת ביחס לינארי לכמות המשאבים העומדים לרשותה. ככל שנוסיף יותר משאבים כך הביצועים שלנו ישתפרו (אם כרגע קיימים 10 מכונות ב Cluster ואנחנו רוצים שיפור של 100% בביצועים, אנחנו נוסיף עוד 10 מכונות ונגיע ל 20 סה”כ).

כפי שכותרת הפוסט ציינה, מאמר זה מנסה להסביר את הקונספטים הטכניים של Hadoop בצורה נוחה וברורה, כדי לאפשר הבנה קונספטואלית התיאורים בהם השתמשתי נוסחו בכוונה בצורה פשטנית. מחילת הארנב (או הפיל, אם להיות מדוייקים 🙂 ) של Hadoop עמוקה, ועל HDFS ו Map Reduce, נושאים מרתקים בעיני, יש עוד הרבה מה ללמוד ולהכיר.