Contents

Map-Reduce vs. Aggregation Pipeline ใน MongoDB

ประเด็นที่สำคัญ

MapReduce ซึ่งเป็นเทคนิคที่ใช้โดย MongoDB สำหรับการจัดการข้อมูลที่ซับซ้อน ถูกแทนที่โดย Aggregation Pipeline ในแง่ของประสิทธิภาพและความแปลกใหม่

MapReduce ใน MongoDB มีกลไกในการประมวลผลชุดข้อมูลขนาดใหญ่โดยแบ่งเป็นส่วนเล็กๆ และกระจายงานไปยังโหนดต่างๆ ในคลัสเตอร์ วิธีการนี้ช่วยให้สามารถประมวลผลข้อมูลแบบขนานได้อย่างมีประสิทธิภาพ ในทางตรงกันข้าม กรอบการรวมต้องอาศัยตัวดำเนินการในตัวเพื่อดำเนินการ เช่น การกรอง การเรียงลำดับ และการจัดกลุ่มในชุดข้อมูลที่จัดเก็บภายในฐานข้อมูล ตัวดำเนินการเหล่านี้ได้รับการออกแบบมาให้ใช้กับประเภทข้อมูลเฉพาะ และให้กระบวนการที่คล่องตัวมากขึ้นเมื่อเทียบกับการปรับแต่งที่จำเป็นใน MapReduce

MongoDB แนะนำให้ใช้ไปป์ไลน์การรวมเพื่อเพิ่มประสิทธิภาพ อย่างไรก็ตาม MapReduce ให้ความสามารถรอบด้านในระดับที่สูงกว่าและเหมาะสำหรับระบบไฟล์แบบกระจายเช่นที่พบใน Hadoop

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

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

วิธีการทำงานของ MapReduce ใน MongoDB

การทำแผนที่และการลด

ในขณะที่ใช้ MapReduce ในบริบทของ MongoDB ผู้ใช้จะอธิบายการทำแผนที่และการดำเนินการลดขนาดโดยอิสระโดยใช้ JavaScript และรวมเข้าด้วยกันตามลำดับในโครงสร้างแบบสอบถาม mapReduce โดยธรรมชาติ

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

วิธีการทำงานของ Aggregation Pipeline ใน MongoDB

ไปป์ไลน์การรวมของ MongoDB ทำหน้าที่เป็นตัวแทนที่ขั้นสูงสำหรับ MapReduce ทำให้ผู้ใช้สามารถดำเนินการคำนวณที่ซับซ้อนและจัดการข้อมูลภายในฐานข้อมูลได้ ตรงกันข้ามกับ MapReduce ซึ่งจำเป็นต้องสร้างฟังก์ชัน JavaScript เฉพาะที่ปรับแต่งมาเพื่อเพิ่มประสิทธิภาพการสืบค้น กระบวนการรวมจะขจัดความต้องการนี้ ส่งผลให้มีฟังก์ชันการทำงานที่คล่องตัวในขณะที่รักษาความสามารถที่มีประสิทธิภาพสูง

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

ข้อความค้นหาแตกต่างกันอย่างไรระหว่าง MapReduce และ Aggregation

ในการกำหนดตัวเลขยอดขายรวมสำหรับประเภทผลิตภัณฑ์ต่างๆ โดยใช้เฟรมเวิร์ก MapReduce พร้อมการรวมข้อมูล ประเภทผลิตภัณฑ์จะทำหน้าที่เป็นตัวระบุเฉพาะหรือ"คีย์"ในขณะที่ผลรวมย่อยของการขายสินค้าแต่ละรายการจะประกอบเป็น"ค่า"ที่เกี่ยวข้องสำหรับแต่ละคีย์ที่เกี่ยวข้อง

จากคำชี้แจงปัญหาเฉพาะและชุดข้อมูลประกอบ การให้ตัวอย่างข้อมูลที่เป็นตัวแทนมักจะเป็นประโยชน์เพื่อแสดงลักษณะและโครงสร้างของข้อมูล ในกรณีของคำชี้แจงปัญหาที่ให้มา ชุดข้อมูลดิบสมมุติฐานอาจแสดงดังต่อไปนี้:pythonimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifier from sklearn.metrics import Accuracy_scoredf=pd.read_csv(‘data.csv’) # อ่านใน dataframe จากไฟล์ CSVX=df[[‘feature1’,‘feature2’]] # เลือก featuresy ที่เกี่ยวข้อง=df[’target’] # target variabletrain_size=int(0.8 * len(df)) # /th/images/sample-data-mongodb.jpg

เราสามารถแก้ไขปัญหานี้ได้โดยใช้กรอบงาน 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
}] 

