2017-09-28 30 views
5

मेरे पास एक जावा एप्लिकेशन है जिसे मोंगोडीबी 3.2 से बड़ी मात्रा में डेटा पढ़ने और इसे हडोप में स्थानांतरित करने की आवश्यकता है।बड़े mongodb डेटा पढ़ें

यह बैच एप्लिकेशन दिन में हर 4 घंटे 6 बार चलाया जाता है।

डाटा विनिर्देश:

  • दस्तावेज: 80000 एक समय में (हर 4 घंटे)
  • आकार: 3gb

वर्तमान में मैं MongoTemplate और उपयोग कर रहा हूँ अफ़ीम का सत्त्व में MongoDB तक पहुंचने के लिए आदेश। का उपयोग करते समय इस डेटा का संसाधन हालांकि मैं एक OOM अपवाद निम्नलिखित:

List<MYClass> datalist = datasource.getCollection("mycollection").find().asList(); 

इस डेटा को पढ़ने और Hadoop को पॉप्युलेट करने के लिए सबसे अच्छा तरीका क्या है?

  • MongoTemplate::Stream() और हडोप को एक-एक करके लिखें?
  • batchSize(someLimit) और पूरे बैच को हडोप में लिखें?
  • Cursor.batch() और एचडीएफएस को एक-एक करके लिखें?

उत्तर

1

आपकी समस्या, asList() कॉल

यह (80,000 डॉक्स कुछ gigs) पूरे कर्सर के माध्यम से पुनरावृति करने के लिए ड्राइवर बलों पर स्थित है स्मृति में सभी रखते हुए।

batchSize(someLimit) और Cursor.batch() यहां सहायता चाहिए क्योंकि आप पूरे कर्सर को पार करते हैं, इससे कोई फर्क नहीं पड़ता कि बैच आकार क्या है।

इसके बजाय आप कर सकते हैं:

1) कर्सर दोहराएं: List<MYClass> datalist = datasource.getCollection("mycollection").find()

2) दस्तावेजों एक समय में एक पढ़ें और एक बफर में दस्तावेजों फ़ीड (के एक सूची कहते हैं) जाने

3) हर 1000 दस्तावेज़ों के लिए (कहें) हैडोप एपीआई कॉल करें, बफर साफ़ करें, फिर फिर से शुरू करें।

0

asList() कॉल पूरे मोंगोब संग्रह को स्मृति में लोड करने का प्रयास करेगा। 3 जीबी आकार से बड़ा मेमोरी सूची ऑब्जेक्ट बनाने की कोशिश कर रहा है।

कर्सर के साथ संग्रह को इटरेट करना इस समस्या को ठीक करेगा। आप इसे डेटासॉर क्लास के साथ कर सकते हैं, लेकिन मैं टाइप सुरक्षित सुरक्षितता पसंद करता हूं जो मॉर्फिया DAO कक्षाओं के साथ प्रदान करता है:

class Dao extends BasicDAO<Order, String> { 
    Dao(Datastore ds) { 
     super(Order.class, ds); 
    } 
    } 

    Datastore ds = morphia.createDatastore(mongoClient, DB_NAME); 
    Dao dao = new Dao(ds); 

    Iterator<> iterator = dao.find().fetch(); 
    while (iterator.hasNext()) { 
     Order order = iterator.next; 
     hadoopStrategy.add(order); 
    } 
संबंधित मुद्दे