วิธีการจัดเก็บข้อมูลชุดข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพ


27

ฉันต้องการจัดเก็บและสามารถสืบค้นข้อมูลอนุกรมเวลาจำนวนมากได้

คุณสมบัติของข้อมูลมีดังนี้:

  • จำนวนซีรีส์: ประมาณ 12.000 (หนึ่งหมื่นสองพัน)
  • จำนวนจุดข้อมูลทั่วโลก: ประมาณ 500,000 ต่อเดือน (ห้าร้อยล้าน)
  • ประเภทค่าผสม: จุดข้อมูลส่วนใหญ่เป็นค่าจุดลอยตัวส่วนที่เหลือเป็นสตริง
  • ระยะเวลาการสุ่มตัวอย่าง: ตัวแปรระหว่างซีรี่ส์และภายในซีรี่ส์
  • การประทับเวลา: ความแม่นยำมิลลิวินาที
  • ระยะเวลาการเก็บข้อมูล: หลายปีโดยไม่มีการลดลงหรือการสุ่มตัวอย่าง
  • คลังข้อมูลจะต้องถูกสร้างขึ้นในแบบเรียลไทม์ แต่มีความล่าช้าพอสมควร (~ 1 ชั่วโมง) เป็นที่ยอมรับ
  • ข้อมูลที่ผ่านมาสามารถสร้างใหม่ได้ถ้าต้องการ แต่มีค่าใช้จ่ายสูง
  • บางครั้ง แต่ค่อนข้างน้อยข้อมูลในอดีตบางอย่างจำเป็นต้องได้รับการอัปเดต

คุณสมบัติของข้อความค้นหาที่จินตนาการ:

  • ข้อความค้นหาส่วนใหญ่ที่มีข้อมูลจะเป็นแบบสอบถามแบบอิงตามเวลา ตั้งแต่วันหนึ่งถึงหลายเดือน / ปี 90% + จะสอบถามเกี่ยวกับข้อมูลล่าสุด

ข้อกำหนดอื่น ๆ :

  • การแก้ปัญหาจะต้องเป็นฟรีในเบียร์ฟรีและโอเพนซอร์สโดยเฉพาะอย่างยิ่ง

ความคิดเริ่มต้นของฉันคือการใช้ PyTables / Pandas กับไฟล์ HDF5เพื่อเก็บแบ็คเอนด์แทนฐานข้อมูล SQL

คำถาม:

  1. สมมติว่า PyTables / Pandas เป็นเส้นทางที่ "ดีที่สุด" มันจะดีกว่าไหมถ้าจะแบ่งข้อมูลออกเป็นไฟล์ HDF หลาย ๆ ไฟล์แต่ละอันครอบคลุมช่วงเวลาที่กำหนดหรือวางทุกอย่างไว้ในไฟล์เดียวที่จะกลายเป็นเรื่องใหญ่?

  2. ฉันควรไปและชอบรูปแบบคงที่หรือรูปแบบตารางหรือไม่ สำหรับฉันแล้วรูปแบบคงที่นั้นใช้ได้ถ้าฉันเก็บไฟล์ HDF หนึ่งไฟล์ต่อเดือนเพราะวิธีนี้ทั้งซีรีย์น่าจะเหมาะกับ RAM และฉันสามารถแบ่งหน่วยความจำในหน่วยความจำได้โดยไม่ต้องใช้ดัชนีรูปแบบตาราง ฉันถูกไหม ?

และถ้านั่นไม่ใช่วิธีที่ดีที่สุดฉันควรจัดโครงสร้างที่เก็บข้อมูลนี้หรือเทคโนโลยีใดที่ฉันควรพิจารณา ฉันไม่ใช่คนแรกที่จัดการเก็บข้อมูลอนุกรมเวลาจำนวนมากวิธีการทั่วไปในการแก้ไขปัญหานี้คืออะไร


