Làm thế nào để lưu trữ hiệu quả dữ liệu chuỗi thời gian lớn?


27

Tôi cần lưu trữ và để có thể truy vấn một số dữ liệu chuỗi thời gian rất lớn.

Các thuộc tính của dữ liệu như sau:

  • số sê-ri: khoảng 12.000 (mười hai nghìn)
  • số điểm dữ liệu trên toàn cầu: khoảng 500.000.000 mỗi tháng (năm trăm triệu)
  • các loại giá trị hỗn hợp: phần lớn các điểm dữ liệu là các giá trị dấu phẩy động, phần còn lại là các chuỗi
  • giai đoạn lấy mẫu: biến giữa các chuỗi cũng như trong một chuỗi
  • dấu thời gian: độ chính xác mili giây
  • thời gian lưu giữ dữ liệu: vài năm, không phân rã hoặc lấy mẫu
  • lưu trữ dữ liệu cần được xây dựng gần thời gian thực, nhưng độ trễ hợp lý (~ 1 giờ) là chấp nhận được
  • dữ liệu quá khứ có thể được xây dựng lại nếu cần, nhưng với chi phí cao
  • đôi khi, nhưng khá hiếm khi, một số dữ liệu trong quá khứ cần được cập nhật

Thuộc tính của các truy vấn được hình dung:

  • hầu hết các truy vấn đối với dữ liệu sẽ là các truy vấn dựa trên dấu thời gian; từ một ngày đến vài tháng / năm. 90% + sẽ là các truy vấn trên dữ liệu gần đây nhất

Những yêu cầu khác:

  • giải pháp phải miễn phí như trong bia miễn phí và tốt nhất là nguồn mở

Suy nghĩ ban đầu của tôi nghĩ là sử dụng PyTables / Pandas với các tệp HDF5 làm lưu trữ phụ trợ thay vì cơ sở dữ liệu SQL.

Câu hỏi:

  1. Giả sử PyTables / Pandas là tuyến đường "tốt nhất", sẽ tốt hơn nếu chia dữ liệu trong một số tệp HDF, mỗi tệp kéo dài trong một khoảng thời gian nhất định hoặc đặt mọi thứ vào một tệp sau đó sẽ trở nên khổng lồ?

  2. Tôi nên đi và thích định dạng bảng cố định hoặc bảng? Đối với tôi, định dạng cố định có vẻ ổn nếu tôi giữ một tệp HDF mỗi tháng, vì theo cách này, toàn bộ loạt có thể vừa với RAM và tôi có thể cắt trong bộ nhớ mà không cần chỉ mục định dạng bảng. Tôi có đúng không?

Và nếu đó không phải là cách tiếp cận tốt nhất, tôi nên cấu trúc kho dữ liệu này như thế nào hoặc tôi nên xem xét công nghệ nào? Tôi không phải là người đầu tiên giải quyết việc lưu trữ các tập hợp dữ liệu chuỗi thời gian lớn, cách tiếp cận chung để giải quyết thách thức này là gì?


Các cách tiếp cận khác tôi đã xem xét:

  • cơ sở dữ liệu mảng: chúng rất phù hợp với chuỗi thời gian với thời gian lấy mẫu không đổi, vì khi đó bạn chỉ cần lưu trữ thời gian bắt đầu và kết thúc và thời gian lấy mẫu của mảng, sau đó chỉ có các giá trị trong chính mảng và lập chỉ mục là dễ dàng. Nhưng với các giai đoạn lấy mẫu thay đổi trong chính chuỗi, tôi cần giữ một dấu thời gian gần hơn-> quan hệ giá trị, theo quan điểm của tôi không phù hợp lắm với DBMS mảng.
  • cơ sở dữ liệu SQL tiêu chuẩn với dấu thời gian, paramID, giá trị dưới dạng cột nhưng theo bản chất của chúng, chúng yêu cầu rất nhiều I / O đĩa cho bất kỳ truy vấn nào

Bạn nên xem xét cơ sở dữ liệu mảng - en.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS . Tôi không nói rằng một trong số họ sẽ là đúng, hoặc thậm chí là tốt nhất hoặc thậm chí là đủ tốt, trả lời, chỉ là họ nên đi vào suy nghĩ của bạn. Bên cạnh các mục trong danh sách đó còn có hệ thống kdb ( kx.com ) mặc dù nó không phải là miễn phí.
Đánh dấu hiệu suất cao

Cảm ơn về thông tin bạn vừa nhập. Tôi đã xem xét cơ sở dữ liệu mảng nhưng vấn đề tôi gặp phải là chúng rất phù hợp với chuỗi thời gian với thời gian lấy mẫu không đổi , khi đó bạn chỉ cần lưu trữ thời gian bắt đầu và kết thúc và thời gian lấy mẫu của mảng, sau đó chỉ có giá trị trong bản thân mảng và lập chỉ mục là dễ dàng. Nhưng với các giai đoạn lấy mẫu thay đổi trong chính chuỗi, tôi cần giữ một dấu thời gian gần hơn-> quan hệ giá trị, theo quan điểm của tôi không phù hợp lắm với DBMS mảng. Với những gì đã nói, tôi sẽ rất vui khi được chứng minh là sai.
Flyingmig

