1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xây dựng mạng thông tin địa xã hội dựa trên cơ sở ứng dụng dịch vụ hướng vị trí và kỹ thuật mạng không dây

100 18 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Xây dựng mạng thông tin địa xã hội dựa trên cơ sở ứng dụng dịch vụ hướng vị trí và kỹ thuật mạng không dây Xây dựng mạng thông tin địa xã hội dựa trên cơ sở ứng dụng dịch vụ hướng vị trí và kỹ thuật mạng không dây luận văn tốt nghiệp thạc sĩ

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI LÊ THỊ THANH VÂN Lê Thị Thanh Vân CÔNG NGHỆ THÔNG TIN XÂY DỰNG MẠNG THÔNG TIN ĐỊA - XÃ HỘI DỰA TRÊN CƠ SỞ ỨNG DỤNG DỊCH VỤ HƯỚNG VỊ TRÍ VÀ KỸ THUẬT MẠNG KHƠNG DÂY LUẬN VĂN THẠC SĨ KỸ THUẬT CÔNG NGHỆ THÔNG TIN 2010B Hà Nội – Năm 2013 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - Lê Thị Thanh Vân Trang phụ bìa XÂY DỰNG MẠNG THÔNG TIN ĐỊA - XÃ HỘI DỰA TRÊN CƠ SỞ ỨNG DỤNG DỊCH VỤ HƯỚNG VỊ TRÍ VÀ KỸ THUẬT MẠNG KHƠNG DÂY Chun ngành : Cơng nghệ thơng tin LUẬN VĂN THẠC SĨ KỸ THUẬT CÔNG NGHỆ THÔNG TIN NGƯỜI HƯỚNG DẪN KHOA HỌC : TS Nguyễn Khanh Văn Hà Nội – Năm 2013 LỜI CẢM ƠN Đầu tiên cho em gửi lời cảm ơn sâu sắc đến TS Nguyễn Khanh Văn tận tình bảo cho em suốt thời gian thực hiện khóa luận Trong q trình nghiên cứu em gặp phải nhiều khó khăn nhờ hướng dẫn tận tình động viên khích lệ thầy, em dần vượt qua hồn thành khóa luận Em xin bày tỏ lịng biết ơn đến thầy trường Đại Học Bách khoa Hà Nội Đại học Nha Trang giảng dạy cho em kiến thức q báu, làm nền tảng để hồn thành khóa luận thành công nghiên cứu, làm việc tương lai Cuối cùng, cho gửi lời cảm ơn sâu sắc mẹ cho nhiều tình thương động viên kịp thời để vượt qua khó khăn sống hồn thành khóa luận ****** LỜI CAM ĐOAN Tơi xin cam đoan: Luận văn thạc sĩ Công nghệ thông tin “Xây dựng mạng thông tin điạ - xã hội dựa sở ứng dụng dịch vụ hướng vị trí kỹ thuật mạng khơng dây” cơng trình nghiên cứu thực cá nhân, thực hiện sở nghiên cứu lý thuyết hướng dẫn khoa học Tiến sĩ Nguyễn Khanh Văn Tôi xin chịu trách nhiệm về lời cam đoan Hà Nội, ngày 12 tháng năm 2013 Tác giả Lê Thị Thanh Vân MỤC LỤC LỜI CAM ĐOAN .2 LỜI CẢM ƠN .3 DANH MỤC CÁC THUẬT NGỮ, TỪ VIẾT TẮT DANH MỤC CÁC HÌNH PHẦN MỞ ĐẦU Lý chọn đề tài Mục đích, đối tượng, phạm vi nghiên cứu Cấu trúc luận văn PHẦN NỘI DUNG .9 CHƯƠNG 1: TỔNG QUAN LOCATION BASE SERVICE 10 1.1 Diện mạo Location base service (LBS) 10 1.2 Hệ thống dẫn đường: Cơ sở liệu không gian phối cảnh 12 1.3 Công nghệ wireless location base service .18 1.4 Hỗ trợ định hướng môi trường thông minh 20 CHƯƠNG II: CÔNG NGHỆ LƯU TRỮ PHÂN TÁN NOSQL 29 2.1 Tại NoSQL? 30 2.2 Các mơ hình liệu NoSQL 34 2.3 Mơ hình phân tán 42 CHƯƠNG III: MONGODB 51 3.1 Tổng quan .51 3.2 Index .52 3.3 Sao chép 54 3.4 Phân mảnh 59 CHƯƠNG IV: TRÌNH BÀY THIẾT KẾ CƠ SỞ DỮ LIỆU, XÂY DỰNG ỨNG DỤNG CHO LOCATION BASE SERVICE SỬ DỤNG HỆ THỐNG MONGODB 63 4.1 Thiết kế liệu 63 4.2 Xây dựng ứng dụng 65 KẾT LUẬN .69 Kết quả đạt 69 Đánh giá kết quả 69 Hướng phát triển 70 TÀI LIỆU THAM KHẢO 71 PHỤ LỤC MONGODB 72 99 DANH MỤC CÁC THUẬT NGỮ, TỪ VIẾT TẮT Thuật ngữ STT Diễn giải GSM Global System for Mobile Communication SPOT Smart personal object technology GPS Global Position Syatem LBS Location base services GIS Geographic Information Systems SDB Spatial Database server OpenLS Open Location Service DBMS Database Management System ER Entity Relationship 10 PEER Pictogram-enhanced ER 11 DR Deduced reckoning 12 NAVSTAAR Navigation Satellite Timing and Ranging 13 MS Mobile Station 14 TOA Time of arrival 15 RSS Receive signal strength 16 SmE Smart Enviroment 17 AmI Ambient Intelligent 18 RDBMS Relational DataBase Management Systems 19 XML eXtensible Markup Language 20 JSON JavaScript Object Notation 21 BSON Binary JSON DANH MỤC CÁC HÌNH Hình 1.1 - Các tầng mơ hình kỹ thuật LBS 12 Hình 1.2 - Kiến trúc hệ thống dẫn đường hiện đại .13 Hình 1.3 - Sơ đồ PEER bản đồ đường số hóa 15 Hình 1.4 - Định vị trực tiếp định vị bước 20 Hình 1.5 - Giải pháp Server-side .27 Hình 1.6 - Giải pháp Client-side .28 Hình 2.1 - Một bảng yêu cầu, phải chia nhiều hàng từ nhiều bảng sở liệu quan hệ 32 Hình 2.2 - Trình bày thơng tin customer theo cấu trúc column-family 38 Hình 2.3 - Ví dụ cấu trúc đồ thị 39 Hình 2.4- Phân mảnh liệu khác node riêng biệt 44 Hình 2.5 - Dữ liệu chép từ master sang slave Các dịch vụ ghi, đọc master từ master slave 46 Hình 2.6- Sao chép Peer to peer có tất cả node cho đọc chi tất cả liệu 48 Hình 2.7 - Sử dụng chép master-slave với phân mảnh .49 Hình 2.8 - Sử dụng chép peer to peer với phân mảnh 50 Hình 3.1 - Mơ hình master slave 55 Hình 3.2 – Mơ hình master với nhiều slave .55 Hình 3.3 - Bộ lưu 56 Hình 3.4 - Một lưu có nhiều server khác với nhiều cấp độ ưu tiên 57 Hình 3.5 - Nếu primary hỏng, server có mức ưu tiên cao so sánh cập nhật 58 Hình 3.6 - Server ưu tiên cao server có thời gian cập nhật primary .58 Hình 3.7 - Kết nối client không phân mảnh 60 Hình 3.8 - Kết nối client phân mảnh 60 Hình 4.1 - Bản thiết kế liệu MongoDB 63 Hình 4.2 - Xây dựng sở liệu RockMongo .64 PHẦN MỞ ĐẦU Lý chọn đề tài Sự bùng nổ công nghệ giao tiếp với điện thoại di động, kết nối thiết bị cảm biến, mạng không dây (WiFi), mạng điện thoại di động (GSM), vô tuyến, công nghệ thông minh cá nhân (SPOT), hệ thống định vị tồn cầu (GPS) có nhiều sáng kiến cơng nghệ trùn thơng hồn tồn Những cơng nghệ cho phép người sử dụng điện thoại di động truy vấn môi trường họ cho phép ứng dụng giám sát, theo dõi đối tượng từ xa Mọi người hỏi về dịch vụ gần - ví dụ nhà hàng, làm đến từ đây; cảnh sát, bệnh viện taxi, nơi thể gửi xe gần Mạng xã hội dịch vụ hướng vị trí (Location Base Services) xu hướng phát triển mạnh mẽ ngành công nghệ thông tin truyền thông Sự kết hợp hai xu hướng tạo nên mạng địa xã hội (Geo – social network) Ứng dụng client điện thoại thông minh (smartphone) ưu tiên hàng đầu nhà phát triển mạng xã hội loại Trong số nền tảng di động hiện nay, Android đánh giá cao tính mở, tính ổn định, kho ứng dụng miễn phí phong phú số lượng người sử dụng tăng nhanh Chúng ta trải qua 20 năm phát triển khoa học máy tính, nhìn thấy nhiều thứ thay đổi ngơn ngữ lập trình, kiến trúc flatform, cách xử lý Tuy nhiên, suốt thời gian có thứ không thay đổi- lưu trữ liệu theo sở liệu quan hệ Cách thức lưu trữ liệu vô quan trọng, liệu tổ chức kéo dài lâu chương trình Đó giá trị để có cách thức lưu trữ liệu ổn định Tuy nhiên, nhu cầu để xử lý khối lượng liệu lớn buộc phải có thay đổi bản Nhu cầu dấy lên lo ngại về khó khăn việc ứng dụng chạy tốt với mơ hình liệu quan hệ NoSQL lựa chọn hướng tiếp cận thích hợp để giải vấn đề bật mà hệ thống lớn phải đối mặt Mục đích, đối tượng, phạm vi nghiên cứu - Khảo sát, tìm hiểu về cơng nghệ, kỹ thuật mạng dịch vụ hướng vị trí - Khảo sát, tìm hiểu, đánh giá về hệ thống NoSQL - Khảo sát, tìm hiểu sở liệu MongoDB - Xây dựng ứng dụng sử dụng sở liệu MongoDB Cấu trúc luận văn Luận văn mang tên “Xây dựng mạng thông tin điạ - xã hội dựa sở ứng dụng dịch vụ hướng vị trí kỹ thuật mạng khơng dây” Báo cáo có cách tiếp cận thực tế về tổ chức, tìm kiếm liệu khơng gian vị trí đối tượng Bắt đầu với mô tả số cơng nghệ thực tế, giải thích cách thức hoạt động Sau thực hiện nhiệm vụ tìm hiểu cơng nghệ lưu trữ phân tán NoSQL, đồng thời xác định hệ thống NoSQL phù hợp cho ứng dụng mạng địa xã hội Luận văn trình bày với bố cục gồm chương:  Chương – Giới thiệu tổng quan mạng dịch vụ hướng vị trí (Location base service), qua đưa khái niệm bản Location base service  Chương – Trình bày tóm tắt sở lý thuyết về cơng nghệ lưu trữ phân tán NoSQL  Chương – 3: Trình bày về MongoDB  Chương – 4: Trình bày thiết kế sở liệu, xây dựng ứng dụng cho location base service sử dụng hệ thống MongoDB tiên cao sang “RUNNING” Sau xử lý sau, cập nhật sang trạng thái “DONE”: ps=db.processes.find({"status":"READY").sort({"priority":-1}).limit(1).next() db.processes.update({"_id":ps._id},{"$set":{"status":"RUNNING"}}) do_something(ps); db.processes.update({"_id":ps._id},{"$set":{"status":"DONE"}}) Thuật tốn khơng thật tốt Trong trường hợp có hai tiến trình chạy Nếu tiến trình A gọi document tiến trình B gọi document trước A cập nhật trạng thái sang “RUNNING”, cả hai tiến trình xử lý trình Ta tránh việc cách kiểm tra trạng thái phần câu lệnh truy vấn, trở nên phức tạp Phụ thuộc vào thời gian, tiến trình kết thúc cơng việc tiến trình khác tiếp tục cơng việc vơ ích Tiến trình A giữ lấy q trình, sau tiến trình B lấy q trình tương tự, bị lỗi mà A làm tất cả cơng việc findAndModify trả lại kết quả cập nhật lại > ps = db.runCommand({"findAndModify" : "processes", "query" : {"status" : "READY"}, "sort" : {"priority" : -1}, "update" : {"$set" : {"status" : "RUNNING"}}) { "ok" : 1, "value" : { "_id" : ObjectId("4b3e7a18005cab32be6291f7"), "priority" : 1, "status" : "READY" } } Giá trị khóa lệnh findAndModify:  findAndModify: chuỗi, tên collection 84  query: truy vấn document, điều kiện để tìm document  sort: điều kiện để xếp kết quả  update: document bổ trợ, cập nhật thực thi lên document tìm thấy Truy vấn (Querying) a Find Phương thức find sử dụng để thực thi truy vấn MongoDB Truy vấn trả lại tập document collection, từ khơng có document tất cả document Một truy vấn document rỗng (ví dụ: {}) >db.c.find() Cho kết quả thứ collection c Khi ta thêm cặp khóa giá trị vào document truy vấn, ta hạn chế tìm kiếm Truy vấn cho kiểu liệu đơn giản dễ dàng Ví dụ: tìm kiếm tất cả document thỏa điều kiện giá trị “age” 27 >db.users.find({"age" : 27}) Nhiều điều kiện thêm nhiều cặp key/value vào truy vấn Ví dụ tìm kiếm người dùng thỏa điều kiện 27 tuổi tên Tom: > db.users.find({"username" : "joe", "age" : 27}) Ví dụ : cần trường username email > db.users.find({}, {"username" : 1, "email" : 1}) { "_id" : ObjectId("4ba0f0dfd22aa494fd523620"), "username" : "joe", "email" : "joe@example.com" } Truy vấn có điều kiện 85 Nếu “$lt”, “$lte”, “$gt” “$gte” phép tốn so sánh Chúng phối hợp để tìm kiếm giá trị Ví dụ: Tìm người dùng có độ tuổi từ 18 đến 30 >db.users.find({"age" : {"$gte" : 18, "$lte" : 30}}) Tìm người dùng đăng ký trước ngày 01 tháng năm 2012 > start = new Date("01/01/2012") > db.users.find({"registered" : {"$lt" : start}}) Để truy vấn document có giá trị khóa khơng giá trị xác, ta phải dùng toán tử điều kiện khác “$ne”, viết tắt “not equal” Ví dụ: Tìm người dùng có username không phải tên “joe” >db.users.find({"username" : {"$ne" : "joe"}}) “$ne” dùng với tất cả kiểu Truy vấn OR Có hai cách để thực hiện truy vấn OR mongoDB “$in” dùng để truy cấn nhiều loại giá trị khác cho khóa đơn “$or” tổng qt hơn, dùng truy vấn cho tất cả giá trị cho đa khóa Nếu có nhiều giá trị phù hợn để thỏa đơn khóa, sử dụng mảng điều kiện với “$in” Ví dụ: Ta trò chơi xổ số số chiến thắng 742, 542 390 Để tìm tất cả document có ba số này, ta có truy vấn sau: >db.raffle.find({"ticket_no" : {"$in" : [725, 542, 390]}}) “$in” linh động cho phép định điều kiện kiểu giá trị, ví dụ tìm document thỏa user_id 12345 document thỏa user_id “joe” > db.users.find({"user_id" : {"$in" : [12345, "joe"]}) Lưu ý: {ticket_no : {$in : [725]}} {ticket_no : 725} cho kết quả document giống Ngược với “$in” “$nin”, cho kết quả document không thỏa điều kiện mảng 86 Ví dụ: Tìm người khơng thắng trị chơi xổ số (khơng có vé có số thắng) >db.raffle.find({"ticket_no" : {"$nin" : [725, 542, 390]}}) “$in” cho ta truy vấn với khóa đơn, ta cần tìm document thỏa “ticket_no” 725 “winner” true Trong trường hợp ta phải dùng điều kiện “$or” > db.raffle.find({"$or" : [{"ticket_no" : 725}, {"winner" : true}]}) “$or” gồm điều kiện khác, ví dụ: ta cần điều kiện ticket_no thỏa giá trị khóa “winner” true > db.raffle.find({"$or" : [{"ticket_no" : {"$in" : [725, 542, 390]}}, {"winner":true}]}) $not “$not” siêu điều kiện(metaconditional), dùng cho điều kiện khác Ví dụ: phép tốn chia lấy dư “$mod” Tìm document thỏa điều kiện “id_num” số chia dư > db.users.find({"id_num" : {"$mod" : [5, 1]}}) Kết quả document có “id_num” 1, 6, 11, 16… Nếu ta cần trả lại document thỏa “id_num” 2, 3, 4, 5, 7, 8, 9, 10, 12… ta dùng “not”: > db.users.find({"id_num" : {"$not" : {"$mod" : [5, 1]}}}) Quy tắc cho điều kiện Nhiều điều kiện đặt đơn khóa Ví dụ: tìm tất cả người dùng tuổi từ 230 đến 30, ta dùng cả “$gt” “$lt” khóa “age” > db.users.find({"age" : {"$lt" : 30, "$gt" : 20}}) Nhưng update ta khơng thể có $inc":{"age":1},"$set":{age:40}} “age” lặp lần Các loại truy vấn đặc trưng Null không thỏa mà cịn “khơng tồn tại” Ví dụ: > db.c.find() 87 document như: { "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null } { "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : } { "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : } Truy vấn document khóa y null: > db.c.find({"y" : null}) { "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null } Nếu ta cần tìm khóa giá trị null, ta kiểm tra khóa null tồn tại, sử dụng điều kiện “$exists”: > db.c.find({"z" : {"$in" : [null], "$exists" : true}}) Các biểu thức quy tắc Các biểu thức quy tắc hữu ích cho chuỗi linh động Ví dụ: tìm người dùng tên Joe joe, ta dùng biểu thức quy tắc: > db.users.find({"name" : /joe/i}) “i” phép khơng bắt buộc Nếu muốn tìm người dùng khơng tên hoa joe mà tên joey, ta tiếp tục cải tiến biểu thức: > db.users.find({"name" : /joey?/i}) Truy vấn mảng Truy vấn phần tử mảng đơn giản Một mảng xem phần tử giá trị tồn khóa Ví dụ, mảng danh sách loại trái như: > db.food.insert({"fruit" : ["apple", "banana", "peach"]}) Truy vấn: > db.food.find({"fruit" : "banana"}) Truy vấn document nhúng Có hai hướng để truy vấn document nhúng: truy vấn cho cả document truy vấn cho cặp khóa/giá trị riêng lẻ Truy vấn cho tồn document, ví dụ ta có document sau: { "name" : { "first" : "Joe", 88 "last" : "Schmoe" }, age" : 45 } Ta truy vấn tìm người tên Joe Shome sau: > db.people.find({"name" : {"first" : "Joe", "last" : "Schmoe"}}) Nếu Joe thêm khóa họ đệm truy vấn khơng dùng Ta dùng truy vấn cho khóa nhúng sử dụng ký hiệu >db.people.find({"name.first" : "Joe", "name.last" : "Schmoe"}) Bây giờ Joe thêm khóa khác truy vấn thỏa cả tên họ Dấu chấm “.” khác document truy vấn loại document khác Dấu chấm lý mà document thêm khơng thể có ký tự “.” Truy vấn $where Trường hợp phổ biến so sánh giá trị hai khóa document Nếu ta có danh sách muốn trả lại document có giá trị thỏa hai khóa Ví dụ: > db.foo.insert({"apple" : 1, "banana" : 6, "peach" : 3}) > db.foo.insert({"apple" : 8, "spinach" : 4, "watermelon" : 4}) Trong document thứ hai, “spinach” “watermelon” có giá trị “$where” khơng nên dùng trừ thật cần thiết, chậm truy vấn thông thường, document phải chuyển từ BSON sang JavaScript chạy biểu thức “$where” Ta dùng “$where” khơng cịn cách khác để thực thi truy vấn 5.3 Con trỏ (Cursor) Để tạo trỏ với shell, đưa document vào collection, thực hiện truy vấn chúng gán kết quả cho biến Ví dụ sau tạo collection đơn giản truy vấn nó, lưu trữ kết quả biến trỏ > for(i=0; i var cursor = db.collection.find(); Thuận lợi ta xem kết quả thời điểm Cursor.hasNext() kiểm tra kết quả có hay khơng cursor.next() đưa Nhất quán kết quả Một phương án công cho việc xử lý liệu để lấy liệu MongogDB, thay đổi lưu lại cursor = db.foo.find(); while (cursor.hasNext()) { var doc = cursor.next(); doc = process(doc); db.foo.save(doc);} Thật tốt kết quả số nhỏ, khơng với số lớn document Ta tưởng tượng collection danh sách document nhìn hình dưới, hoa document Ta tiến hành “find” trả lại kết quả đầu collection tiến về bên phải Chương trình lấy 100 document xử lý chúng Khi ta lưu chúng ngược lại vào sở liệu, document tăng kích thước, định vị lại Thường document xếp vị trí vào cuối collection 90 Một document khơng vừa với vị trí cũ Giải pháp cho vấn đề snapshot truy vấn Sự tổng hợp (Agreegation) MongoDB cung cấp số công cụ để hỗ trợ việc tổng hợp Gồm có đếm đơn giản số lượng document collection, phân tích phức tạp liệu phức tạp dùng MapReduce Count Cơng cụ tổng hợp đơn giản count, trả lại giá trị số document collection > db.foo.count() > db.foo.insert({"x" : 1}) > db.foo.count() Distinct 91 Lệnh distinct tìm tất cả giá trị khác biệt khóa > db.runCommand({"distinct" : "people", "key" : "age"}) Ví dụ, ta có document collection sau: {"name" : "Ada", "age" : 20} {"name" : "Fred", "age" : 35} {"name" : "Susan", "age" : 60} {"name" : "Andy", "age" : 35} Nếu gọi distinct cho khóa “age”, ta có tuổi khác nhau: > db.runCommand({"distinct" : "people", "key" : "age"}) {"values" : [20, 35, 60], "ok" : 1} Group “group” cho phép thực thi nhiều tổng hợp phức tạp Ta chọn khóa để nhóm lại MongoDB chia collection nhiều nhóm cho giá trị khóa chọn Với nhóm, ta có document kết quả từ việc tổng hợp document thành phần nhóm Goup tương tự Group by SQL Giả sử ta có website về giá cổ phiếu Cứ phút từ 10 giờ sáng đến giờ chiều, cho ta giá cổ phiếu lưu trữ MongoDB Ta cần tìm giá gần cho 30 ngày Collection giá cổ phiếu gồm có hàng ngàn document sau: {"day":"2010/10/03","time":"10/3/2010 03:57:01 GMT-400","price": 4.23} {"day":"2010/10/04","time":"10/4/2010 11:28:39 GMT-400","price": 4.27} {"day":"2010/10/03","time":"10/3/2010 05:00:23 GMT-400","price": 4.10} {"day":"2010/10/06","time":"10/6/2010 05:27:58 GMT-400","price": 4.30} {"day":"2010/10/04","time":"10/4/2010 08:34:50 GMT-400","price": 4.01} Ta cần kết quả danh sách giá thời gian cho ngày, sau: [ {"time" : "10/3/2010 05:00:23 GMT-400", "price" : 4.10}, {"time" : "10/4/2010 11:28:39 GMT-400", "price" : 4.27}, 92 {"time" : "10/6/2010 05:27:58 GMT-400", "price" : 4.30} ] Ta thực hiện cách chia collection thành tập document nhóm lại theo ngày sau tìm document có nhãn thời gian cho ngày thêm vào tập kết quả Cả hàm ghi sau: > db.runCommand({"group" : { "ns" : "stocks", "key" : "day", "initial" : {"time" : 0}, "$reduce" : function(doc, prev) { if (doc.time > prev.time) { prev.price = doc.price; prev.time = doc.time; } }}}) Một số thành phần khóa:  “ns” : ”stock” xác định collection nhóm  “key” : “day” nhóm document theo khóa “day”  “initial” : {“time” : 0} Lần gọi hàm reduce để nhóm  “$reduce”: function(doc, prev) {…} gọi cho document collection Ta cần hàm reduce để so sánh thời gian document hiện tại với thời gian dự trữ Nếu document hiện tại có thời gian hơn, ta thiết lập ngày dự trữ giá giá trị document hiện tại Sử dụng Finalizer Finalizer dùng để giới hạn tối đa lượng liệu cần để chuyển từ sở liệu đến người dùng, kết quả lệnh group cần phù hợp với sở liệu đơn Để hiểu rõ hơn, ta lấy ví dụ blog, thơng báo có nhiều tag Ta cần tìm 93 tag phổ biến ngày Ta nhóm theo ngày đếm tag Như sau: > db.posts.group({ "key" : {"tags" : true}, "initial" : {"tags" : {}}, "$reduce" : function(doc, prev) { for (i in doc.tags) { if (doc.tags[i] in prev.tags) { prev.tags[doc.tags[i]]++; } else { prev.tags[doc.tags[i]] = 1; } } }}) Nó cho kết quả sau: [ {"day":"2010/01/12","tags":{"nosql":4,"winter":10,"sledding": 2}}, {"day":"2010/01/13","tags":{"soda":5,"php":2}}, {"day":"2010/01/14","tags":{"python":6,"winter":4,"nosql":15}} ] Sau ta tìm giá trị lớn “tags” document client Hàm “finalize” gồm hàm chạy nhóm trước gửi ngược lại cho client Ta dùng finalize để bỏ bớt số kết quả không cần thiết > db.runCommand({"group" : { "ns" : "posts", "key" : {"tags" : true}, "initial" : {"tags" : {}}, "$reduce" : function(doc, prev) { for (i in doc.tags) { 94 if (doc.tags[i] in prev.tags) { prev.tags[doc.tags[i]]++; } else { prev.tags[doc.tags[i]] = 1; } }, "finalize" : function(prev) { var mostPopular = 0; for (i in prev.tags) { if (prev.tags[i] > mostPopular) { prev.tag = i; mostPopular = prev.tags[i]; } } delete prev.tags }}}) Ta có kết quả ta cần server gửi kết quả ngược lại: [ {"day" : "2010/01/12", "tag" : "winter"}, {"day" : "2010/01/13", "tag" : "soda"}, {"day" : "2010/01/14", "tag" : "nosql"} ] MapReduce MapReduce công cụ tổng hợp Count, distinct group đều thực hiện với MapReduce Nó phương thức tổng hợp mà song song thực thi nhiều server Nó chia vấn đề nhiều phần, gửi phần tới máy khác nhau, máy xử lý giải phần Khi tất cả máy hồn thành, kết hợp tất cả phần giải pháp thành giải pháp hoàn chỉnh Giá trị việc sử dụng MapReduce chỗ tốc độ Ta vào vài 95 ví dụ để hiểu rõ MapReduce tiện lợi, mạnh mẽ công cụ phức tạp Ví dụ 1: Tìm tất cả khóa collection Ta cần lấy tất cả khóa document collection Hàm map sử dụng hàm đặc biệt trả lại giá trị mà ta cần để xử lý sau này: emit “emit” đưa MapReduce khóa giá trị Trong trường hợp này, ta đưa số lần khóa xuất hiện document > map = function() { for (var key in this) { emit(key, {count : 1}); }}; Bây giờ ta có lượng document, document kết hợp với khóa từ collection Một mảng document hợp quy cách với hàm reduce Hàm reduce có tham số: khóa (tham số thứ từ emit) mảng nhiều document mà phát hành cho khóa > reduce = function(key, emits) { total = 0; for (var i in emits) { total += emits[i].count; } return {"count" : total}; } Reduce phải trả lại document mà gửi lại cho reduce phần tử cho tham số thứ hai Ví dụ, ta có khóa x xếp cho document {count : 1, id : 1}, {count : 1, id : 2}, {count : 1, id : 3} MongoDB gọi reduce sau: >r1=reduce("x",[{count:1,id:1},{count:1,id:2}]) {count:2} > r2 = reduce("x", [{count : 1, id : 3}]) 96 {count : 1} > reduce("x", [r1, r2]) {count : 3} Nói chung, hàm MapReduce sau: >mr=db.runCommand({"mapreduce":"foo","map":map,"reduce": reduce}) { "result" : "tmp.mr.mapreduce_1266787811_1", "timeMillis" : 12, "counts" : { "input" : "emit" : 14 "output" : }, "ok" : true } “result”: "tmp.mr.mapreduce_1266787811_1" tên colletion mà kết quả MapReduce lưu trữ Đây collection tạm, bị xóa kết nối MapReduce bị đóng “timeMillis”: 12 – thời gian phép toán xảy “count” :{…} – document nhúng gồm có ba khóa: “input” : - số lượng document gửi tới hàm map “emit” : 14 – số lần emit gọi hàm map “output” : – số document tạo collection kết quả Ví dụ 2: Phân loại trang web Giả sử ta có trang web, người xác nhận để kết nối sang trang khác reddit.com Người dùng chọn link theo chủ đề phổ biến “polictics”, “greek”… Ta dùng MapReduce để tính tốn chủ đề phổ biến cách so sánh bình chọn 97 Đầu tiên ta cần hàm map để phát hành thẻ có giá trị dựa vào phổ biến document: map = function() { for (var i in this.tags) { var recency = 1/(new Date() - this.date); var score = recency * this.score; emit(this.tags[i],{"urls": [this.url], "score" : score}); } }; Bây giờ ta cần biến đổi tất cả giá trị cho thẻ thành tỷ số đơn lẻ cho thẻ reduce = function(key, emits) { var total = {urls : [], score : 0} for (var i in emits) { emits[i].urls.forEach(function(url) { total.urls.push(url); } total.score += emits[i].score; } return total; }; Collection cuối đưa mức độ phổ biến 98 ... DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - Lê Thị Thanh Vân Trang phụ bìa XÂY DỰNG MẠNG THÔNG TIN ĐỊA - XÃ HỘI DỰA TRÊN CƠ SỞ ỨNG DỤNG DỊCH VỤ HƯỚNG VỊ TRÍ VÀ KỸ THUẬT... nghệ thông tin ? ?Xây dựng mạng thông tin điạ - xã hội dựa sở ứng dụng dịch vụ hướng vị trí kỹ thuật mạng khơng dây? ?? cơng trình nghiên cứu thực cá nhân, thực hiện sở nghiên cứu lý thuyết hướng. .. mang tên ? ?Xây dựng mạng thông tin điạ - xã hội dựa sở ứng dụng dịch vụ hướng vị trí kỹ thuật mạng khơng dây? ?? Báo cáo có cách tiếp cận thực tế về tổ chức, tìm kiếm liệu khơng gian vị trí đối

Ngày đăng: 13/02/2021, 11:06

Xem thêm:

Mục lục

    TÀI LIỆU THAM KHẢO

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN