Làm thế nào để một truy vấn vào một cơ sở dữ liệu lớn trả về với độ trễ không đáng kể?


12

Ví dụ: khi tìm kiếm thứ gì đó trong Google, kết quả sẽ trả về ngay lập tức.

Tôi hiểu rằng Google sắp xếp và lập chỉ mục các trang bằng thuật toán, v.v., nhưng tôi tưởng tượng rằng kết quả của mỗi truy vấn có thể được lập chỉ mục là không khả thi (và kết quả được cá nhân hóa, điều này làm cho điều này thậm chí còn khó khả thi hơn)?

Hơn nữa, độ trễ phần cứng trong phần cứng của Google có lớn không? Ngay cả khi dữ liệu trong Google đều được lưu trữ trong ổ SSD / s, tôi vẫn tưởng tượng độ trễ phần cứng là rất lớn, do lượng dữ liệu tuyệt đối cần xử lý.

MapReduce có giúp giải quyết vấn đề này không?

EDIT: Được rồi, vì vậy tôi hiểu rằng các tìm kiếm phổ biến có thể được lưu trong bộ nhớ. Nhưng những gì về tìm kiếm không phổ biến? Ngay cả đối với tìm kiếm khó hiểu nhất mà tôi đã thực hiện, tôi không nghĩ rằng tìm kiếm đã từng được báo cáo là lớn hơn 5 giây. Sao có thể như thế được?

Câu trả lời:


13

Chà, tôi không chắc liệu MapReduce có giải quyết được vấn đề không, nhưng chắc chắn sẽ không phải là MapReduce một mình giải quyết tất cả những câu hỏi mà bạn nêu ra. Nhưng đây là những điều quan trọng cần tính đến và điều đó khả thi khi có độ trễ thấp như vậy đối với các truy vấn từ tất cả các TB dữ liệu này trong các máy khác nhau:

  1. điện toán phân tán: bằng cách được phân phối không có nghĩa là các chỉ mục được phân phối đơn giản trong các máy khác nhau, chúng thực sự được sao chép dọc theo các cụm khác nhau, cho phép nhiều người dùng thực hiện các truy vấn khác nhau với thời gian truy xuất thấp (vâng, các công ty lớn có thể chi trả cho số tiền đó của máy móc);
  2. bộ nhớ đệm: lưu trữ giúp giảm đáng kể thời gian thực hiện, có thể là cho bước thu thập dữ liệu, cho việc truy xuất các trang hoặc để xếp hạng và cấm kết quả;
  3. rất nhiều điều chỉnh: tất cả các thuật toán / giải pháp rất hiệu quả ở trên và chỉ có thể có hiệu quả nếu việc triển khai cũng hiệu quả. Có hàng tấn tối ưu hóa (mã hóa cứng), chẳng hạn như địa phương tham chiếu, nén, lưu trữ; tất cả chúng thường được hoan nghênh cho các phần khác nhau của quá trình chế biến.

Xem xét điều đó, hãy thử giải quyết các câu hỏi của bạn:

nhưng tôi tưởng tượng rằng kết quả của mỗi truy vấn có thể được lập chỉ mục là không khả thi

Vâng, nó sẽ là, và thực sự không thể có kết quả cho mỗi truy vấn có thể . Có một số lượng vô hạn các thuật ngữ trên thế giới (ngay cả khi bạn cho rằng chỉ các thuật ngữ được viết đúng chính tả mới được nhập) và có một số lượng truy vấn theo cấp số nhân từ các n -> infthuật ngữ này ( 2^n). Vậy những gì đã được thực hiện? Bộ nhớ đệm. Nhưng nếu có quá nhiều truy vấn / kết quả, cái nào cần lưu trữ? Chính sách lưu trữ. Các truy vấn thường xuyên nhất / phổ biến / có liên quan cho người dùng là những truy vấn được lưu trong bộ nhớ cache.

độ trễ phần cứng trong phần cứng của Google sẽ rất lớn? Ngay cả khi dữ liệu trong Google đều được lưu trữ trong ổ SSD / s

Ngày nay, với các bộ xử lý phát triển cao như vậy, mọi người có xu hướng nghĩ rằng mọi tác vụ có thể phải hoàn thành trong vòng một giây (hoặc ít hơn) và xử lý rất nhiều dữ liệu, phải được xử lý bởi các bộ xử lý cực kỳ mạnh mẽ với nhiều lõi và nhiều bộ nhớ. Tuy nhiên, một điều duy nhất thị trường cai trị là tiền, và các nhà đầu tư không quan tâm đến việc lãng phí nó. Vậy những gì đã được thực hiện?

Sở thích thực sự là có nhiều máy móc, mỗi máy sử dụng bộ xử lý đơn giản / có thể truy cập (về chi phí), giúp giảm giá xây dựng vô số cụm. Và vâng, nó làm việc. Nút cổ chai chính luôn sôi xuống đĩa, nếu bạn xem xét các phép đo hiệu suất đơn giản . Nhưng một khi có rất nhiều máy móc, người ta có thể đủ khả năng tải mọi thứ lên bộ nhớ chính, thay vì làm việc trên đĩa cứng.

