2012-05-21 17 views
15

यह सवाल पहले से ही अभी तक एडब्ल्यूएस मंचों पर पोस्ट किया गया है, लेकिन करने के लिए हास्यास्पद धीमी राईट रहता अनुत्तरित https://forums.aws.amazon.com/thread.jspa?threadID=94589अमेज़न DynamoDB (PHP एपीआई)

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

हालांकि, मेरी वर्तमान लेखन गति बहुत धीमी है (प्रति 100 लिखने में लगभग 8-9 सेकंड) जो प्रारंभिक अपलोड लगभग असंभव बनाता है (इसमें वर्तमान गति के साथ लगभग 3 महीने लगेंगे)।

मैं एडब्ल्यूएस मंचों एक जवाब की तलाश में पढ़ा है और पहले से ही निम्नलिखित बातें करने की कोशिश की:,

  1. मैं एकल "put_item" से बदल 25 मदों की बैच राईट (अनुशंसित अधिकतम बैच लिखने आकार) पर कॉल करता है और मेरी प्रत्येक वस्तु 1 केबी से छोटी है (जिसे भी अनुशंसित किया जाता है)। मेरे 25 आइटमों के लिए भी 1 केबी के तहत भी यह बहुत सामान्य है, लेकिन इसकी गारंटी नहीं है (और इससे कोई फर्क नहीं पड़ता क्योंकि मुझे लगता है कि डायनेमोडीबी के लिए केवल एक आइटम आकार महत्वपूर्ण है)।

  2. मैं हाल ही में पेश किए गए ईयू क्षेत्र (मैं ब्रिटेन में हूं) का उपयोग set_region ('dynamodb.eu-west-1.amazonaws.com') पर कॉल करके सीधे अपने प्रवेश बिंदु को निर्दिष्ट करता हूं क्योंकि स्पष्ट रूप से कोई अन्य तरीका नहीं है PHP एपीआई में ऐसा करने के लिए। एडब्ल्यूएस कंसोल से पता चलता है कि एक उचित क्षेत्र में तालिका, जो काम करता है।

  3. मैंने अक्षम_एसएसएल() (100 प्रति रिकॉर्ड 1 सेकंड प्राप्त करने) को कॉल करके SSL अक्षम कर दिया है।

फिर भी, 100 आइटमों का परीक्षण सेट (25 आइटमों के लिए 4 बैच लिखने के कॉल) इंडेक्स में 8 सेकंड से कम नहीं लेते हैं। प्रत्येक बैच लिखने के अनुरोध में लगभग 2 सेकंड लगते हैं, इसलिए यह पहला नहीं है जैसे तत्काल है और परिणामस्वरूप अनुरोध धीमे होते हैं।

मेरी तालिका प्रावधान थ्रूपुट 100 लिखने और 100 पढ़ने वाली इकाइयां हैं जो अब तक पर्याप्त होनी चाहिए (उच्च सीमाओं के साथ-साथ मामले में, कोई प्रभाव नहीं)।

मुझे यह भी पता है कि अनुरोध क्रमिकरण पर कुछ खर्च हैं, इसलिए शायद मैं अपने अनुरोधों को "जमा" करने के लिए कतार का उपयोग कर सकता हूं, लेकिन क्या यह वाकई बैच_writes के लिए बहुत मायने रखता है? और मुझे नहीं लगता कि यह समस्या है क्योंकि यहां तक ​​कि एक भी अनुरोध बहुत लंबा लगता है।

मैंने पाया कि कुछ लोग अनुरोधों को गति देने के लिए एपीआई में कर्ल हेडर ("अपेक्षा:" विशेष रूप से) को संशोधित करते हैं, लेकिन मुझे नहीं लगता कि यह एक उचित तरीका है, और एपीआई को तब से अपडेट किया गया है सलाह पोस्ट की गई थी।

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

मैं अब अटक गया हूं - क्या मैं कुछ और कोशिश कर सकता हूं? अगर मैंने पर्याप्त प्रदान नहीं किया है तो कृपया अधिक जानकारी मांगने के लिए स्वतंत्र महसूस करें।

अन्य हालिया धागे, जाहिर है, एक ही समस्या पर, here (हालांकि अब तक कोई जवाब नहीं है)।

यह सेवा अल्ट्रा-फास्ट होने वाली है, इसलिए मैं वास्तव में बहुत ही शुरुआत में उस समस्या से परेशान हूं।

+0

लगता है जैसे आपको SQL सर्वर जैसे संबंधपरक डेटाबेस की आवश्यकता है। बस 'SqlBulkCopy' डेटा में। SQL सर्वर वेब स्केल है, अगर आप पूछ रहे हैं। –

+0

मुझे यहां डीबी रिलेशनल की आवश्यकता नहीं है (यह कोई वास्तविक सूचकांक वाला वास्तविक सूचकांक नहीं है) लेकिन हाँ, अगर मेरे पास कोई अन्य विकल्प नहीं है तो मैं अपने एसक्यूएल या सोलर को पीछे हटने की सोच रहा हूं। फिर भी अभी भी मैं समझने के लिए उत्सुक हूं कि उस दृष्टिकोण के साथ क्या गलत है। – Yuriy

