באחד מהפוסטים הקודמים כתבתי על Hadoop – אחת המערכות הנפוצות בעולם לניהול ולניתוח Big Data. היום ארצה להתמקד ולהסביר בצורה פשוטה מהו ה- HDFS – מערכת הקבצים של Hadoop, ומהו MapReduce – הטכנולוגיה המרכזית בה האדופ משתמשת כדי לנתח את הנתונים הנמצאים בה.
אחסון נתונים באמצעות HDFS
כדי להבין מהו MapReduce, ראשית יש להבין מהו ה HDFS – הטכנולוגיה בה האדופ משתמשת כדי לשמור את ולנהל את מערכת הקבצים.
כיום צואר הבקבוק העיקרי במסדי נתונים הוא I/O. בקצבים מאסיביים, הדיסקים הפיזיים בשרתי ה- Database יכולים לתת מענה עד רמה מסויימת (של בקשות קריאה\כתיבה), והגישה בה אנו מחליפים שרת אחד בשרת חזק יותר לא ישימה לאורך זמן. גרייס הופר פעם אמרה – בימים בהם היו חורשים את האדמה באמצעות שוורים, ושור אחד לא היה מתאים יותר למשימה, אנשים לא ניסו לגדל שור יותר חזק, אלא במקום – אנשים היו מצרפים עוד שוורים למלאכת החרישה. את אותה גישה יש לאמץ גם בתחום עיבוד הנתונים 🙂
באמצעות ה- Hadoop Distributed File System נתונים לא מתקבצים יותר תחת מכונה אחת, אלא על פני מספר מכונות. אם בעבר היינו קוראים\כותבים קובץ של 50 ג’יגה מתוך מכונה אחת, היום נוכל לקרוא\לכתוב באמצעות מספר מכונות במקביל ובכך לשפר את ביצועי ה- I\O (אם פיזרנו את הנתונים על פני 5 מכונות לדוגמה, קיבלנו ביצועים טובים פי 5. כל מכונה צריכה לקרוא\לכתוב רק חמישית מהנתונים).
בתרשים מטה ניתן לראות דוגמה לחלוקת קובץ בגודל 150 מגה, המתפזר על פני שלוש מכונות.
ניתוח נתונים באמצעות MapReduce
MapReduce היא לוגיקה אשר מאפשרת חילוץ נתונים מתוך מערכת הקבצים של Hadoop בצורה מקבילית.
כדי להסביר כיצד היא עובדת אשתמש בדוגמה הבאה: דמיינו לעצמם ספר המתאר את מכירות חברה מסויימת בשנת 2013. בכל עמוד בספר ניתן למצוא 3 עמודות – עיר, תאריך וסכום מכירה :
קבוצה של ארבעה אנשים התבקשו לקחת את הנתונים הנמצאים בספר ולהציג את סכום המכירה לפי כל עיר. אם נתרגם את הבקשה לשאילתת 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).
Reduce
בשלב השני, לאחר שכל אחד מהאנשים ביצע את המיפוי הרלוונטי לרבעון שלו, אנו נבחר אדם או קבוצה של אנשים אשר יהיו אחראים על מלאכת הקיבוץ, ה Reduce. לכל אדם בתוך קבוצה זו אנו נגדיר ערים אשר נמצאים בתוך תחום אחריותו, בהתאם הוא יקבל את המיפויים השונים ויאגד אותם לפי מה שהתבקש (ממוצע \ סכימה \ ערך מקסימלי \ מינימלי וכד’).
לאחר ששלב זה הסתיים, נוכל לקבל חזרה את המידע אותו רצינו – סכום מכירה עבור ערים שונות.
חשוב לזכור ש Map Reduce נועדה לניתוח כמויות גדולות של נתונים, אם קיים צורך לנתח נתונים על כמות רשומות בינונית \ נמוכה, לרוב מאגרי מידע טבלאיים יהוו אלטרנטיבה טובה יותר. בנוסף, בצורת עיבוד זו, השונה מהעיבוד הרציף, יכולת העיבוד תמיד נמצאת ביחס לינארי לכמות המשאבים העומדים לרשותה. ככל שנוסיף יותר משאבים כך הביצועים שלנו ישתפרו (אם כרגע קיימים 10 מכונות ב Cluster ואנחנו רוצים שיפור של 100% בביצועים, אנחנו נוסיף עוד 10 מכונות ונגיע ל 20 סה”כ).
כפי שכותרת הפוסט ציינה, מאמר זה מנסה להסביר את הקונספטים הטכניים של Hadoop בצורה נוחה וברורה, כדי לאפשר הבנה קונספטואלית התיאורים בהם השתמשתי נוסחו בכוונה בצורה פשטנית. מחילת הארנב (או הפיל, אם להיות מדוייקים 🙂 ) של Hadoop עמוקה, ועל HDFS ו Map Reduce, נושאים מרתקים בעיני, יש עוד הרבה מה ללמוד ולהכיר.