เมื่อตรวจสอบอย่างใกล้ชิด เราสามารถสังเกตได้ว่าตัวประมวลผล Map และ Reduce ภายในสคริปต์นี้ถูกห่อหุ้มเป็นฟังก์ชัน JavaScript ซึ่งบรรจุอยู่ภายในตัวแปร Python ตัวแปรเหล่านี้จะถูกส่งต่อไปยังคิวรี MapReduce ซึ่งจะนำทางไปยังคอลเล็กชันเอาต์พุตที่จัดสรรซึ่งแสดงด้วยชื่อ “section\_totals”

การใช้ไปป์ไลน์การรวม

การรวมไปป์ไลน์การรวมทำให้ได้ผลลัพธ์ที่คล่องตัวและตรงไปตรงมามากขึ้นเมื่อเทียบกับวิธีเดิม ต่อไปนี้แสดงให้เห็นถึงกระบวนการดังกล่าวโดยใช้ไปป์ไลน์การรวม:

 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
}] 

ประสิทธิภาพการค้นหาและความเร็ว

MongoDB สนับสนุนการใช้ไปป์ไลน์การรวมขั้นสูงเหนือ MapReduce แบบดั้งเดิม เนื่องจากประสิทธิภาพที่เพิ่มขึ้นและฟังก์ชันการทำงานที่คล่องตัว

เราทำการทดลองในส่วนที่แล้วโดยพยายามยืนยันการอ้างสิทธิ์ของเราโดยดำเนินการค้นหาพร้อมกันบนคอมพิวเตอร์ที่มี RAM ขนาด 12 กิกะไบต์ ผลลัพธ์ระบุว่าไปป์ไลน์การรวมมีประสิทธิภาพมากขึ้น โดยใช้เวลาเฉลี่ยเพียง 0.014 วินาทีในการดำเนินการ ในทางตรงกันข้าม ระบบเดียวกันใช้เวลาประมาณ 0.058 วินาทีในการประมวลผลแบบสอบถาม MapReduce

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

ข้อดีและข้อเสียของ MapReduce

ประเมินข้อดีและข้อเสียของ MapReduce เพื่อระบุจุดแข็งในการประมวลผลข้อมูล

ข้อดี

RDD ของ Apache Spark ใช้ประโยชน์จากการใช้งานทั้งแผนที่และฟังก์ชันลดขนาดที่แยกจากกัน ทำให้มีระดับความสามารถในการปรับตัวเพิ่มขึ้น ทำให้ผู้ใช้สามารถปรับแต่งไปป์ไลน์การประมวลผลตามความต้องการเฉพาะได้

การใช้การรวมแอปพลิเคชันนี้เข้ากับ MongoDB อย่างราบรื่น ผู้ใช้สามารถจัดเก็บเอาต์พุตที่สร้างขึ้นได้อย่างง่ายดายในคอลเล็กชันที่สร้างขึ้นใหม่ภายในฐานข้อมูลของตน

MapReduce เป็นเครื่องมืออันทรงพลังที่สามารถใช้งานภายในระบบไฟล์แบบกระจาย เช่น ที่พบใน Hadoop เพื่อรวมเข้ากับ MongoDB ได้อย่างราบรื่น

ข้อดีของความเข้ากันได้กับภาษาสคริปต์ภายนอก เช่น JavaScript ช่วยเพิ่มทั้งความสามารถในการปรับขนาดและความสามารถในการเข้าถึง ทำให้ง่ายขึ้นสำหรับบุคคลที่มีประสบการณ์ในการเขียนโปรแกรมมาก่อนเพื่อใช้แนวคิด MapReduce อย่างมีประสิทธิภาพ

ข้อเสีย

การใช้ทรัพยากรสคริปต์ภายนอกเป็นสิ่งที่จำเป็นสำหรับการนำวิธีนี้ไปใช้ ซึ่งส่งผลให้ประสิทธิภาพลดลงอย่างหลีกเลี่ยงไม่ได้เมื่อเปรียบเทียบกับไปป์ไลน์การรวม

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

การประมวลผลข้อมูลแบบเรียลไทม์อาจก่อให้เกิดความท้าทายบางประการ เนื่องจากการสืบค้นอาจได้รับผลกระทบในทางลบจากประสิทธิภาพที่ช้าลงเมื่อเทียบกับสถานการณ์ที่ไม่ใช่แบบเรียลไทม์

ข้อดีและข้อเสียของท่อรวม

การตรวจสอบไปป์ไลน์การรวมในรายละเอียดที่มากขึ้น โดยพิจารณาทั้งข้อดีและข้อเสีย ทำให้เกิดความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับความสามารถของมัน

ข้อดี

การสอบถามมีแนวโน้มที่จะมีหลายแง่มุมโดยธรรมชาติ โดดเด่นด้วยความกระชับ ความชัดเจน และง่ายต่อการเข้าใจ

