จะเก็บข้อมูล _structured_ จำนวนมากได้อย่างไร


9

แอปพลิเคชั่นจะรวบรวมตำแหน่งของผู้ใช้อย่างต่อเนื่อง (ประมาณทุกวินาที) และเก็บไว้

ข้อมูลนี้มีโครงสร้าง ในฐานข้อมูลเชิงสัมพันธ์มันจะถูกเก็บไว้เป็น: | user | timestamp | latitude | longitude |

อย่างไรก็ตามมีข้อมูลมากเกินไป จะมี 60 × 60 × 24 = 86,400 บันทึกต่อผู้ใช้ทุกวัน แม้จะมีผู้ใช้ 1,000 ราย แต่ก็หมายถึงบันทึก 86,400,000 ต่อวัน

และไม่เพียงบันทึก 86,400,000 ต่อวัน เนื่องจากบันทึกเหล่านี้จะถูกประมวลผลและเวอร์ชันที่ประมวลผลจะถูกเก็บไว้เช่นกัน ดังนั้นจงคูณจำนวนนั้นด้วยประมาณ 2

ฉันวางแผนจะใช้ข้อมูลอย่างไร

โดยพื้นฐานแล้วฉันวางแผนที่จะสร้างข้อมูลตำแหน่งที่หยาบขึ้นเพื่อให้ง่ายต่อการใช้งาน นั่นคือ:

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

ฉันควรใช้อะไรเพื่อจัดเก็บข้อมูลนี้ ฉันควรใช้ฐานข้อมูลเชิงสัมพันธ์หรือโซลูชัน NoSQL หรือไม่ ฉันควรพิจารณาสิ่งอื่นใดเมื่อออกแบบแอปพลิเคชันนี้


3
2000 บันทึกต่อวินาทีเช่นนั้นอาจไม่ทำให้เครื่องยนต์ SQL ทันสมัย การทดสอบความสามารถอย่างง่ายคือการรับโปรแกรมคอนโซลเขียนแบบสุ่มไปยังไฟล์ที่โหลดจำนวนมาก
Caleth

1
@ Caleth แต่มันปรับขนาดได้? สิ่งที่เกี่ยวกับเมื่อฐานผู้ใช้เติบโต 100 ครั้ง?
Utku

3
วัดสิ่งที่ฮาร์ดแวร์ของคุณสามารถจัดการได้ในขณะนี้ คอขวดมีแนวโน้มที่จะเป็น CPU "ประมวลผล" ค่าหรือความเร็วดิสก์ดิบ คุณตั้งใจจะทำอะไรกับข้อมูลทั้งหมดนี้? นั่นควรเป็นรูปแบบของเทคโนโลยีที่คุณเลือกสำหรับการจัดเก็บ
Caleth

3
Caleth ถูกต้องอย่างแน่นอน บันทึกนับล้านไม่ได้ทำให้สับสนระบบฐานข้อมูลที่ทันสมัย ร้านค้า NoSQL นั้นดีมากในการเขียนข้อมูลจำนวนมากอย่างรวดเร็ว แต่ในที่สุดคุณต้องการทำสิ่งที่เกี่ยวข้องกับการอ่านอีกครั้ง คุณต้องใช้การอ่านมากน้อยเพียงใดจะเป็นตัวกำหนดประเภทของร้านค้าที่คุณควรใช้
Kilian Foth

3
เพื่อให้คำตอบที่ดีเราจำเป็นต้องทราบวิธีการใช้ข้อมูลนี้ ฐานข้อมูลอาจเป็นตัวเลือกที่ดีถ้าคุณต้องการคิวรีแบบ ad-hoc ในขณะที่โซลูชันแบบไฟล์อาจจะดีกว่าสำหรับการวิเคราะห์ชุดข้อมูลทั้งหมด การลงคะแนนให้ปิด
kdgregory

คำตอบ:


9

ทางเลือกบางอย่างสำหรับการจัดเก็บข้อมูลนี้:

  1. คิวข้อความ (อาจแจกจ่าย) เช่น Apache Kafka

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

  1. ฐานข้อมูลเชิงสัมพันธ์

