MapReduce היא דרך מבוססת להקביל שאילתות נתונים, אך האם האלטרנטיבה הזו יכולה להציע אפילו יותר יתרונות?

טייק אווי מפתח

  • MapReduce וצינור הצבירה הן שתי שיטות לעיבוד נתונים מורכבים ב- MongoDB. מסגרת הצבירה חדשה ויעילה יותר.
  • MapReduce כולל ציון מפה נפרדת והפחתת פונקציות באמצעות JavaScript, בעוד שצינור הצבירה משתמש באופרטורים מובנים של MongoDB.
  • צינור הצבירה מומלץ על ידי MongoDB לביצועים טובים יותר, אך MapReduce מציע גמישות רבה יותר ומתאים למערכות קבצים מבוזרות כמו Hadoop.

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

למעשה, אתה רוצה לבחור אחת משיטות השאילתה המורכבות הללו מכיוון שהן משיגות את אותה מטרה. אבל איך הם עובדים? במה הם שונים, ובאיזה כדאי להשתמש?

איך MapReduce עובד ב- MongoDB

MapReduce ב-MongoDB מאפשר לך להריץ חישובים מורכבים על נפח גדול של נתונים ולרכז את התוצאה לנתח מקיף יותר. שיטת MapReduce כוללת שתי פונקציות: מפה והקטנה.

instagram viewer

תוך כדי עבודה עם MapReduce ב-MongoDB, תציין את המפה ואת פונקציות ההפחתה בנפרד באמצעות JavaScript ותכניס כל אחת מהן לתוך המובנה mapReduce שאילתא.

פונקציית המפה מפצלת תחילה את הנתונים הנכנסים לזוגות מפתח-ערך - בדרך כלל על סמך קיבוץ ממופה. זה המקום שבו אתה מציין כיצד אתה רוצה לקבץ את הנתונים. פונקציית ההפחתה מריצה חישובים מותאמים אישית על הערכים בכל קבוצת נתונים ומצבירה את התוצאה לאוסף נפרד המאוחסן במסד הנתונים.

כיצד פועל צינור הצבירה ב- MongoDB

צינור הצבירה ב- MongoDB הוא חלופה משופרת ל- MapReduce. כמו MapReduce, הוא מאפשר לך לבצע חישובים מורכבים והמרת נתונים ישירות בתוך מסד הנתונים. אבל צבירה אינה מצריכה כתיבת פונקציות JavaScript ייעודיות שיכולות להפחית את ביצועי השאילתות.

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

כיצד שאילתות שונות בין MapReduce ל-Aggregation

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

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

בואו נפתור את תרחיש הבעיה הזה באמצעות MapReduce וצינור צבירה כדי להבדיל בין השאילתות לשיטות פתרון הבעיות שלהם.

שיטת MapReduce

שימוש ב-Python כשפת התכנות הבסיסית, ה- mapReduce השאילתה של תרחיש הבעיה שתואר קודם לכן נראית כך:

import pymongo

client = pymongo.MongoClient(
"mongodb://localhost/"
)

db = client.my_database

sales = db["sales"]

map_function =
function() {
emit(this.Section, this.Sold);
}

reduce_function =
function(key, values) {
return Array.sum(values);
}

result = db.command(
"mapReduce",
"sales",
map=map_function,
reduce=reduce_function,
out="section_totals"
)

doc = [doc for doc in db.section_totals.find()]
print(doc)

אם תפעיל את זה מול הנתונים המקוריים לדוגמה, תראה פלט כך:

[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]

תסתכל מקרוב, ואתה אמור לראות שהמפה ומעבדי ההפחתה כן פונקציות JavaScript בתוך משתני Python. הקוד מעביר את אלה ל- mapReduce שאילתה, המציינת אוסף פלט ייעודי (סיכומי_סך).

שימוש בצינור צבירה

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

import pymongo
client = pymongo.MongoClient("mongodb://localhost/")
db = client.funmi
sales = db["sales"]