การใช้งานไปป์ไลน์การรวมแสดงให้เห็นถึงการปรับปรุงประสิทธิภาพที่น่าประทับใจเมื่อเทียบกับวิธีการ MapReduce แบบดั้งเดิม ซึ่งส่งผลให้มีการอัปเกรดประสิทธิภาพที่น่าจดจำ

แอปพลิเคชั่นนี้มีชุดตัวดำเนินการ MongoDB แบบบูรณาการที่ครอบคลุม ช่วยให้ผู้ใช้สร้างแบบสอบถามที่มีความเก่งกาจและความสามารถในการปรับตัวที่น่าทึ่ง

⭐รองรับการประมวลผลข้อมูลแบบเรียลไทม์

การรวมไปป์ไลน์การรวมเข้ากับ MongoDB สามารถทำได้อย่างราบรื่นโดยไม่ต้องพึ่งพาสคริปต์หรือซอฟต์แวร์ภายนอก

คุณมีตัวเลือกในการสร้างคอลเลกชันใหม่ภายในฐานข้อมูล MongoDB ของคุณเพื่อจัดเก็บผลลัพธ์ที่สร้างขึ้น หากคุณต้องการรักษาไว้

ข้อเสีย

ข้อจำกัดที่กำหนดโดยวิธีการของ Flink ในการประมวลผลข้อมูลเมื่อเปรียบเทียบกับโมเดล MapReduce ของ Apache Spark นั้นอาจไม่แสดงความสามารถในการปรับตัวและความคล่องตัวในระดับเดียวกันเมื่อจัดการโครงสร้างข้อมูลที่ซับซ้อน นี่เป็นเพราะการพึ่งพาการประมวลผลสตรีมมากกว่าการใช้ภาษาสคริปต์ภายนอกสำหรับการรวมข้อมูล ซึ่งจะจำกัดช่วงของวิธีการที่ใช้ได้สำหรับการจัดการข้อมูล

ความสามารถที่จำเป็นในการใช้ประโยชน์อย่างมีประสิทธิภาพและเข้าใจความซับซ้อนของการปรับใช้ MongoDB อาจเป็นอุปสรรคอย่างน่ากลัวสำหรับโปรแกรมเมอร์ที่ยังใหม่กับระบบฐานข้อมูลนี้ ซึ่งขาดการสัมผัสกับฟีเจอร์และฟังก์ชันต่างๆ ก่อนหน้านี้

เมื่อใดที่คุณควรใช้ MapReduce หรือ Aggregation Pipeline

/th/images/question-mark-logos-with-code.jpg

เมื่อพิจารณาว่าจะใช้ MapReduce หรือไปป์ไลน์การรวมสำหรับการประมวลผลข้อมูล ขอแนะนำให้ประเมินความต้องการเฉพาะของโครงการอย่างรอบคอบในแง่ของข้อกำหนดในการประมวลผลข้อมูล

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

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

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

เรียกใช้การคำนวณที่ซับซ้อนใน MongoDB

MongoDB ใช้วิธีที่แตกต่างกันสองวิธีในการดำเนินการประมวลผลข้อมูลขนาดใหญ่ และในขณะที่แต่ละวิธีมีลักษณะเฉพาะของตัวเอง แต่ก็มีความแตกต่างที่น่าสังเกตหลายประการระหว่างทั้งสองวิธี ตรงกันข้ามกับการปฏิบัติทั่วไปในการเรียกข้อมูลล่วงหน้าก่อนดำเนินการคำนวณ ซึ่งอาจส่งผลให้ประสิทธิภาพการทำงานช้าลง เทคนิคเหล่านี้เลือกที่จะดำเนินการคำนวณโดยตรงกับข้อมูลที่อยู่ในฐานข้อมูลเอง แนวทางโดยตรงในการคำนวณนี้ทำให้การดำเนินการสืบค้นมีความคล่องตัวมากขึ้น ซึ่งจะช่วยเพิ่มประสิทธิภาพโดยรวม

แม้ว่าจะเป็นความจริงที่การรวมไปป์ไลน์มีแนวโน้มที่จะมีประสิทธิภาพดีกว่า MapReduce ในแง่ของความเร็วและประสิทธิภาพ สิ่งสำคัญคือต้องทราบว่ามีบางสถานการณ์ที่การใช้ MapReduce อาจเป็นตัวเลือกที่เหมาะสมกว่า อย่างไรก็ตาม เรื่องนี้ควรจัดลำดับความสำคัญของการใช้ไปป์ไลน์การรวมเมื่อใดก็ตามที่เป็นไปได้ เนื่องจากประสิทธิภาพที่เหนือกว่า