+0

आपकी फ़ोरम पोस्ट को उत्तर दिया गया है: https://forums.aws.amazon.com/thread.jspa?messageID=365597#365597 –

उत्तर

10

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

मेरा सुझाव है कि आप PHP के साथ एक ईसी 2 इंस्टेंस (सर्वर) बनाएं, स्क्रिप्ट और ईसी 2 सर्वर पर सभी फाइलें ब्लॉक के रूप में अपलोड करें और फिर वहां से डंप करें। ईसी 2 सर्वर शूल्ड में डायनेमोडीबी सर्वर पर ब्लिस्टरिंग गति है।

यदि आप स्वयं को एलएएमपी के साथ ईसी 2 स्थापित करने के बारे में आश्वस्त नहीं हैं, तो उनके पास एक नई सेवा "लोचदार बीनस्टॉक" है जो यह सब आपके लिए कर सकती है। जब आप अपलोड पूरा कर लेते हैं, तो बस सर्वर को जलाएं - और उम्मीद है कि आप अपने "फ्री टियर" मूल्य निर्धारण संरचना के भीतर ऐसा कर सकते हैं :)

कनेक्टिविटी के दीर्घकालिक मुद्दों को हल नहीं करता है, लेकिन तीन महीने को कम करेगा अपलोड!

+0

आपके उत्तर के लिए धन्यवाद। मैंने बीनस्टॉक को आजमाया नहीं था, लेकिन इसके बजाय लोचदार MapReduce का उपयोग करने की कोशिश कर रहा था - अभी भी एक समस्या है जिसके लिए मैंने एक और सवाल बनाया है: http://stackoverflow.com/questions/10683136/amazon-elastic-mapreduce-mass-insert- से -3-टू-डाइनेमोडब-अविश्वसनीय रूप से धीमा – Yuriy

+0

जैसा कि आपने ऑस्ट्रेलिया से भी उल्लेख किया है, यह अभी भी आपके लिए 0.5 सेकंड से कम है, इसलिए लंदन से आयरलैंड तक मेरे लिए 2 सेकंड नहीं हो सकते हैं। हमारा कनेक्शन बहुत अच्छा है, अब तक मैं इसे बाहर कर देता हूं। – Yuriy

+0

2 सेकंड बेहद धीमी है, लेकिन सर्वर पर फ़ायरवॉल के रूप में यह कुछ आसान हो सकता है कि कुछ "चेक" या राउटर पर फ़ायरवॉल अन्य "चेक" कर रहा हो। (या, सनकी होने के नाते, अमेज़न के लिए संभवतः ईसी 2 पर आपको धक्का देने का एक तरीका है ?!) जैसा कि मैंने कहा - यह एक लंबी अवधि का समाधान नहीं है, अपलोड करने के लिए कुछ ही है। यदि आप इसे स्थानीय रूप से रखना चाहते हैं, तो कैसंद्रा या मोंगो को क्यों न देखें? लेकिन अगर आप अमेज़ॅन का उपयोग कर रहे हैं और भुगतान कर रहे हैं, तो बस सर्वर को स्थानांतरित करें - यह उन्हें खुश रखेगा :) – Robbie

1

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

0

मुझे AmazonDynamoDB क्लास पर बैच विधि का उपयोग करके php sdk का उपयोग करके अच्छी सफलता मिली। मैं एक ईसी 2 उदाहरण से प्रति सेकंड लगभग 50 आइटम चलाने में सक्षम था। जब तक आप प्रेषण विधि को कॉल नहीं करते हैं, तब तक विधि अनुरोधों को क्यूइंग करके काम करता है, जिस बिंदु पर यह कर्ल का उपयोग करके एकाधिक एक साथ अनुरोध निष्पादित करता है। यहाँ कुछ अच्छा संदर्भ हैं:

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LoadData_PHP.html

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LowLevelPHPItemOperationsExample.html

मुझे लगता है कि आप भी लचीला मानचित्र CSV फ़ाइल से थोक डेटा लोड करने के लिए कम का उपयोग कर छत्ता एसक्यूएल उपयोग कर सकते हैं। ईएमआर काम लोड को फैलाने और उच्च समेकन प्राप्त करने के लिए कई मशीनों का उपयोग कर सकता है।

+1

धन्यवाद, जोनाथन, लेकिन मैंने कार्यक्षमता को फिर से लिखा है एक स्थानीय इंडेक्स का उपयोग करें। HIVE के बारे में, इसमें डायनेमोडबी की बात आती है जब अमेज़ॅन द्वारा पुष्टि की गई है (मेरा दूसरा प्रश्न और मेरा स्वयं-पोस्ट उत्तर देखें): http://stackoverflow.com/questions/10683136/अमेज़न लोचदार-mapreduce-बड़े पैमाने पर डालने-से-S3-टू-dynamodb-है-अविश्वसनीय रूप से धीमी गति से – Yuriy

संबंधित मुद्दे