Contents

Map-Reduce vs. Aggregation Pipeline trong MongoDB

Bài học rút ra chính

MapReduce, một kỹ thuật được MongoDB sử dụng để thao tác dữ liệu phức tạp, đã được thay thế bởi Đường ống tổng hợp về hiệu quả và tính mới.

MapReduce trong MongoDB cung cấp cơ chế xử lý các tập dữ liệu lớn bằng cách chia chúng thành các phần nhỏ hơn và phân phối công việc trên nhiều nút trong một cụm. Cách tiếp cận này cho phép xử lý dữ liệu song song hiệu quả. Ngược lại, khung tổng hợp dựa trên các toán tử tích hợp để thực hiện các thao tác như lọc, sắp xếp và nhóm trên tập dữ liệu được lưu trữ trong chính cơ sở dữ liệu. Các toán tử này được thiết kế để sử dụng với các loại dữ liệu cụ thể và cung cấp quy trình hợp lý hơn so với tùy chỉnh được yêu cầu trong MapReduce.

MongoDB đề xuất sử dụng đường dẫn tổng hợp của nó để tối ưu hóa hiệu suất, tuy nhiên, MapReduce cung cấp mức độ linh hoạt cao hơn và rất phù hợp với các hệ thống tệp phân tán, chẳng hạn như các hệ thống được tìm thấy trong Hadoop.

MapReduce và đường dẫn tổng hợp là hai cách tiếp cận phổ biến được sử dụng để xử lý các tác vụ xử lý dữ liệu phức tạp trong lĩnh vực MongoDB. Mặc dù khung tổng hợp đại diện cho một sự đổi mới gần đây hơn, nhưng nó đã nhận được sự hoan nghênh vì hiệu suất đặc biệt của nó. Tuy nhiên, vẫn còn một nhóm các nhà phát triển tiếp tục ủng hộ MapReduce làm phương pháp ưa thích của họ, cho rằng tính quen thuộc và tính dễ sử dụng là các yếu tố thúc đẩy sở thích này.

Về bản chất, điều cần thiết là chọn một trong những chiến lược truy vấn phức tạp này vì tất cả chúng đều dẫn đến cùng một kết quả. Tuy nhiên, điều quan trọng là phải hiểu các cơ chế cơ bản, sự khác biệt và cách sử dụng tối ưu của chúng.

Cách MapReduce hoạt động trong MongoDB

ánh xạ và giảm.

Trong khi sử dụng MapReduce trong ngữ cảnh của MongoDB, người ta sẽ phân định độc lập các hoạt động ánh xạ và rút gọn bằng cách sử dụng JavaScript và kết hợp chúng tương ứng vào cấu trúc truy vấn mapReduce vốn có.

Hàm bản đồ dùng để phân tích thông tin đến thành các cặp khóa-giá trị, thường được xác định dựa trên các phân loại được xác định trước. Chính tại thời điểm này, người ta xác định phương pháp theo đó dữ liệu sẽ được nhóm lại. Sau đó, hàm rút gọn thực hiện các tính toán riêng biệt trên các giá trị được liên kết với từng tập dữ liệu và biên dịch kết quả vào một kho lưu trữ riêng được duy trì trong cơ sở dữ liệu.

Cách đường ống tổng hợp hoạt động trong MongoDB

Đường dẫn tổng hợp của MongoDB đóng vai trò thay thế nâng cao hơn cho MapReduce, cho phép người dùng thực hiện các tính toán phức tạp và thao tác dữ liệu trong chính cơ sở dữ liệu. Trái ngược với MapReduce, yêu cầu tạo các hàm JavaScript cụ thể được điều chỉnh để tối ưu hóa hiệu quả truy vấn, quy trình tổng hợp loại bỏ yêu cầu này, dẫn đến chức năng hợp lý hóa trong khi vẫn duy trì các khả năng hiệu suất cao.