Thẻ nhớ rất đắt đối với chúng ta, chỉ là con người, nhưng chúng rất rẻ cho các doanh nghiệp mua nhiều thẻ như vậy cùng một lúc. Vì nó không tốn kém, nên có nhiều bộ nhớ cần thiết để tải các chỉ mục và giữ bộ nhớ cache trong tay không phải là vấn đề. Và vì có rất nhiều máy móc, không cần bộ xử lý siêu nhanh, vì bạn có thể truy vấn trực tiếp đến các địa điểm khác nhau và có các cụm máy chịu trách nhiệm tham dự các vùng địa lý cụ thể , cho phép lưu trữ dữ liệu chuyên dụng hơn và phản hồi tốt hơn lần

MapReduce có giúp giải quyết vấn đề này không?

Mặc dù tôi không nghĩ rằng việc sử dụng hay không MapReduce là thông tin bị hạn chế trong Google, tôi không nói về điểm này. Tuy nhiên, việc triển khai MapReduce của Google (chắc chắn không phải là Hadoop) phải có nhiều tối ưu hóa, nhiều khía cạnh liên quan đến các khía cạnh được thảo luận ở trên. Vì vậy, kiến ​​trúc của MapReduce có thể giúp hướng dẫn cách tính toán được phân phối vật lý, nhưng có nhiều điểm khác được xem xét để chứng minh tốc độ như vậy trong thời gian truy vấn.

Được rồi, vì vậy tôi hiểu rằng các tìm kiếm phổ biến có thể được lưu trong bộ nhớ. Nhưng những gì về tìm kiếm không phổ biến?

Biểu đồ dưới đây trình bày một đường cong về cách các loại truy vấn xảy ra. Bạn có thể thấy rằng có ba loại tìm kiếm chính, mỗi loại tìm kiếm chiếm khoảng 1/3 khối lượng truy vấn (khu vực bên dưới đường cong). Cốt truyện cho thấy luật sức mạnh và củng cố thực tế rằng các truy vấn nhỏ hơn là phổ biến nhất. Thứ ba thứ hai của các truy vấn vẫn khả thi để xử lý, vì chúng giữ một vài từ. Nhưng tập hợp các truy vấn được gọi là tối nghĩa , thường bao gồm các truy vấn của người dùng không có kinh nghiệm, không phải là một phần không đáng kể của các truy vấn.

Phân phối đuôi nặng

Và có không gian cho các giải pháp mới. Vì đó không chỉ là một hoặc hai truy vấn (mà là một phần ba trong số chúng), chúng phải có kết quả phù hợp . Nếu bạn gõ một cái gì đó nhiều quá che khuất trong một tìm kiếm Google, nó sẽ không mất nhiều thời gian để trả về một danh sách kết quả, nhưng có lẽ hầu hết sẽ cho bạn thấy một cái gì đó nó suy ra bạn muốn nói. Hoặc có thể chỉ đơn giản là không có tài liệu nào có các thuật ngữ như vậy - hoặc thậm chí cắt giảm tìm kiếm của bạn xuống còn 32 từ (điều này vừa xảy ra với tôi trong một bài kiểm tra ngẫu nhiên ở đây).

Có hàng tá các heuristic đáng khen ngợi, có thể bỏ qua một số từ hoặc cố gắng chia truy vấn thành các từ nhỏ hơn và thu thập các kết quả phổ biến nhất . Và tất cả các giải pháp này có thể được điều chỉnh và điều chỉnh để tôn trọng thời gian chờ đợi khả thi của, giả sử, sau đó ít hơn một giây? : D


Tôi chỉnh sửa câu hỏi để thêm một truy vấn khác.
phục hồi

@namehere Tôi đã cố gắng giải quyết chỉnh sửa của bạn; hy vọng nó sẽ giúp trả lời câu hỏi
Rubens

10

MapReduce không liên quan gì đến thời gian thực. Nó là một khung xử lý theo định hướng hàng loạt phù hợp cho một số tác vụ ngoại tuyến, như ETL và xây dựng chỉ mục. Google đã chuyển khỏi MapReduce cho hầu hết các công việc hiện tại và ngay cả hệ sinh thái Hadoop cũng đang làm như vậy.

Câu trả lời cho độ trễ thấp thường là giữ các chỉ số được tính toán trước trong bộ nhớ. Bất cứ điều gì chạm vào đĩa là khó để thực hiện nhanh chóng và quy mô. Đây là cách các công cụ SQL dựa trên Hadoop thế hệ mới hơn như Impala có được tốc độ rất lớn so với cơ sở hạ tầng dựa trên MapReduce như Hive , chẳng hạn.

Cơ sở hạ tầng tìm kiếm không thể lưu trữ kết quả của mỗi truy vấn. Nhưng nó chắc chắn có thể lưu trữ kết quả trung gian hoặc kết quả đầy đủ hơn cho các truy vấn hàng đầu. Với một bộ nhớ đệm nhỏ, bạn có thể cung cấp kết quả cho một nhóm thiểu số đáng kể trong tất cả các truy vấn.

