बड़े (> 22 ट्रिलियन आइटम) तेज़ी के साथ भू-स्थानिक डेटासेट (<1s) क्वेरी प्रदर्शन पढ़ें


20

मैं एक बड़े भू-स्थानिक डेटा सेट के लिए एक नई प्रणाली तैयार करने की प्रक्रिया में हूं, जिसके लिए तेजी से पढ़े जाने वाले क्वेरी प्रदर्शन की आवश्यकता होगी। इसलिए मैं यह देखना चाहता हूं कि क्या किसी को लगता है कि यह संभव है या उसके पास उपयुक्त DBMS, डेटा संरचना, या वैकल्पिक तरीकों के बारे में अनुभव / सलाह है, जो निम्न स्थिति में आवश्यक प्रदर्शन प्राप्त कर सकता है:

संसाधित सैटेलाइट रडार डेटा से डेटा लगातार उत्पादित किया जाएगा, जिसमें वैश्विक कवरेज होगा। दुनिया के उपग्रह संकल्प और भूमि कवरेज के आधार पर, मैं अनुमान लगाता हूं कि विश्व के 75 बिलियन असतत स्थानों पर मूल्यों का उत्पादन करने के लिए पूरा डेटा सेट है। एक एकल उपग्रह के जीवन काल के दौरान, इन स्थानों में से प्रत्येक में 300 मानों का उत्पादन होगा (इसलिए कुल डेटा सेट> 22 ट्रिलियन मान)। यह एक उपग्रह के लिए है, और पहले से ही कक्षा में एक दूसरा है, नए दो वर्षों में एक और दो की योजना बनाई गई है। तो बहुत सारा डाटा होगा! एक एकल डेटा आइटम बहुत सरल है और इसमें केवल (देशांतर, अक्षांश, मूल्य) शामिल होंगे, लेकिन आइटमों की संख्या के कारण मैं 100TB तक के उत्पादन के लिए एकल उपग्रह का अनुमान लगाता हूं।

लिखित डेटा को अद्यतन करने की आवश्यकता नहीं होनी चाहिए, क्योंकि यह केवल बढ़ेगा क्योंकि नए उपग्रह अधिग्रहण संसाधित होते हैं। प्रदर्शन लिखना महत्वपूर्ण नहीं है, लेकिन पढ़ना प्रदर्शन महत्वपूर्ण है। इस परियोजना का लक्ष्य एक सरल इंटरफ़ेस के माध्यम से डेटा की कल्पना करने में सक्षम होना है जैसे कि गूगल मैप्स पर एक परत, जहां प्रत्येक बिंदु का औसत, ग्रेडिएंट या समय के साथ कुछ फ़ंक्शन के आधार पर रंगीन मान होता है। (पोस्ट के अंत में डेमो)।

इन आवश्यकताओं से, डेटाबेस को मापनीय बनाने की आवश्यकता है और हमें क्लाउड समाधानों की ओर देखने की संभावना है। सिस्टम को भू-स्थानिक प्रश्नों से निपटने में सक्षम होना चाहिए जैसे कि "अंक पास (अव्यक्त, लोन)" और "अंक (बॉक्स) के भीतर" ", और एक बिंदु का पता लगाने के लिए <1s का प्रदर्शन पढ़ा है, और बहुभुज जो सम्‍मिलित हैं 50,000 अंक (हालांकि 200,000 तक अंक बेहतर होंगे)।

अब तक मेरे पास 111 मिलियन स्थानों पर ~ 750 मिलियन डेटा आइटम का एक परीक्षण डेटा सेट है। मैंने एक पोस्टग्रैज / पोस्टगिस उदाहरण का परीक्षण किया है, जो ठीक काम किया है, लेकिन इसे तेज करने की संभावना के बिना मैं ऐसा नहीं कर पाऊंगा क्योंकि डेटा बढ़ता है। मैंने एक मोंगोडीबी उदाहरण का भी परीक्षण किया है, जो फिर से ओके पर दिखाई देता है दूर तक, और पैनापन के साथ यह डेटा की मात्रा के पैमाने के लिए पर्याप्त हो सकता है। मैंने हाल ही में इलास्टिक्स खोज के बारे में थोड़ा सीखा है, इसलिए इस पर कोई भी टिप्पणी उपयोगी होगी क्योंकि यह मेरे लिए नया है।