Thay vì dựa vào các thư viện bên ngoài để thao tác dữ liệu, phương pháp này sử dụng khả năng của các toán tử tích hợp sẵn của MongoDB để thực hiện các hoạt động như nhóm và tính toán. Sau đó, các kết quả được nhóm lại với nhau trong một quy trình tổng hợp, mang lại mức độ linh hoạt cao về cấu trúc đầu ra cuối cùng.

Các truy vấn khác nhau như thế nào giữa MapReduce và Aggregation

Để xác định số liệu bán hàng tổng hợp cho các danh mục sản phẩm khác nhau bằng cách sử dụng khung MapReduce với tổng hợp dữ liệu, các danh mục sản phẩm đóng vai trò là số nhận dạng duy nhất hoặc “khóa”, trong khi tổng phụ của doanh số mặt hàng riêng lẻ tạo thành “giá trị” được liên kết cho từng khóa tương ứng.

Với một tuyên bố vấn đề cụ thể và một bộ dữ liệu đi kèm, việc cung cấp một mẫu dữ liệu đại diện để minh họa các đặc điểm và cấu trúc của nó thường rất hữu ích. Trong trường hợp báo cáo vấn đề được cung cấp, một tập hợp dữ liệu thô giả định có thể được trình bày như sau: pythonimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifier from sklearn.metrics import precision_scoredf=pd.read_csv(‘data.csv’) # đọc trong khung dữ liệu từ tệp CSVX=df[[‘feature1’,‘feature2’]] # chọn các tính năng có liên quany=df[’target’] # target variabletrain_size=int(0.8 * len(df)) # /vi/images/sample-data-mongodb.jpg

Chúng ta có thể tiếp cận vấn đề này bằng cách sử dụng khung MapReduce kết hợp với một đường dẫn để tổng hợp, vì nó sẽ cho phép chúng ta phân biệt sự khác biệt trong các kỹ thuật truy vấn và giải quyết vấn đề của mình.

Phương pháp MapReduce

Sử dụng Python làm nền tảng để lập trình, việc triển khai MapReduce cho tình huống sự cố đã nói ở trên có dạng sau:

 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)

Khi thực hiện thao tác này trên tập dữ liệu ban đầu, đầu ra tiếp theo sẽ hiển thị một mẫu tương tự như sau:

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

Khi xem xét kỹ hơn, người ta có thể quan sát thấy rằng các bộ xử lý Map và Reduce trong tập lệnh này được gói gọn dưới dạng các hàm JavaScript, chứa trong các biến Python. Các biến này sau đó được chuyển đến truy vấn MapReduce, truy vấn này hướng chúng tới một tập hợp đầu ra được phân bổ được biểu thị bằng tên “phần\_tổng”.

Sử dụng Đường ống Tổng hợp

Việc kết hợp quy trình tổng hợp dẫn đến kết quả hợp lý và đơn giản hơn so với phương pháp ban đầu. Sau đây minh họa quá trình nói trên bằng cách sử dụng đường ống tổng hợp:

 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)

Việc thực hiện thao tác tổng hợp này dự kiến ​​sẽ mang lại kết quả gần giống với kết quả thu được thông qua phương pháp MapReduce:

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

Hiệu suất và tốc độ truy vấn

MongoDB ủng hộ việc sử dụng đường dẫn tổng hợp nâng cao của nó so với MapReduce truyền thống do hiệu quả tăng lên và chức năng được sắp xếp hợp lý.

Chúng tôi đã tiến hành một thử nghiệm trong phần trước, nơi chúng tôi cố gắng chứng minh tuyên bố của mình bằng cách thực hiện đồng thời các truy vấn trên máy tính được trang bị 12 gigabyte RAM. Kết quả chỉ ra rằng quy trình tổng hợp hoạt động hiệu quả hơn, chỉ mất trung bình 0,014 giây để thực thi. Ngược lại, cùng một hệ thống mất khoảng 0,058 giây để xử lý truy vấn MapReduce.