คุณสามารถเขียนลงในฐานข้อมูลและเมื่อปริมาณเกินกว่าความจุของฐานข้อมูลที่จะจัดการคุณสามารถหักฐานข้อมูล (= มีชุดย่อยหลายชุดของข้อมูลนั่งอยู่บนเซิร์ฟเวอร์ฐานข้อมูลที่แตกต่างกัน) ประโยชน์: คุณสามารถใช้ฐานข้อมูลเชิงสัมพันธ์และไม่ต้องเรียนรู้อะไรใหม่ ข้อเสีย: การจัดการโค้ดทั้งหมดกับฐานข้อมูลต้องระวังว่าส่วนใดของข้อมูลที่มีอยู่ต้องใช้แบบสอบถามที่รวบรวมไว้ในแอปพลิเคชันซอฟต์แวร์

  1. กระจายฐานข้อมูล NoSQL เช่น Cassandra

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

  1. Hadoop / ไฟล์

ข้อมูลจะถูกผนวกเข้ากับไฟล์ที่แจกจ่ายโดยอัตโนมัติผ่านเซิร์ฟเวอร์โดยแพลตฟอร์ม Hadoop ประมวลผลบนเซิร์ฟเวอร์เหล่านั้นโดยใช้เครื่องมือเช่น M / R หรือ Apache Spark และสุดท้ายถูกสอบถาม (เป็นไฟล์) โดยใช้เครื่องมือ Hadoop SQL เช่น Hive หรือ Impala

เลือกแบบไหน?

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


ฉันให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีที่ฉันวางแผนจะใช้ข้อมูล คุณต้องการเพิ่มอะไรที่ให้ข้อมูลนี้หรือไม่?
Utku

ยังไม่ชัดเจนสำหรับฉันความหมายของคุณจาก "การแก้ไข" คุณต้องการที่จะรวมเข้ากับระดับทางภูมิศาสตร์ (เมือง, รัฐ, ... ) หรือเข้าสู่ระบบพิกัดบางอย่างเช่น geohash หรือไม่? หรือคุณสนใจปริมาณของเดลต้าเนื่องจากคุณต้องการสร้างการแจ้งเตือนตามเกณฑ์การเคลื่อนไหว ในระยะสั้น: ทั้งหมดนี้มีไว้เพื่ออะไร?
Joeri Sebrechts

มันมีไว้สำหรับติดตามผู้ใช้ ผู้ใช้ติดตามแต่ละอื่น ๆ และฉันกราฟที่ผู้ใช้ที่พวกเขาติดตามได้ใน 5 ชั่วโมงล่าสุดบนอุปกรณ์ เป็นหลักยิ่งปลีกย่อยยิ่งดี อย่างไรก็ตามอุปกรณ์มือถือมีหน่วยความจำจำนวน จำกัด ดังนั้นคุณไม่สามารถส่งข้อมูลโดยไม่ลดความละเอียดลง นั่นคือสมมุติว่าผู้ใช้ A กำลังติดตามผู้ใช้ B, C และ D ถ้าฉันเพียงแค่ส่งข้อมูลตำแหน่งใด ๆ ที่ฉันได้รับจาก B, C และ D ไป A โดยไม่ทำการประมวลผลใด ๆ ที่ฝั่งเซิร์ฟเวอร์หน่วยความจำของอุปกรณ์ A จะเติมเต็มอย่างรวดเร็ว . ดังนั้นฉันต้องทำการประมวลผลบางอย่าง
Utku

ถ้าฉันจะสร้างสิ่งที่คุณอธิบายฉันจะสร้างมันเป็นชุดของบันทึก kafka ที่เชื่อมต่อผ่านการสตรีมแบบประกายไฟโดยที่ตำแหน่งถูกรวมเข้ากับหน้าต่างในสตรีมแบบประกายไฟ ผลักดันเว็บ API ให้กับลูกค้า อย่างไรก็ตาม ... นั่นเป็นเทคโนโลยีที่พิเศษมากและขึ้นอยู่กับพื้นหลังและเวลาที่มีให้เลือกอาจจะผิดสำหรับคุณ
Joeri Sebrechts

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

6

มองลึกลงไปในความต้องการของคุณ มีวิธีสร้างภาพลวงตาของตำแหน่งการติดตามทุกวินาที

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

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


2

ข้อมูลของคุณเป็นชุดของอนุกรมเวลา คุณได้รับชุดของตัวเลข (สองต่อผู้ใช้) ที่วิวัฒนาการไปตามกาลเวลา โดยทั่วไปแล้วคุณไม่ต้องการพื้นที่เก็บข้อมูลเชิงสัมพันธ์ใด ๆ แต่เป็นที่เก็บข้อมูล RRD ที่เก็บข้อมูลเหล่านี้เน้นที่การลดงาน I / O ของการเขียนขนาดเล็กจำนวนมากโดยการบัฟเฟอร์

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

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