यहाँ एक त्वरित एनीमेशन है जिसे हम पूर्ण डेटा सेट के साथ प्राप्त करना चाहते हैं: 750 मिलियन डेटा आइटम्स का विज़ुअलाइज़ेशन परोसने वाला टाइलसर्वर।

यह gif (मेरे पोस्टग्रेज ट्रायल से) 6x3 प्री-कंप्यूटेड रैस्टर टाइल्स परोस रहा है, जिनमें से प्रत्येक में ~ 200,000 अंक हैं और प्रत्येक को उत्पन्न करने के लिए ~ 17s ले रहे हैं। एक बिंदु पर क्लिक करके <1s में निकटतम स्थान पर सभी ऐतिहासिक मूल्यों को खींचकर ग्राफ बनाया जाता है।

लंबी पोस्ट के लिए क्षमायाचना, सभी टिप्पणियों / सलाह का स्वागत है।

जवाबों:


4

आप स्थान के हिसाब से शार्द कर सकते हैं। ग्लोब को एक ग्रिड में विभाजित करें और उस ग्रिड में प्रत्येक वर्ग को एक सर्वर पर रखें। चूंकि आपने क्लाउड का उल्लेख किया है, इसलिए यह क्लाउड के अनुकूल होगा। बेशक, आपको कई सर्वरों से परिणामों को मैन्युअल रूप से मर्ज करना होगा।

इस तरह आप अपने पसंद के किसी भी डेटाबेस समाधान का उपयोग कर सकते हैं। यह अपने आप पर स्केलेबल होने की आवश्यकता नहीं है।

अलग-अलग वर्गों में अलग-अलग मात्रा में डेटा होगा। आप उनके लिए अलग-अलग आकार की मशीनों का उपयोग कर सकते हैं (क्योंकि यह क्लाउड है), या आप एक ही मशीन पर कई छोटे शार्क लगाते हैं।

यह शार्पिंग स्कीम आपके द्वारा किए जाने वाले प्रश्नों के लिए बहुत बढ़िया है क्योंकि प्रत्येक क्वेरी को केवल बहुत कम शार्ड्स को छूने की आवश्यकता होगी। समय के अनुसार शेयरिंग करना और भी बुरा है क्योंकि हर समय प्रत्येक प्रश्न के लिए शार्क को स्पर्श किया जाना चाहिए। रैंडम शेरिंग में भी यही समस्या है।

यह सब एक आसान शार्डिंग केस है क्योंकि क्वेरी पैटर्न शार्डिंग स्कीम को इतनी अच्छी तरह से फिट करता है।

वास्तव में, मुझे आश्चर्य है कि क्या आपको इसके लिए एक डेटाबेस की आवश्यकता है। हो सकता है कि आप ग्लोब को 1000x1000 टाइल या छोटे में विभाजित कर सकें और प्रत्येक टाइल के लिए बूँद भंडारण में एक फ्लैट फ़ाइल हो। ब्लॉब स्टोरेज का मन नहीं करता है 1M बिल्कुल भी नहीं खिलता है।

इस संग्रहण योजना के साथ एक क्वेरी निष्पादित करना वैचारिक रूप से बहुत आसान है। आप एक से अधिक ग्रिड रिज़ॉल्यूशन में डेटा को अतिरेक से संग्रहीत कर सकते हैं।


