b) Kiến trúc của Hadoop
3.4. Truy vấn đồ thị (Graph Querying)
Truy vấn trong đồ thị lớn là bài toán tìm ra tất cả các trƣờng hợp của một phần đồ thị trong một đồ thị lớn hoặc một tập các đồ thị. Truy vấn đồ thị có thể đƣợc coi là một tập con của bài toán so khớp đồ thị.
3.4.1. Các nghiên cứu liên quan đến truy vấn đồ thị
Trả lời truy vấn chính xác là một trong các bài toán phổ biến nhất trong các phân tích dữ liệu lớn. Một số kỹ thuật đã đƣợc áp dụng để truy cập các so sánh chính xác của một đồ thị đầu vào trong đồ thị chính. Đầu tiên, các kỹ thuật lập chỉ mục (Indexing) đã đƣợc sử dụng rộng rãi đối với so khớp đồ thị. Các phƣơng pháp lập chỉ mục cạnh đƣợc sử dụng cho các truy vấn SPARQL trên dữ liệu RDF [22, 23]. Các truy vấn SPARQL đƣợc chia ra thành một tập các cạnh và các liên kết đa chiều đƣợc đƣa vào để tìm kiếm kết quả. Để tránh các liên kết thừa, một phƣơng pháp khác đƣợc khai thác là lập chỉ mục các đồ thị con thƣờng xuyên của một đồ thị [12]. Tuy nhiên phƣơng pháp này là không tốt trong trƣờng hợp các truy vấn ít khi xảy ra. Hơn nữa, với một đồ thị lớn với hàng triệu và hàng tỷ các đỉnh, thời gian để tạo ra một chỉ mục nhƣ vậy là rất lớn [24]. Vì vậy một số ứng dụng so khớp đồ thị đƣợc thực hiện mà không cần lập chỉ số. Trinity Cloud của Microsoft sử dụng kỹ thuật thăm dò đồ thị in-memory cho việc so khớp đồ thị [24]. Thứ ba, một số phƣơng pháp nhƣ GBLENDER [25] sử dụng độ chễ tạo truy vấn để tạo ra các kết quả trung gian và sau đó đảm bảo thời gian đáp ứng hệ thống tốt hơn. Gần đây, Afrati [26] đã sử dụng Map/Reduce để tập hợp tất cả các kết quả truy vấn từ đồ thị. Giải pháp của họ là tạo ra một tập hợp các truy vấn có móc nối với nhau cái mà gồm các mối quan hệ có trật tự trong câu truy vấn ban đầu. Mục tiêu là tìm ra sự phân rã truy vấn trong một trật tự cụ thể mà sẽ làm cho việc truy vấn trở nên dễ dàng hơn bằng cách cắt tỉa không gian tìm kiếm một cách hiệu quả.
Trả lời truy vấn gần đúng cũng là một bài toán đƣợc đƣa ra trong nhiều công trình nghiên cứu. Hiện đã có các định nghĩa khác nhau cho so khớp không chính xác trong giới nghiên cứu. GRAY [27] tìm ra các so khớp không chính xác cái mà
37
giữ nguyên dạng của các truy vấn đầu vào. Mặt khác, TALE [28] đã nghiên cứu việc tìm ra k đồ thị con gần đúng dựa vào số cạnh thiếu. Hầu hết các bộ định nghĩa cho sự so khớp gần đúng đƣợc dựa trên các lĩnh vực ứng dụng cụ thể. Với các đồ thị lớn so khớp gần đúng có thể áp dụng hai cách tiếp cận sau: 1) Tạo các truy vấn tƣơng tự với truy vấn ban đầu và thực hiện so khớp chính xác; 2) sự phân rã câu truy vấn đầu vào thành các thành phần nhỏ hơn và sau đó các thành phần nhỏ hơn có thể áp dụng cả về so khớp chính xác và không chính xác để tìm ra các kết quả.
3.4.2. Các thách thức và hƣớng tiếp cận đƣợc đề xuất cho truy vấn đồ thị
Cách tiếp cận đầu tiên để giải quyết truy vấn đồ thị là sử dụng trực tiếp truy vấn so khớp. Khi một câu truy vấn đến cần so khớp với các đỉnh/cạnh/nhãn trong đồ thị để tìm ra kết quả truy vấn. Một phƣơng pháp khác để giải quyết quá trình truy vấn đồ thị là lập chỉ mục. Chúng ta có thể tạo ra và đánh chỉ mục tất cả các cấu trúc con thƣờng xuyên xuất hiện, tạo ra trong giai đoạn khai phá đồ thị. Tuy nhiên điều này phải đối mặt với bài toán nhằm giải quyết các truy vấn không thƣờng xuyên xảy ra. Hơn nữa, việc khai thác các cấu trúc con thƣờng xuyên từ một đồ thị sẽ tốn nhiều chi phí thời gian và việc lập chỉ mục nhƣ vậy đối với các đồ thị lớn có thể không khả thi trên thực tế. Một phƣơng pháp lập chỉ số khác đƣợc dùng để lập thông tin k- hop lân cận với mỗi đỉnh. Vì truy vấn đƣợc nhận bắt đầu từ khi một đỉnh, kết quả truy vấn có thể đƣợc khám phá theo thông tin lân cận k-hop với mỗi đỉnh trong đồ thị chính. Tuy nhiên, theo phƣơng pháp này, việc chọn ra giá trị k là rất khó. Giá trị
k = 1 sẽ đƣa ra các so khớp chính xác chỉ khi tìm kiếm so khớp chính xác của mỗi
cạnh truy vấn trong đồ thị ban đầu. Giữ lại các giá trị cao hơn của k sẽ cho ra các so sánh gần đúng khác nhau tùy thuộc vào kỹ thuật thăm dò đƣợc sử dụng.
Một phƣơng pháp có thể đƣợc sử dụng là khai phá đồ thị ban đầu và tạo ra các kết quả trung gian cái giúp mở rộng về sau. Ví dụ, nếu ta phân tách các truy vấn vào tập các bộ cấu trúc con 1 cạnh, ta có thể tìm ra thông tin cần từ các phân vùng để mở rộng nó. Nếu mục tiêu là tìm kiếm một truy vấn trong cơ sở dữ liệu đồ thị hoặc
38
một tập các đồ thị, các đồ thị này có thể đƣợc phân tách dựa trên các nhãn cạnh và đỉnh thành các phần khác nhau. Mỗi phân vùng sẽ có một tập hợp các đồ thị với các nhãn đỉnh và nhãn cạnh giống nhau. Vì vậy, từ các đỉnh và nhãn của đồ thị đầu vào, ta sẽ biết đƣợc phân vùng nào có thể truy vấn. Tuy nhiên, nếu mục tiêu là truy vấn trong một đồ thị lớn, đồ thị có thể đƣợc phân chia thành các phân vùng nhỏ hơn tùy thuộc vào các nhãn nút và cạnh. Tuy nhiên để ngăn ngừa sự mất thông tin một số cạnh cần đƣợc nhân rộng trên khắp các phân vùng. Vì vậy, mỗi phân vùng sẽ bao gồm một tập các cạnh có nhãn hoặc các đỉnh giống nhau, và các phân vùng sẽ đƣợc sử dụng một cách hữu ích để mở rộng truy vấn.
Hầu hết các cách tiếp cận đƣợc đề xuất để tìm kiếm trên đồ thị có thể làm theo hai kỹ thuật, liên kết và thăm dò. Trong trƣờng hợp liên kết, mục đích chính là phân tách truy vấn vào một tập các truy vấn nhỏ hơn, thu nhận kết quả và gộp chúng lại để đƣa ra kết quả cuối cùng. Trong kỹ thuật truy vấn thăm dò, bắt đầu bằng một đỉnh trong câu truy vấn và mở rộng nó và nhận đƣợc kết quả từng phần ở từng giai đoạn để phát triển thành các kết quả cho truy vấn toàn bộ. So sánh giữa truy vấn liên kết và truy vấn thăm dò thì truy vấn thăm dò phù hợp hơn với truy vấn đồ thị. Đó là bởi vì trong trƣờng hợp thăm dò đồ thị, không có cấu trúc chỉ mục nào đƣợc yêu cầu, các chi phí liên kết tốn kém đƣợc tránh và ít các kết quả từng phần đƣợc tạo ra trong mỗi bƣớc truy vấn thăm dò. Tuy nhiên tất cả các truy vấn không thể đƣợc trả lời bằng cách sử dụng kỹ thuật thăm dò ví dụ nhƣ sự có mặt các chu kỳ và vòng lặp trong truy vấn. Hơn nữa trong đồ thị đƣợc liên thông hoàn toàn, truy vấn thăm dò sẽ cho kết quả trong một không gian tìm kiếm khổng lồ trong khi chiến lƣợc băm và gộp là thích hợp với truy vấn liên kết. Vì vậy, so sánh những ƣu và khuyết điểm của cả liên kết và thăm dò cho thấy rằng sự kết hợp chúng sẽ là chiến lƣợc tốt nhất cho truy vấn đồ thị phân tán. Truy vấn có thể đƣợc phân tách thành nhiều phần bằng cách giảm thiểu số lƣợng liên kết và sau đó mỗi phần có thể đƣợc khám phá một cách độc lập song song để có đƣợc các kết quả từng phần. Các kết quả từng phần sau đó có thể đƣợc liên kết để tìm ra các kết quả cuối cùng.
39
Một khía cạnh quan trọng của tìm kiếm đồ thị là trả lại các kết quả gần đúng nếu so khớp chính xác là không tìm thấy. Để xử lý so khớp không chính xác, việc định nghĩa gần đúng cũng là một thách thức. Sự gần đúng đã đƣợc định nghĩa về mặt lý thuyết nhƣ sự thiếu đỉnh, thiếu cạnh và sự bổ sung các đỉnh và các cạnh. Vì vậy, việc truy vấn thăm dò nên chú ý đến các tính chất không chính xác trong giai đoạn thăm dò để cho ra kết quả gần đúng. Một thay thế cho điều này có thể là sự tạo ra các truy vấn gần đúng từ các truy vấn ban đầu. Giản đồ cơ bản trong đồ thị thực thể quan hệ đƣợc biết trƣớc và sử dụng giản đồ này để tạo ra các câu truy vấn gần đúng từ truy vấn ban đầu. Một thách thức chính là quyết định truy vấn gần đúng với truy vấn ban đầu giống nhau nhƣ thế nào, khi truy vấn gần đúng càng giống với các truy vấn ban đầu thì chất lƣợng các kết quả đầu ra sẽ càng tốt hơn. Các truy vấn gần đúng tốt nhất đƣợc tìm thấy có thể đƣợc thực hiện song song để tìm ra một tập hợp các kết quả cho truy vấn đầu vào.
40
CHƢƠNG 4: ỨNG DỤNG MAPREDUCE GIẢI QUYẾT BÀI TOÁN TÌM ĐƢỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ PHÂN TÁN
Ngày nay, với sự bùng nổ của thông tin trên mạng Internet, dữ liệu đƣợc phân tán ở nhiều vị trí khác nhau. Do đó, việc tìm kiếm thông tin một cách hiệu quả cũng trở nên khó khăn. Một ƣớc lƣợng truy vấn thông tin hiệu quả trên đồ thị phân tán trở thành một chủ đề quan trọng trong nghiên cứu gần đây bởi nó có nhiều ứng dụng thực tiễn nhƣ: phân tích mạng xã hội, mạng đƣờng đi, vv... Một câu truy vấn đƣợc sử dụng rộng rãi trên đồ thị tổng quát là “tìm đƣờng đi ngắn nhất”, nó có thể đƣợc giải bằng một vài thuật toán nổi tiếng nhƣ Dijkstra, Johnson, hay Floyd- Warshall. Tuy nhiên, bài toán này là không đơn giản khi phải trả lời câu truy vấn trên một đồ thị phân tán. Trong đề tài này, tác giả đề xuất một cách tiếp cận mới dựa trên kỹ thuật ƣớc lƣợng từng phần để giải quyết bài toán tìm đƣờng đi ngắn nhất giữa hai đỉnh trên một đồ thị phân tán. Tác giả chỉ ra rằng thuật toán đề xuất có thể đƣợc cài đặt dƣới hình thức song song trên nền tảng MapReduce. Bằng việc sử dụng một tập dữ liệu trong thực tế cho thực nghiệm, tác giả tiến hành thực nghiệm và chỉ ra đƣợc thuật toán của tác giả có khả năng mở rộng cho các đồ thị lớn trên các hệ thống phân tán.
4.1. Bài toán tìm đƣờng đi ngắn nhất và thuật toán Dijkstra 4.1.1. Bài toán tìm đƣờng ngắn nhất 4.1.1. Bài toán tìm đƣờng ngắn nhất
Trong các ứng dụng thực tế, bài toán tìm đƣờng đi ngắn nhất giữa hai đỉnh của một đồ thị liên thông có một ý nghĩa to lớn. Có thể dẫn về bài toán nhƣ vậy nhiều bài toán thực tế quan trọng. Ví dụ, bài toán chọn một hành trình tiết kiệm nhất (theo tiêu chuẩn hoặc khoảng cách hoặc thời gian hoặc chi phí) trên một mạng giao thông đƣờng bộ, đƣờng thủy hoặc đƣờng không; bài toán chọn một phƣơng pháp tiết kiệm nhất để đƣa ra một hệ thống động lực từ trạng thái xuất phát đến trạng một trạng thái đích, bài toán lập lịch thi công các công đoạn trong một công trình thi công lớn, bài toán lựa chọn đƣờng truyền tin với chi phí nhỏ nhất trong mạng thông tin, v.v…
41
Hiện nay có rất nhiều phƣơng pháp để giải các bài toán nhƣ vậy. Thế nhƣng, thông thƣờng, các thuật toán đƣợc xây dựng dựa trên cơ sở lý thuyết đồ thị tỏ ra là các thuật toán có hiệu quả cao nhất.
Bài toán tìm đƣờng đi ngắn nhất có thể phát biểu dƣới dạng hình thức nhƣ sau: Cho trƣớc một đồ thị có trọng số G = (V, E), trong đó V là một tập đỉnh, E là một tập cạnh, hãy tìm đƣờng đi ngắn nhất từ đỉnh xuất s V đến đỉnh đích t V. Bài
toán đƣờng đi ngắn nhất giữa mọi cặp đỉnh là một bài toán tƣơng tự, trong đó ta phải tìm các đƣờng đi ngắn nhất cho mọi cặp đỉnh s và t.
Trong lý thuyết đồ thị, đã có nhiều thuật toán đƣợc đề xuất đề giải quyết bài toán tìm đƣờng đi ngắn nhất. Các thuật toán quan trọng nhất giải quyết bài toán này bao gồm:
Thuật toán Dijkstra: giải bài toán nguồn đơn nếu tất cả các trọng số đều
không âm. Thuật toán này có thể tính toán tất cả các đƣờng đi ngắn nhất từ một đỉnh xuất phát cho trƣớc s tới mọi đỉnh khác mà không làm tăng thời gian chạy.
Thuật toán Bellman-Ford: giải bài toán nguồn đơn trong trƣờng hợp
trọng số có thể có giá trị âm.
Giải thuật tìm kiếm A*: giải bài toán nguồn đơn sử dụng heuristics để
tăng tốc độ tìm kiếm
Thuật toán Floyd-Warshall: giải bài toán đƣờng đi ngắn nhất cho mọi cặp đỉnh.
Thuật toán Johnson: giải bài toán đƣờng đi ngắn nhất cho mọi cặp đỉnh,
có thể nhanh hơn thuật toán Floyd-Warshall trên các đồ thị thƣa.
Các thuật toán trên đƣợc xây dựng để giải quyết các bài toán đồ thị tổng quát, ở đó dữ liệu tập trung tại một máy tính đơn nhất. Tuy nhiên, nó là không đơn giản để trả lời câu truy vấn này trên một đồ thị lớn mà dữ liệu phân tán ở nhiều vị trí khác nhau. Trong đề tài này, tôi đã đề xuất một thuật toán dựa trên kỹ thuật ƣớc lƣợng
42
từng phần và khai thác nền tảng hỗ trợ xử lý dữ liệu song song MapReduce [5] để giải quyết bài toán tìm đƣờng đi ngắn nhất nêu trên.
Trong đề tài này, tác giả lựa chọn Dijkstra là giải thuật cài đặt trong phần tìm kiếm đƣờng đi từ một đỉnh tới một số đỉnh đích biết trƣớc trên đồ thị.
4.1.2. Thuật toán Dijkstra
Dijkstra là một thuật toán giải quyết bài toán đƣờng đi ngắn nhất nguồn đơn trong một đồ thị có hƣớng, mà trọng số trên các cung không âm [1].
Thuật toán đƣợc xây dựng dựa trên cơ sở gán cho các đỉnh các nhãn tạm thời. Nhãn của mỗi đỉnh cho biết cận của độ dài đƣờng đi ngắn nhất từ s đến nó. Các nhãn này sẽ đƣợc biến đổi theo một thủ tục lặp, mà ở mỗi bƣớc lặp có một nhãn tạm thời trở thành nhãn cố định. Nếu nhãn của một đỉnh nào đó trở thành một nhãn cố định thì nó sẽ cho ta không phải là cận trên mà là độ dài của đƣờng đi ngắn nhất từ đỉnh s đến nó, chi tiết xem trong Thuật toán 1 ở trang tiếp theo.
Thuật toán có độ phức tạp là O(n2
). Do độ phức tạp tính toán cao, việc giải bài toán này với tính chất tuần tự gặp phải bất lợi lớn về thời gian thực hiện chƣơng trình, tốc độ xử lý, khả năng lƣu trữ, v.v… Đặt biệt là trên đồ thị có hàng triệu, hàng tỷ đỉnh và cạnh mà thời gian chạy phải đƣợc rút gọn thì thuật toán tuần tự không thực hiện đƣợc.
Điều này đặt ra yêu cầu phải chia đồ thị cho một hệ thống phân tán có nhiều máy tính cùng tham gia tính toán đồng thời, song việc chia đồ thị thành các đồ thị nhỏ thì việc lƣu trữ các đồ thị nhỏ đó trên hệ thống file phân tán và việc sử dụng thuật toán tìm đƣờng đi ngắn nhất trên hệ thống phân tán đó trở nên thành một bài toán với nhiều thách thức.
43
Thuật toán 1: Thủ tục Dijkstra tìm đường đi ngắn nhất từ một đỉnh đến các đỉnh
Đầu vào: một đồ thị G = (V, E), đỉnh nguồn s
Đầu ra: độ dài đƣờng đi ngắn nhất từ đỉnh s đến các đỉnh còn lại trong đồ thị
1: for each vertex v in G // khởi tạo
2: dist[v] ← ∞; // khởi tạo giá trị từ s tới đỉnh v = ∞ 3: previous[v] ← null; // đỉnh trƣớc của đỉnh v
4: dist[source] ← 0; // khoảng cách từ nguồn tới nguồn