วิธีการอื่นที่ฉันได้พิจารณา:

  • ฐานข้อมูลอาเรย์: เหมาะอย่างยิ่งสำหรับอนุกรมเวลาที่มีช่วงเวลาการสุ่มตัวอย่างคงที่เนื่องจากคุณจะต้องเก็บเวลาเริ่มต้นและเวลาสิ้นสุดและช่วงเวลาการสุ่มตัวอย่างของอาเรย์เท่านั้น แต่ด้วยช่วงเวลาการสุ่มตัวอย่างตัวแปรภายในชุดตัวเองฉันจำเป็นต้องรักษาความสัมพันธ์ของการประทับเวลา -> ค่าที่ใกล้ชิดว่าในมุมมองของฉันไม่เหมาะสำหรับ DBMS อาร์เรย์
  • ฐานข้อมูล SQL มาตรฐานที่มีการประทับเวลา, paramID, ค่าเป็นคอลัมน์ แต่โดยธรรมชาติแล้วพวกเขาร้องขอ disk I / O จำนวนมากสำหรับการสืบค้นใด ๆ

คุณควรพิจารณาฐานข้อมูลอาร์เรย์ - en.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS ฉันไม่ได้บอกว่าหนึ่งในนั้นจะถูกต้องหรือแม้กระทั่งคำตอบที่ดีที่สุดหรือดีพอเพียงว่าพวกเขาควรจะใส่ความคิดของคุณ นอกจากรายการในรายการนั้นยังมีระบบ kdb ( kx.com ) ถึงแม้ว่ามันจะห่างไกลจากฟรี
เครื่องหมายประสิทธิภาพสูง

ขอบคุณสำหรับข้อมูลของคุณ ฉันได้พิจารณาฐานข้อมูลอาเรย์แล้ว แต่ปัญหาที่ฉันพบกับสิ่งเหล่านี้คือพวกมันเหมาะอย่างยิ่งสำหรับอนุกรมเวลาที่มีช่วงการสุ่มตัวอย่างคงที่เนื่องจากคุณจะต้องเก็บเวลาเริ่มต้นและสิ้นสุดและระยะเวลาการสุ่มตัวอย่างของอาเรย์เท่านั้น ตัวอาร์เรย์เองและการทำดัชนีนั้นง่าย แต่ด้วยช่วงเวลาการสุ่มตัวอย่างตัวแปรภายในชุดตัวเองฉันจำเป็นต้องรักษาความสัมพันธ์ของการประทับเวลา -> ค่าที่ใกล้ชิดกว่าซึ่งในมุมมองของฉันไม่เหมาะสำหรับ DBMS อาร์เรย์ ด้วยที่กล่าวว่าฉันจะมีความสุขที่จะพิสูจน์ผิด
flyingmig

คำถามแก้ไขเพื่อเพิ่มสิ่งที่ฉันได้พิจารณาจนถึงตอนนี้
flyingmig

คำถาม: คุณต้องการจัดเก็บข้อมูลทั้งหมดหรือไม่? ข้อมูลสามารถสลายตัวเมื่อเวลาผ่านไปและ / หรือมีระดับความแม่นยำที่ยอมรับได้สำหรับซีรี่ส์แบบอิงลอยหรือไม่?
J Trana

1
@ moinuddin-quadri ฉันลงเอยด้วยการใช้วัตถุ DataFrame แพนด้าที่สำรองไว้โดยไฟล์ HDF5 รายเดือนโดยใช้รูปแบบตาราง ระบบใช้งานมานานกว่าหนึ่งปีและแสดงให้เห็นถึงความเสถียรและรวดเร็วมากแม้ไม่ได้ใช้ดิสก์ SSD ฉันจะพยายามเขียนบทความทั้งหมดเพื่อเป็นคำตอบเมื่อฉันมีเวลา อื่น ๆ โปรด PM ฉัน
flyingmig

คำตอบ:


5

คุณอาจต้องการดูคาร์บอนและเสียงกระซิบซึ่งเป็นส่วนหนึ่งของโครงการกราไฟท์ คาร์บอนสามารถจัดการข้อมูลอนุกรมเวลาจำนวนมากได้ แม้ว่าตอนนี้ฉันจะอ่านเอกสารแล้ว (มันไม่กี่ปีที่ผ่านมาตั้งแต่ฉันใช้มัน) มันเป็นเพียงข้อมูลตัวเลข คุณบอกว่าคุณมีข้อมูลสตริงด้วยดังนั้นคุณอาจไม่พบว่ามีประโยชน์ แม้ว่าคุณจะสามารถรวบรวมภูมิปัญญาบางอย่างเกี่ยวกับวิธีที่พวกเขาสามารถประมวลผลข้อมูลจำนวนมากได้อย่างรวดเร็ว