रीजनिंग में शार्पिंग वह दृष्टिकोण है जो मैं MongoDB के साथ देख रहा हूं, और MongoDB Atlas की समय पर रिलीज़ के साथ, मैं वर्तमान में उस दिशा में झुकाव कर रहा हूं (पूर्व-संकलित कुल मानों का उपयोग करके)। फिलहाल मैं अनिश्चित हूं कि मुझे कितने प्रतिकृति / शार्क सर्वर की आवश्यकता होगी, इसलिए लागत एक मुद्दा बन सकती है। BLOB भंडारण का उपयोग करने का आपका प्रस्ताव भी दिलचस्प है, और आप इसे प्रस्तावित करने वाले दूसरे व्यक्ति हैं। हालाँकि, BLOB का उपयोग करना मेरे लिए पूरी तरह से नया है, इसलिए मुझे इसे आगे पढ़ने की आवश्यकता है, कोई उपयोगी स्रोत जो आप जानते हैं? जवाब के लिए धन्यवाद।
अज़वॉक

बूँदें उपयोग करने के लिए तुच्छ हैं। जटिलता आपको सीरियलाइज़ेशन, क्वेरीज़, ट्रांजेक्शन, बैकअप, हा, डीए जैसे डेटाबेस फीचर्स को लागू करने की आवश्यकता से उत्पन्न होगी। यह सब उल्लेखनीय है लेकिन शायद बुद्धिमान नहीं है। हो सकता है कि आप ब्लब्स को पोस्टग्रैज टेबल में स्टोर कर सकते हैं। कि क्रमांकन और क्वेरी को छोड़कर सभी को स्वचालित करता है। बूँद बूँद भंडारण से बेहतर हो सकता है और शायद यह भी सस्ता है। ब्लॉब्स और वीएम को लागत से चार्ज नहीं किया जाता है, उनके पास एक अच्छा मार्जिन है (प्रमाण: मेरे स्थानीय वेबहोस्टर चार्ज क्लाउड की तुलना में समान गणना शक्ति के लिए 3-5x कम है। इसका मतलब है कि यह उच्च क्लाउड मार्जिन है)।
यूएसआर

ध्यान दें, कि आप एक ही मोंगो उदाहरण पर कई शार्क को चला सकते हैं। आप "ओवरशेड" कर सकते हैं। इस तरह से आप सर्वर को संतुलित कर सकते हैं।
यूएसआर

1
मुझे यकीन नहीं है कि आपको किसी भी स्थानिक सुविधाओं की आवश्यकता है। आप अनुप्रयोग में उस सभी की गणना कर सकते हैं। आपको बस एक आयत के लिए सभी डेटा को क्वेरी करने की क्षमता की आवश्यकता है। यह मैन्युअल रूप से ग्लोब को ग्रिड (या एकाधिक रिज़ॉल्यूशन ग्रिड) में विभाजित करके किया जा सकता है। आपके डीबी को मुझे लगता है कि स्थानिक का समर्थन करने की आवश्यकता नहीं है।
यूएसआर

8

अप-टू-डेट आपके पढ़ने के प्रश्नों की क्या आवश्यकता है?

आप डेटाबेस को समय से विभाजित कर सकते हैं यदि मानचित्र को अभी हाल के माप को दिखाने की आवश्यकता है। यह नक्शे के लिए आपके क्वेरी लोड को कम करेगा।

किसी दिए गए बिंदु के इतिहास के लिए, आप इतिहास दिखाते हुए x और y द्वारा दूसरा स्टोर पकड़ सकते हैं। यह एक रात के ताज़ा / अद्यतन के साथ किया जा सकता है क्योंकि ऐतिहासिक डेटा नहीं बदलेगा।

तब आप विभिन्न ज़ूम स्तरों पर मानचित्रों के साथ एकीकरण के लिए अधिक मोटे प्रस्तावों पर औसत गणना कर सकते थे। यह बड़े मानचित्र क्षेत्रों (ज़ूम आउट) के लिए पुनः प्राप्त करने के लिए अंकों की संख्या को कम करेगा। महीन प्रस्तावों का उपयोग उन मानचित्रों में अधिक ज़ूम करने के लिए किया जाएगा जो छोटे क्षेत्रों को क्वेरी कर रहे थे। यदि आपको वास्तव में इसे गति देने की आवश्यकता है तो आप टाइलों को बूँद के रूप में गणना कर सकते हैं और उन्हें अपने आवेदन में व्याख्या कर सकते हैं।