pipeline = [
{
"$group": {
"_id": "$Section",
"totalSold": { "$sum": "$Sold" }
}
},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$totalSold"
}
}
]

result = list(sales.aggregate(pipeline))
print(result)

הפעלת שאילתת צבירה זו תיתן את התוצאות הבאות, הדומות לתוצאות מגישת MapReduce:

[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]

ביצועים ומהירות שאילתות

צינור הצבירה הוא גרסה מעודכנת של MapReduce. MongoDB ממליצה להשתמש בצינור הצבירה במקום MapReduce, מכיוון שהראשון יעיל יותר.

ניסינו לטעון טענה זו תוך כדי הפעלת השאילתות בסעיף הקודם. וכאשר בוצע זה לצד זה במכונת זיכרון RAM של 12GB, נראה היה שצינור הצבירה מהיר יותר, בממוצע של 0.014 שניות במהלך הביצוע. לקח לאותה מכונה בממוצע 0.058 שניות להפעיל את שאילתת MapReduce.

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

היתרונות והחסרונות של MapReduce

שקול את היתרונות והחסרונות של MapReduce כדי לקבוע היכן הוא מצטיין בעיבוד נתונים.

יתרונות

  • זה נותן יותר גמישות להתאמה אישית מכיוון שאתה כותב את המפה ומצמצם פונקציות בנפרד.
  • אתה יכול בקלות לשמור את הפלט לתוך אוסף MongoDB חדש בתוך מסד הנתונים.
  • אתה יכול להשתמש MapReduce במערכות קבצים מבוזרות כמו Hadoop, שמשתלבת בקלות עם MongoDB.
  • התמיכה שלו בסקריפטים של צד שלישי הופכת אותו לניתן להרחבה וקל ללמידה מאשר צינור הצבירה. אז מישהו עם רקע פיתוח JavaScript יכול ליישם את MapReduce.

חסרונות

  • זה דורש סקריפטים של צד שלישי; זה תורם לביצועים נמוכים יותר מאשר צינור הצבירה.
  • MapReduce יכול להיות לא יעיל בזיכרון, ודורש מספר צמתים, במיוחד כאשר מתמודדים עם נתונים מורכבים מדי.
  • זה לא מתאים לעיבוד נתונים בזמן אמת מכיוון שהשאילתה יכולה להיות איטית.

יתרונות וחסרונות של צינור הצבירה

מה לגבי צינור הצבירה? התחשבות בחוזקות ובחולשות שלה מספקת יותר תובנה.

יתרונות

  • השאילתה היא רב-שלבית, בדרך כלל קצרה יותר, תמציתית יותר וקריאה יותר.
  • צינור הצבירה יעיל יותר, ומציע שיפור משמעותי לעומת MapReduce.
  • הוא תומך באופרטורים מובנים של MongoDB המאפשרים לך לעצב את השאילתה שלך בצורה גמישה.
  • זה תומך בעיבוד נתונים בזמן אמת.
  • צינור הצבירה ניתן לבליעה בקלות לתוך MongoDB ואינו דורש סקריפטים של צד שלישי.
  • אתה יכול צור אוסף MongoDB חדש עבור הפלטים אם אתה צריך לשמור אותם.

חסרונות

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

מתי כדאי להשתמש ב-MapReduce או ב-Aggregation Pipeline?

באופן כללי, עדיף לקחת בחשבון את דרישות עיבוד הנתונים שלך בעת הבחירה בין MapReduce לצינור הצבירה.

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

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

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

הפעל חישובים מורכבים ב- MongoDB

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

עם זאת, אחד מחליף את השני בביצועים, וניחשתם נכון. צינור הצבירה גובר על MapReduce ביעילות ובביצועים. אבל בעוד שאולי תרצה להחליף את MapReduce בצינור הצבירה בכל מחיר, עדיין ישנם תחומי יישום ספציפיים שבהם השימוש ב- MapReduce הגיוני יותר.