เพื่อให้คุณมีความคิดของวิธีการที่ดีตาชั่งมันเมื่อกราไฟท์เป็นครั้งแรกที่นำไปผลิตที่ Orbitz มันก็จัดการ160,000 ตัวชี้วัดต่อนาที


ขอบคุณสำหรับคำแนะนำ แต่จากความเข้าใจของฉันเสียงกระซิบไม่พอดีเพราะความแม่นยำของมันเป็นครั้งที่สองเมื่อฉันต้องการความแม่นยำมิลลิวินาทีและเมื่อคุณชี้ให้เห็นอย่างถูกต้องฉันมีข้อมูลสตริงเช่นกันซึ่งไม่สามารถเก็บไว้ที่นั่นได้
flyingmig

1
@flyingmig อย่าเขียนกระซิบเร็วขนาดนี้ การประทับเวลาของมันคือค่า Unix-epoch และ "ข้อมูลสตริง" ที่คุณอธิบายไว้ในคำถามฟังดูเหมือน enums มากขึ้นและข้อมูลเหล่านั้นมักถูกเก็บเป็นค่าจำนวนเต็มเล็กน้อย
Ross Patterson

เซียร์ใช้ Carbon / Graphite / Ceres เพื่อจัดเก็บดาต้าพอยน์ที่ไม่ซ้ำกัน 4M + ต่อนาที ไม่สมบูรณ์และต้องใช้การจัดกลุ่มกราไฟท์และ SSD แต่ใช้งานได้ วิธีแก้ปัญหาอื่น ๆ ทั้งหมดนั้นไม่สามารถปรับขนาดได้ในระดับนี้ที่เราพบ แต่ถ้าคุณมีความคิดอย่าลังเลที่จะพูดคุย
Kevin J. Rice

3

InfluxDBเป็นฐานข้อมูลโอเพนซอร์ซที่เขียนใน Go มันถูกเขียนขึ้นโดยเฉพาะเพื่อจัดการข้อมูลอนุกรมเวลาและพวกเขาเผยแพร่เกณฑ์มาตรฐานที่แสดงประสิทธิภาพที่ดีกว่า vs. Cassandra :

InfluxDB มีประสิทธิภาพสูงกว่าคาสซานดราในการทดสอบทั้งสามด้วยการเขียนปริมาณข้อมูลที่มากขึ้น 4.5x ในขณะที่ใช้พื้นที่ดิสก์น้อยลง 10.8x และให้เวลาตอบสนองที่เร็วขึ้นถึง 168x สำหรับแบบสอบถามที่ทดสอบ


2

คุณอาจต้องการเช็กเอาต์ฐานข้อมูลแบบคอลัมน์ ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดยฐานข้อมูลอาร์เรย์ แต่ด้วยวิธีการที่แนะนำของฉันคุณสามารถมีค่าจำนวนแบบไดนามิกต่อกรอบเวลา คุณยังสามารถมีหลายค่าสำหรับการประทับเวลาเดียวกัน ส่วนที่น่าสนใจคือถ้าคุณมีค่าที่วัดได้ในเวลาเดียวกันคุณสามารถบันทึกเป็นคอลัมน์เพิ่มเติม (เช่นเซ็นเซอร์ที่วัดอุณหภูมิและความชื้นในราคาซื้อขายหุ้นและขนาดของการค้า, ... ) เนื่องจากลักษณะเชิงคอลัมน์คุณสามารถมีตารางที่มี 100 คอลัมน์ แต่ถ้าคิวรีของคุณเข้าถึงห้าคอลัมน์เท่านั้นฐานข้อมูลจะอ่านเฉพาะข้อมูลของห้าคอลัมน์เท่านั้น

ฉันเขียนชุดข้อมูลเกี่ยวกับการสร้างฐานข้อมูลอนุกรมเวลาของคุณเองคุณอาจต้องการดู:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.