क्योंकि इनमें समग्र जानकारी की कुछ पुनः गणना शामिल होगी, जिससे क्वेरी परिणामों में कुछ विलंबता होगी। निर्भर करता है कि कितनी विलंबता स्वीकार्य थी आप इस प्रकार के दृष्टिकोण का उपयोग अपने रीड्स को अनुकूलित करने के लिए कर सकते हैं।

ठीक है, इसलिए समय के साथ आपके अंकों की गणना औसत होनी चाहिए। इस गणना के साथ, मुझे लगता है कि आपके वास्तविक प्रश्नों में 22 ट्रिलियन वस्तुओं से काफी कमी आई है क्योंकि क्वेरी के लिए रैस्टर मानों की पूर्व-गणना की जा सकती है।


रीड क्वेरीज़ में थोड़ी देरी (एक या दो दिन) हो सकती है, इसलिए बैच प्रोसेसिंग एक वैध विकल्प है। किसी भी स्थान पर, एक नया मान केवल 6 दिनों में सबसे तेज (अगले उपग्रह पास) में जोड़ा जाएगा। मानचित्र पर आउटपुट केवल नवीनतम मूल्य नहीं है, यह उस स्थान पर मूल्यों के पूरे इतिहास के आधार पर गणना की जाती है, जैसे यह औसत, या ढाल, या एक कस्टम फ़ंक्शन। अधिक ज़ूम आउट स्तरों के लिए, मैं पहले से ही एक क्लस्टरिंग / पिरामिड संरचना पर काम कर रहा हूं, ताकि मेरे पास औसत मूल्यों के साथ एक तालिका / संग्रह होगा ताकि कोई टाइल (क्वेरी)> 200,000 (या 50,000) स्थान आइटम न हो।
अज़वॉक

मुझे लगता है कि पूर्व-गणना समुच्चय की कुंजी है - आपकी अस्थायी गणना अभी भी बैच सकती है। इस तरह से ओएलएपी सिस्टम को तेजी से क्वेरी प्रदर्शन मिलता है और आपको संभवतः इस प्रकार का दृष्टिकोण अपनाने की आवश्यकता होगी। विशेष रूप से प्रासंगिक यदि आप डेटा के साथ रह सकते हैं जो आपके प्रश्नों के लिए एक दिन पुराना है।
ConcernedOfTunbridgeWells

यदि आप गणना किए गए औसत मूल्यों की क्वेरी कर रहे हैं, तो आप कितने असतत स्थानों पर नमूने ले रहे हैं - यानी ज़ूम के उच्चतम स्तर पर वास्तविक बिटमैप का क्या संकल्प है?
ConcernedOfTunbridgeWells

मैं मानता हूं कि पूर्व-गणना किए गए समुच्चय जाने की राह बहुत संभावनाशील है। उच्चतम ज़ूम पर परिकलित औसत एक क्षेत्र पर औसत नहीं है, यह 1 स्थान पर समय के साथ मूल्यों का औसत है। जैसा कि यह बताता है कि मेरे पास अलग-अलग टेबल / संग्रह होंगे जो यह सुनिश्चित करने के लिए औसत क्षेत्र होंगे कि कोई क्वेरी / टाइल इसमें बहुत सारे स्थान बिंदु नहीं है (अधिकतम 50,000-200,000)। किसी भी टाइल का अधिकतम रिज़ॉल्यूशन 256x256 पिक्सेल है।
आजोक

3

ऐसा लगता है कि क्वेरी के दो वर्ग हैं - एक यह समझने के लिए कि कौन से स्थान वर्तमान दृश्य विंडो के भीतर हैं और दूसरा उन बिंदुओं पर वांछित आंकड़े देने के लिए है। मेरा सुझाव प्रत्येक के लिए अलग, विशेष उपकरण का उपयोग करना है।