Mặc dù nó có thể không phải là thước đo chính xác về hiệu suất, nhưng dữ liệu dường như hỗ trợ cho đề xuất của MongoDB. Tác động của sự khác biệt này có vẻ không đáng kể khi xem xét các truy vấn riêng lẻ; tuy nhiên, tác động tích lũy của nó trở nên đáng kể đối với nhiều yêu cầu, từ hàng nghìn đến hàng triệu.

Ưu và nhược điểm của MapReduce

Đánh giá những ưu điểm và nhược điểm của MapReduce để xác định điểm mạnh của nó trong xử lý dữ liệu.

Ưu điểm

Bằng cách sử dụng triển khai riêng biệt cả chức năng bản đồ và chức năng rút gọn, RDD của Apache Spark cung cấp mức độ thích ứng cao hơn, cho phép người dùng điều chỉnh quy trình xử lý của họ theo các yêu cầu cụ thể.

Bằng cách sử dụng sự tích hợp liền mạch của ứng dụng này với MongoDB, người dùng có thể dễ dàng lưu trữ các đầu ra được tạo trong một bộ sưu tập mới được tạo trong cơ sở dữ liệu của họ.

MapReduce là một công cụ mạnh mẽ có thể được sử dụng trong các hệ thống tệp phân tán, chẳng hạn như các hệ thống được tìm thấy trong Hadoop để tích hợp liền mạch với MongoDB.

Lợi thế về khả năng tương thích của nó với các ngôn ngữ kịch bản lệnh bên ngoài, chẳng hạn như JavaScript, nâng cao cả khả năng mở rộng và khả năng truy cập của nó, giúp những người có kinh nghiệm lập trình trước đó áp dụng các khái niệm MapReduce trở nên đơn giản hơn.

Nhược điểm

Việc sử dụng các tài nguyên tập lệnh bên ngoài là điều kiện tiên quyết để triển khai phương pháp này, điều này chắc chắn dẫn đến hiệu quả giảm dần khi so sánh với phương pháp của đường ống tổng hợp.

MapReduce, mặc dù là một giải pháp hiệu quả để xử lý lượng lớn dữ liệu được phân phối trên nhiều máy, nhưng có thể gây ra các vấn đề về hiệu suất bộ nhớ khi xử lý các bộ dữ liệu phức tạp đòi hỏi sức mạnh tính toán cao. Điều này thường yêu cầu sử dụng nhiều nút điện toán để quản lý và xử lý thông tin đó một cách hiệu quả.

Xử lý dữ liệu thời gian thực có thể đưa ra một số thách thức nhất định, vì việc truy vấn có thể bị ảnh hưởng bất lợi do hiệu suất chậm hơn so với các tình huống không theo thời gian thực.

Ưu và nhược điểm của đường ống tổng hợp

Xem xét quy trình tổng hợp một cách chi tiết hơn, có tính đến cả ưu điểm và nhược điểm của nó, giúp hiểu sâu hơn về các khả năng của nó.

Ưu điểm

Cuộc điều tra có xu hướng đa dạng về bản chất, được đặc trưng bởi sự ngắn gọn, rõ ràng và dễ hiểu.

Việc triển khai quy trình tổng hợp thể hiện sự cải thiện ấn tượng về hiệu quả khi so sánh với các phương pháp MapReduce truyền thống, dẫn đến nâng cấp hiệu suất đáng chú ý.

Ứng dụng này tự hào có một tập hợp toàn diện các toán tử MongoDB tích hợp, cho phép người dùng xây dựng các truy vấn với tính linh hoạt và khả năng thích ứng vượt trội.

⭐Nó hỗ trợ xử lý dữ liệu thời gian thực.

Việc tích hợp đường dẫn tổng hợp vào MongoDB có thể được thực hiện liền mạch mà không cần dựa vào các tập lệnh hoặc phần mềm bên ngoài.

Bạn có tùy chọn thiết lập một bộ sưu tập hoàn toàn mới trong cơ sở dữ liệu MongoDB của mình để lưu trữ các kết quả đã tạo, nếu bạn cần lưu trữ chúng.