Tìm kiếm cũng được phân chia trên các máy chủ. Vì vậy, một máy có thể ủy nhiệm cho 100 cho mỗi máy lấy một phần kết quả và sau đó kết hợp chúng.

Bạn cũng có thể có được một số mức độ gần đúng. Google không thực sự hình thành một nghìn trang kết quả tìm kiếm; nó chỉ cần có được trang đầu tiên về đúng.

Hãy nhớ rằng Google có hàng triệu máy tính trên toàn cầu. Các truy vấn của bạn sẽ đến một trung tâm dữ liệu về mặt địa lý gần bạn và điều đó chỉ phục vụ cho địa lý của bạn. Điều này cắt giảm hầu hết độ trễ, đó là mạng và không xử lý thời gian trong trung tâm dữ liệu.


Đầu tiên, tôi chỉnh sửa câu hỏi để thêm một truy vấn khác. Ngoài ra: Tôi tưởng tượng ngay cả với một nhóm thiểu số đáng kể được tính toán trước, phần còn lại của truy vấn vẫn sẽ mất nhiều thời gian để hoàn thành. Ngoài ra, khi quy trình được ủy quyền từ một máy đến 100 máy, độ trễ thực sự không tăng (độ trễ mạng giữa các máy và tổng độ trễ là tối đa độ trễ của tất cả các máy)?
resgh

Ý tôi là việc trả lời truy vấn "spaghetti diamond", đây là một truy vấn hiếm, có thể được tăng tốc bởi các kết quả được tính toán trước cho "spaghetti" và "diamond". Kết nối Int-DC rất nhanh và độ trễ thấp. Một hoặc hai bước nhảy bổ sung bên trong không là gì so với ~ 20 bước nhảy giữa máy tính của bạn và DC. Vấn đề chi phối trong phân phối công việc là vấn đề lảo đảo; bạn phải loại bỏ kết quả từ một số tập hợp con nếu chúng không phản hồi kịp thời. Đây là tất cả các khái quát chung nhưng điểm theo đúng hướng.
Sean Owen

4

MapReduce không được sử dụng trong tìm kiếm. Nó đã được sử dụng từ lâu để xây dựng chỉ mục; nhưng nó là một khung xử lý hàng loạt và hầu hết các trang web không thay đổi tất cả thời gian, vì vậy các kiến ​​trúc mới hơn đều tăng dần thay vì theo định hướng hàng loạt.

Tìm kiếm trong Google phần lớn sẽ hoạt động giống như nó hoạt động trong Lucene và Tìm kiếm đàn hồi, ngoại trừ rất nhiều trọng số và tối ưu hóa được điều chỉnh tốt. Nhưng tại trung tâm, họ sẽ sử dụng một số dạng của một chỉ số đảo ngược . Nói cách khác, họ không tìm kiếm vài terabyte khi bạn nhập truy vấn tìm kiếm (ngay cả khi nó không được lưu trong bộ nhớ cache). Họ có thể không nhìn vào các tài liệu thực tế. Nhưng họ sử dụng bảng tra cứu liệt kê những tài liệu phù hợp với thuật ngữ truy vấn của bạn (với từ gốc, lỗi chính tả, từ đồng nghĩa, v.v ... tất cả đều được xử lý trước). Họ có thể lấy danh sách 10000 tài liệu hàng đầu cho mỗi từ (số nguyên 10k - chỉ vài kb!) Và tính toán các kết quả phù hợp nhất từ ​​đó. Chỉ khi không có kết quả phù hợp trong các danh sách này, chúng mới mở rộng sang các khối tiếp theo như vậy, v.v.

Truy vấn cho các từ phổ biến có thể được lưu trữ dễ dàng; và thông qua tiền xử lý, bạn có thể tạo danh sách 10k kết quả hàng đầu và sau đó kiểm tra lại chúng theo hồ sơ người dùng. Không có gì đạt được bằng cách tính một câu trả lời "chính xác". Nhìn vào kết quả 10k hàng đầu có khả năng là đủ; không có câu trả lời đúng; và nếu kết quả tốt hơn ở đâu đó tại vị trí 10001 bị bỏ lỡ, sẽ không ai biết hoặc chú ý (hoặc quan tâm). Nó có khả năng đã được xếp hạng trong tiền xử lý và sẽ không lọt vào top 10 được trình bày cho người dùng ở cuối (hoặc top 3, người dùng thực sự nhìn vào)

Mặt khác, các điều khoản hiếm cũng không phải là một thách thức - một trong những danh sách chỉ chứa một vài tài liệu phù hợp và bạn có thể loại bỏ ngay lập tức tất cả những điều khác.

Tôi khuyên bạn nên đọc bài viết này:

Cấu tạo của một công cụ tìm kiếm web siêu văn bản quy mô lớn
Serge Brin và Lawrence Trang
Khoa học máy tính, Đại học Stanford, Stanford, CA 94305
http://infolab.stanford.edu/~backrub/google.html

Và vâng, đó là những người sáng lập Google đã viết điều này. Đây không phải là trạng thái mới nhất, nhưng nó sẽ hoạt động ở quy mô khá lớn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.