MapReduce هي طريقة ثابتة لموازنة استعلامات البيانات بشكل متوازي ، ولكن هل يمكن لهذا البديل تقديم المزيد من الفوائد؟
الماخذ الرئيسية
- MapReduce وخط أنابيب التجميع هما طريقتان لمعالجة البيانات المعقدة في MongoDB. إطار التجميع أحدث وأكثر كفاءة.
- يتضمن MapReduce تحديد خريطة منفصلة وتقليل الوظائف باستخدام JavaScript ، بينما يستخدم خط أنابيب التجميع عوامل تشغيل MongoDB المضمنة.
- ينصح MongoDB بخط أنابيب التجميع للحصول على أداء أفضل ، ولكن MapReduce يوفر مزيدًا من المرونة ومناسبًا لأنظمة الملفات الموزعة مثل Hadoop.
MapReduce وخط أنابيب التجميع هما طريقتان يمكنك استخدامهما للتعامل مع معالجة البيانات المعقدة في MongoDB. إطار التجميع هو أحدث ومعروف بكفاءته. لكن بعض المطورين ما زالوا يفضلون التمسك بـ MapReduce ، والذي يعتبرونه أكثر راحة.
من الناحية العملية ، تريد اختيار إحدى طرق الاستعلام المعقدة هذه لأنها تحقق نفس الهدف. ولكن كيف تعمل؟ كيف هم مختلفون ، وما الذي يجب أن تستخدمه؟
كيف يعمل MapReduce في MongoDB
يتيح لك MapReduce في MongoDB إجراء حسابات معقدة على حجم كبير من البيانات وتجميع النتيجة في جزء أكثر شمولاً. تتميز طريقة MapReduce بوظيفتين: تعيين وتقليل.
أثناء العمل مع MapReduce في MongoDB ، ستقوم بتحديد الخريطة وتقليل الوظائف بشكل منفصل باستخدام JavaScript وإدراج كل منها في المدمج في mapReduce استفسار.
تقوم وظيفة الخريطة أولاً بتقسيم البيانات الواردة إلى أزواج ذات قيمة رئيسية — عادةً ما تستند إلى التجميع المعين. هذا هو المكان الذي تحدد فيه الطريقة التي تريد تجميع البيانات بها. تقوم وظيفة التصغير بعد ذلك بتشغيل حسابات مخصصة على القيم الموجودة في كل مجموعة بيانات وتجميع النتيجة في مجموعة منفصلة مخزنة في قاعدة البيانات.
كيف يعمل خط أنابيب التجميع في MongoDB
يعتبر خط أنابيب التجميع في MongoDB بديلاً محسنًا لبرنامج MapReduce. مثل MapReduce ، يسمح لك بإجراء عمليات حسابية معقدة وتحويلات البيانات مباشرة داخل قاعدة البيانات. لكن التجميع لا يتطلب كتابة وظائف JavaScript مخصصة يمكن أن تقلل من أداء الاستعلام.
بدلاً من ذلك ، يستخدم مشغلات MongoDB المضمنة لمعالجة البيانات وتجميعها وحسابها. ثم يقوم بتجميع النتائج بعد كل استعلام. وبالتالي ، يكون خط أنابيب التجميع أكثر قابلية للتخصيص حيث يمكنك هيكلة الإخراج كما تريد.
كيف تختلف الاستعلامات بين MapReduce والتجميع
افترض أنك تريد حساب إجمالي مبيعات العناصر بناءً على فئات المنتجات. في حالة 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 داخل متغيرات بايثون. يقوم الكود بتمريرها إلى ملف 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 ، حيث أن الأول أكثر كفاءة.
حاولنا تأكيد هذا الادعاء أثناء تشغيل الاستعلامات في القسم السابق. وعند تنفيذه جنبًا إلى جنب على جهاز ذاكرة الوصول العشوائي سعة 12 جيجابايت ، بدا أن خط أنابيب التجميع كان أسرع ، حيث بلغ متوسطه 0.014 ثانية أثناء التنفيذ. استغرق تشغيل نفس الجهاز 0.058 ثانية في المتوسط لتشغيل استعلام MapReduce.
هذا ليس معيارًا لاستنتاجه بشأن أدائهم ، ولكن يبدو أنه يدعم توصية MongoDB. قد تعتبر هذا الفارق الزمني غير مهم ، لكنه سيضيف بشكل كبير عبر آلاف أو ملايين الاستعلامات.
إيجابيات وسلبيات MapReduce
ضع في اعتبارك الجوانب الإيجابية والسلبية لـ MapReduce لتحديد المكان الذي تتفوق فيه في معالجة البيانات.
الايجابيات
- يوفر مزيدًا من المرونة في التخصيص نظرًا لأنك تكتب الخريطة وتقليل الوظائف بشكل منفصل.
- يمكنك بسهولة حفظ الإخراج في مجموعة MongoDB جديدة داخل قاعدة البيانات.
- يمكنك استخدام MapReduce في أنظمة الملفات الموزعة مثل Hadoop ، الذي يتكامل بسهولة مع MongoDB.
- إن دعمه للبرمجة النصية للجهات الخارجية يجعله أكثر قابلية للتطوير وسهل التعلم من خط أنابيب التجميع. لذلك يمكن لأي شخص لديه خلفية تطوير JavaScript تنفيذ MapReduce.
سلبيات
- يتطلب البرمجة النصية لجهة خارجية ؛ هذا يساهم في أدائها أقل من خط أنابيب التجميع.
- يمكن أن يكون MapReduce غير فعال للذاكرة ، ويتطلب عدة عقد ، خاصة عند التعامل مع البيانات شديدة التعقيد.
- إنه غير مناسب لمعالجة البيانات في الوقت الفعلي لأن الاستعلام يمكن أن يكون بطيئًا.
إيجابيات وسلبيات خط التجميع
ماذا عن خط أنابيب التجميع؟ يوفر النظر في نقاط القوة والضعف فيه المزيد من البصيرة.
الايجابيات
- يكون الاستعلام متعدد المراحل ، وعادة ما يكون أقصر وأكثر إيجازًا وأكثر قابلية للقراءة.
- يعتبر خط أنابيب التجميع أكثر كفاءة ، حيث يقدم تحسينًا كبيرًا على MapReduce.
- وهو يدعم عوامل تشغيل MongoDB المضمنة التي تتيح لك تصميم استعلامك بمرونة.
- يدعم معالجة البيانات في الوقت الحقيقي.
- يمكن استيعاب خط التجميع بسهولة في MongoDB ولا يتطلب برمجة نصية من طرف ثالث.
- أنت تستطيع إنشاء مجموعة MongoDB جديدة للمخرجات إذا كنت بحاجة إلى حفظها.
سلبيات
- قد لا تكون مرنة مثل MapReduce عند التعامل مع هياكل البيانات الأكثر تعقيدًا. نظرًا لأنه لا يستخدم برمجة نصية لجهة خارجية ، فإنه يقيدك بطريقة معينة لتجميع البيانات.
- يمكن أن يكون منحنى التنفيذ والتعلم تحديًا للمطورين ذوي الخبرة القليلة أو المعدومة مع MongoDB.
متى يجب استخدام MapReduce أو خط أنابيب التجميع؟
بشكل عام ، من الأفضل مراعاة متطلبات معالجة البيانات عند الاختيار بين MapReduce وخط أنابيب التجميع.
من الناحية المثالية ، إذا كانت بياناتك أكثر تعقيدًا ، وتتطلب منطقًا وخوارزميات متقدمة في نظام ملفات موزع ، فيمكن أن يكون MapReduce مفيدًا. هذا لأنه يمكنك بسهولة تخصيص وظائف تقليل الخريطة وحقنها في عدة عقد. انتقل إلى MapReduce إذا كانت مهمة معالجة البيانات الخاصة بك تتطلب قابلية التوسع الأفقي على الكفاءة.
من ناحية أخرى ، يعد خط أنابيب التجميع أكثر ملاءمة لحساب البيانات المعقدة التي لا تتطلب منطقًا أو خوارزميات مخصصة. إذا كانت بياناتك موجودة في MongoDB فقط ، فمن المنطقي استخدام خط أنابيب التجميع لأنه يتميز بالعديد من المشغلين المدمجين.
خط أنابيب التجميع هو الأفضل أيضًا لمعالجة البيانات في الوقت الفعلي. إذا كانت متطلبات الحساب الخاصة بك تعطي الأولوية للكفاءة على العوامل الأخرى ، فأنت تريد اختيار خط أنابيب التجميع.
قم بتشغيل الحسابات المعقدة في MongoDB
على الرغم من أن كلتا طريقتين MongoDB عبارة عن استعلامات معالجة بيانات ضخمة ، إلا أنهما تشتركان في الكثير من الاختلافات. بدلاً من استرداد البيانات قبل إجراء العمليات الحسابية ، والتي يمكن أن تكون أبطأ ، تقوم كلتا الطريقتين بإجراء حسابات مباشرة على البيانات المخزنة في قاعدة البيانات ، مما يجعل الاستعلامات أكثر كفاءة.
ومع ذلك ، فإن أحدهما يحل محل الآخر في الأداء ، وقد خمنت بشكل صحيح. يتفوق خط أنابيب التجميع على MapReduce في الكفاءة والأداء. ولكن بينما قد ترغب في استبدال MapReduce بخط أنابيب التجميع بأي ثمن ، لا تزال هناك مناطق محددة من التطبيق حيث يكون استخدام MapReduce أكثر منطقية.