Nhược điểm

Các hạn chế do phương pháp xử lý dữ liệu của Flink áp đặt so với mô hình MapReduce của Apache Spark là nó có thể không thể hiện cùng mức độ thích ứng và tính linh hoạt khi xử lý các cấu trúc dữ liệu phức tạp. Điều này là do nó phụ thuộc vào xử lý luồng thay vì sử dụng ngôn ngữ tập lệnh bên ngoài để tổng hợp dữ liệu, điều này hạn chế phạm vi phương thức có sẵn để thao tác dữ liệu.

Trình độ cần thiết để sử dụng hiệu quả và hiểu được những điểm phức tạp trong quá trình triển khai của MongoDB có thể gây ra một trở ngại ghê gớm đối với những lập trình viên mới làm quen với hệ thống cơ sở dữ liệu này, thiếu sự tiếp xúc trước với các tính năng và chức năng của nó.

Khi nào bạn nên sử dụng MapReduce hoặc Aggregation Pipeline?

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

Khi xác định xem có nên sử dụng MapReduce hoặc quy trình tổng hợp để xử lý dữ liệu hay không, bạn nên đánh giá cẩn thận các nhu cầu cụ thể của dự án về các yêu cầu xử lý dữ liệu.

MapReduce cung cấp một giải pháp lý tưởng khi xử lý các bộ dữ liệu phức tạp đòi hỏi các hoạt động logic phức tạp và các quy trình thuật toán trong một hệ thống quản lý tệp phi tập trung. Bằng cách điều chỉnh các hàm MapReduce cho phù hợp với các yêu cầu cụ thể và phân phối chúng trên nhiều đơn vị tính toán, người ta có thể mở rộng quy mô hiệu quả các tác vụ xử lý dữ liệu của mình theo chiều ngang thay vì ưu tiên tối ưu hóa hiệu suất.

Ngược lại, quy trình tổng hợp vượt trội trong việc xử lý thông tin phức tạp không yêu cầu lập luận hoặc phương pháp phù hợp. Khi dữ liệu của bạn được lưu trữ độc quyền trong MongoDB, việc sử dụng quy trình tổng hợp sẽ trở thành một lựa chọn hợp lý do có nhiều hoạt động tích hợp của nó.

Đường dẫn tổng hợp cung cấp một giải pháp ưu việt để xử lý dữ liệu theo thời gian thực khi hiệu quả tính toán là vô cùng quan trọng. Nó được khuyến nghị là tùy chọn ưu tiên trong các tình huống như vậy.

Chạy các tính toán phức tạp trong MongoDB

MongoDB sử dụng hai cách tiếp cận riêng biệt để thực hiện các hoạt động xử lý dữ liệu lớn và trong khi mỗi phương pháp có những đặc điểm riêng, vẫn tồn tại một số điểm khác biệt đáng chú ý giữa chúng. Trái ngược với phương pháp thông thường là truy xuất trước dữ liệu trước khi tiến hành tính toán, điều này có thể dẫn đến hiệu suất chậm hơn, thay vào đó, các kỹ thuật này chọn thực hiện các phép tính trực tiếp dựa trên thông tin nằm trong chính cơ sở dữ liệu. Cách tiếp cận tính toán trực tiếp này mang lại khả năng thực thi truy vấn hợp lý hơn, do đó nâng cao hiệu quả tổng thể.

Mặc dù đúng là quy trình tổng hợp có xu hướng hoạt động tốt hơn MapReduce về cả tốc độ và hiệu quả, nhưng điều quan trọng cần lưu ý là có một số tình huống nhất định trong đó việc sử dụng MapReduce có thể là một tùy chọn phù hợp hơn. Mặc dù vậy, lý tưởng nhất là ưu tiên sử dụng đường ống tổng hợp bất cứ khi nào có thể do hiệu suất vượt trội của nó.