मैं मान रहा हूँ कि सभी माप 75Bn अंक के एक ही सेट से संबंधित हैं। एक बार स्थापित होने वाले ये लैट / लॉन्ग, इसलिए स्थैतिक हैं। उन्हें एक-बंद लागत पर समूहीकृत, एकत्रित और अनुक्रमित किया जा सकता है। इसलिए मैं क्षेत्र और ज़ूम स्तर के अनुसार पैठ बनाने का सुझाव दूंगा। प्रत्येक शार्द का आकार उस प्रदर्शन से संचालित होगा जो प्रत्येक जीआईएस उदाहरण से प्राप्त किया जा सकता है।

जीआईएस एक समय श्रृंखला डेटाबेस में पारित होने वाले अंकों का एक सेट लौटाएगा। यह मापा मान रखता है और समुच्चय करता है। KDB वह है जिससे मैं परिचित हूं। यह प्रतिभूति व्यापार को लक्षित करता है, जिसमें आपके परिदृश्य की तुलना में कम कुंजी लेकिन प्रति कुंजी अधिक डेटा बिंदु होंगे।

जीआईएस सर्वर से प्रमुख मूल्यों को समय-सीमा डीबी में स्थानांतरित करने की लागत होगी। मेरी परिकल्पना यह है कि इस लागत का भुगतान कार्य-विशिष्ट समय के DB में तेजी से प्रसंस्करण द्वारा किया जाएगा। सवाल के शब्दों से ऐसा लगता है कि एक भी उदाहरण सभी डेटा को धारण करने में सक्षम नहीं होगा, इसलिए कुछ क्रॉस-सर्वर ट्रैफ़िक अपरिहार्य लगता है। घटकों की सापेक्ष गति को देखते हुए ऐसा लगता है कि दूरस्थ सर्वर पर कीसेट भेजना संभव है, जिसके पास डेटा कैश है, स्थानीय डिस्क से डेटा पढ़ने से तेज होगा।

यदि बिंदु-खोज और मूल्य-गणना वाले भाग एक-दूसरे के लिए स्थानीय हो सकते हैं, तो निश्चित रूप से मुझे उम्मीद है कि प्रतिक्रिया तेज होगी। मेरी (सीमित) समझ यह है कि किसी निकटतम बिंदु पर एन निकटतम पड़ोसियों को खोजना एक गैर-तुच्छ कार्य है। यही कारण है कि मैंने इसे करने के लिए विशिष्ट सॉफ़्टवेयर का उपयोग करने का सुझाव दिया। अगर बिंदु-खोज को कम किया जा सकता है

where latitude between x1 and x2
and logitude between y1 and y2

तब उस हिस्से को मूल्य-भंडारण सॉफ्टवेयर द्वारा नियंत्रित किया जा सकता था और जीआईएस वास्तुकला से समाप्त हो गया था।

मैंने ऐसी व्यवस्था लागू नहीं की है। मैं वास्तव में यहां सिर्फ जोर से सोच रहा हूं। पेटाबाइट पैमाने पर कोई ऑफ-द-शेल्फ समाधान नहीं हैं। हालाँकि, कई उपग्रह डेटा प्रदाता हैं, इसलिए आपकी समस्या काफी विकट है। सौभाग्य।


सहमत, दो वर्ग हैं। 1) कई स्थानों से एकल मूल्यों की एक तस्वीर बनाते हैं, 2) एक स्थान पर सभी ऐतिहासिक मूल्यों को प्राप्त करते हैं। सभी माप समान स्थानों के अरबों से संबंधित हैं, केवल परिवर्तन प्रत्येक बिंदु पर ऐतिहासिक मूल्यों की संख्या होगी। क्षेत्र द्वारा साझा करना वह दृष्टिकोण है जिसे मैं लेने के लिए देख रहा हूं, आपके द्वारा बताए गए कारणों के लिए। मैं एक अलग समय श्रृंखला DB में लौटे मूल्यों को पारित करने पर विचार नहीं किया था। मैंने सोचा होगा कि जब तक मैं आपके प्रस्ताव को गलत नहीं मान लेता, तब तक एक समय श्रृंखला डेटाबेस में चयन और हस्तांतरण को एक व्यवहार्य विकल्प बनाने में बहुत समय लगेगा।
अज़वॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.