chỉnh sửa câu hỏi để thêm những gì tôi đã xem xét cho đến nay
Flyingmig

Câu hỏi: bạn có cần lưu trữ tất cả dữ liệu không? Dữ liệu có thể phân rã theo thời gian và / hoặc có một số mức độ chính xác chấp nhận được cho loạt dựa trên float không?
J Trana

1
@ moinuddin-quadri Tôi đã kết thúc bằng cách sử dụng các đối tượng DataFrame của gấu trúc được hỗ trợ bởi các tệp HDF5 hàng tháng bằng định dạng bảng. Hệ thống này đã hoạt động được hơn một năm và cho thấy rất ổn định và nhanh chóng, thậm chí không sử dụng đĩa SSD. Tôi sẽ cố gắng viết ra tất cả những điều đó như một câu trả lời khi tôi có thời gian. Khác hãy thoải mái PM cho tôi.
flymig

Câu trả lời:


5

Bạn có thể muốn xem carbonthì thầm , một phần của dự án than chì . Carbon có thể xử lý một lượng rất lớn dữ liệu chuỗi thời gian. Mặc dù, bây giờ tôi đã đọc các tài liệu (đã vài năm kể từ khi tôi sử dụng nó), nó chỉ dành cho dữ liệu số. Bạn nói rằng bạn cũng có dữ liệu chuỗi để bạn có thể không thấy điều này hữu ích. Mặc dù vậy, bạn có thể có thể lượm lặt được một chút khôn ngoan về cách họ có thể xử lý một lượng lớn dữ liệu một cách nhanh chóng.

Để cho bạn biết mức độ quy mô của nó, khi than chì lần đầu tiên được đưa vào sản xuất tại Orbitz, nó đã xử lý 160.000 số liệu mỗi phút .


Cảm ơn bạn đã gợi ý, nhưng từ sự hiểu biết của tôi thì không phù hợp bởi vì độ chính xác của nó là thứ hai khi tôi cần độ chính xác đến mili giây và như bạn đã chỉ ra một cách chính xác, tôi có dữ liệu chuỗi cũng không thể lưu trữ ở đó.
Flyingmig

1
@fellingmig Đừng viết thì thầm quá nhanh. Dấu thời gian của nó là các giá trị Unix-epoch. Và "dữ liệu chuỗi" mà bạn mô tả trong câu hỏi nghe có vẻ giống như enums và chúng thường được lưu trữ dưới dạng các giá trị nguyên nhỏ.
Ross Patterson

Sears đang sử dụng Carbon / Graphite / Ceres để lưu trữ 4M + điểm dữ liệu duy nhất mỗi phút. Nó không hoàn hảo, và nó yêu cầu phân cụm than chì và SSD, nhưng nó hoạt động. Tất cả các giải pháp khác ngoài đó không thể mở rộng đến mức này, mà chúng tôi đã tìm thấy, nhưng nếu bạn có ý tưởng, hãy thoải mái để hòa nhập.
Kevin J. Rice

3

InfluxDB là một cơ sở dữ liệu nguồn mở được viết bằng Go. Nó đã được viết đặc biệt để xử lý dữ liệu chuỗi thời gian và họ đã công bố điểm chuẩn cho thấy hiệu suất tốt hơn nhiều so với Cassandra :

InfluxDB vượt trội so với Cassandra trong cả ba thử nghiệm với thông lượng ghi lớn hơn 4,5 lần, trong khi sử dụng không gian đĩa ít hơn 10,8 lần và cung cấp thời gian phản hồi nhanh hơn tới 168 lần cho các truy vấn được kiểm tra.


2

bạn có thể muốn kiểm tra cơ sở dữ liệu theo định hướng cột. Tôi không chắc ý của bạn về cơ sở dữ liệu mảng nhưng với cách tiếp cận được đề xuất của tôi, bạn có thể có số lượng giá trị động trên mỗi khung thời gian. Bạn cũng có thể có nhiều giá trị cho cùng dấu thời gian. Điều thú vị là nếu bạn có các giá trị được đo tại cùng một dấu thời gian, bạn có thể lưu chúng dưới dạng các cột bổ sung (ví dụ: cảm biến đo nhiệt độ và độ ẩm, theo giá giao dịch chứng khoán và quy mô của giao dịch, ...). Do tính chất hướng theo cột, bạn có thể có các bảng có 100 cột nhưng nếu truy vấn của bạn chỉ truy cập năm cột thì cơ sở dữ liệu chỉ đọc dữ liệu của năm cột.

Tôi đã viết một loạt về việc tạo cơ sở dữ liệu chuỗi thời gian của riêng bạn, bạn có thể muốn xem 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.