2017-02-10 13 views
6

मल्टीब में होस्ट किए गए मोंगो डीबी से डेटा निर्यात करने का सबसे अच्छा तरीका क्या है Google bigquery?मोंगो डीबी से बिगक्चर

प्रारंभ में, मैं मोंगो डीबी से बिगक्वायर में एक बार लोड करने की कोशिश कर रहा हूं और बाद में मैं बड़ी समय के लिए वास्तविक समय डेटा प्रवाह के लिए पब/सब का उपयोग करने की सोच रहा हूं।

मुझे पहले एक बार लोड करने के लिए मोंगोड से बड़ी मात्रा में मदद की ज़रूरत है।

उत्तर

2

मोंगोडीबी के दस्तावेज के मूल पढ़ने से, ऐसा लगता है कि आप अपने डेटाबेस को JSON के रूप में डंप करने के लिए mongoexport का उपयोग कर सकते हैं। एक बार ऐसा करने के बाद, उन्हें BigQuery loading data विषय का संदर्भ लें ताकि जेएससी फाइलों से उन्हें जीसीएस फाइलों में कॉपी करने के बाद तालिका कैसे बनाई जा सके।

+0

दिनांक फ़ील्ड के बारे में कैसे? जब मैं दिनांक/समय फ़ील्ड पर डेटा निर्यात करता हूं तो "$ date" जैसा दिखता है जो BigQuery फ़ील्ड नामों के लिए स्वीकार्य नहीं है। क्या इसके समाधान की कोई युक्ति है? – Qorbani

+0

मुझे लगता है कि दुर्भाग्यवश, आपको किसी भी तरह उनका नाम बदलने की आवश्यकता होगी। –

+0

धन्यवाद इलियट, मुझे इसे ठीक करने का एक तरीका मिल गया है और इसे इस प्रश्न का एक और जवाब भी सबमिट करें जो भविष्य में मेरे जैसे किसी की मदद कर सकता है :-) – Qorbani

7

मेरी राय में, सबसे अच्छा अभ्यास अपने स्वयं के निकालने का निर्माण कर रहा है। यह आपकी पसंद की भाषा के साथ किया जा सकता है और आप सीएसवी या जेएसओएन को निकाल सकते हैं।

लेकिन यदि आप तेजी से दिख रहे हैं और यदि आपका डेटा बड़ा नहीं है और एक सर्वर के भीतर फिट हो सकता है, तो मैं mongoexport का उपयोग करने की सलाह देता हूं।

{ 
    "_id" : "tdfMXH0En5of2rZXSQ2wpzVhZ", 
    "statuses" : [ 
     { 
      "status" : "dc9e5511-466c-4146-888a-574918cc2534", 
      "score" : 53.24388894 
     } 
    ], 
    "stored_at" : ISODate("2017-04-12T07:04:23.545Z") 
} 

तो फिर तुम जैसे अपना BigQuery स्कीमा (mongodb_schema.json) परिभाषित करने की जरूरत: मान लेते हैं आप इस तरह के नीचे के रूप में एक सरल दस्तावेज़ संरचना करते हैं

$ cat > mongodb_schema.json <<EOF 
[ 
    { "name":"_id", "type": "STRING" }, 
    { "name":"stored_at", "type": "record", "fields": [ 
     { "name":"date", "type": "STRING" } 
    ]}, 
    { "name":"statuses", "type": "record", "mode": "repeated", "fields": [ 
     { "name":"status", "type": "STRING" }, 
     { "name":"score", "type": "FLOAT" } 
    ]} 
] 
EOF 

अब, मज़ा हिस्सा :-) निकाला जा रहा शुरू होता है आपके मोंगोडीबी से जेएसओएन के रूप में डेटा। आइए मान लें कि आपके पास प्रतिकृति सेट नाम statuses के साथ क्लस्टर है, आपका डीबी sample है, और आपका संग्रह status है।

mongoexport \ 
    --host statuses/db-01:27017,db-02:27017,db-03:27017 \ 
    -vv \ 
    --db "sample" \ 
    --collection "status" \ 
    --type "json" \ 
    --limit 100000 \ 
    --out ~/sample.json 

आप ऊपर देख सकते हैं, मैं उत्पादन 100k रिकॉर्ड क्योंकि मैं सुझाव है कि आप अपने सभी डेटा के लिए यह करने से पहले BigQuery में नमूना और लोड चलाने की सीमा। उपरोक्त आदेश चलाने के बाद आपके पास sample.json में अपना नमूना डेटा होना चाहिए लेकिन एक क्षेत्र $date है जो आपको BigQuery पर लोड करने में त्रुटि उत्पन्न करेगा। ठीक करने के लिए है कि हम sed का उपयोग उन्हें सरल फ़ील्ड नाम को बदलने के लिए कर सकते हैं: का उपयोग कर निम्न कमांड

# Fix Date field to make it compatible with BQ 
sed -i 's/"\$date"/"date"/g' sample.json 

अब आप सेक कर सकते हैं Google क्लाउड संग्रहण (GCS) पर अपलोड करें और फिर BigQuery में लोड:

# Compress for faster load 
gzip sample.json 

# Move to GCloud 
gsutil mv ./sample.json.gz gs://your-bucket/sample/sample.json.gz 

# Load to BQ 
bq load \ 
    --source_format=NEWLINE_DELIMITED_JSON \ 
    --max_bad_records=999999 \ 
    --ignore_unknown_values=true \ 
    --encoding=UTF-8 \ 
    --replace \ 
    "YOUR_DATASET.mongodb_sample" \ 
    "gs://your-bucket/sample/*.json.gz" \ 
    "mongodb_schema.json" 

यदि सब कुछ ठीक था, फिर वापस जाने के लिए और mongoexport आदेश से --limit 100000 को हटा दें और फिर से चलाने के ऊपर फिर से आदेश 100k नमूना के बजाय सब कुछ लोड करने के लिए।

वैकल्पिक समाधान:

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

# Export Logic in JavaScript 
cat > export-csv.js <<EOF 
var size = 100000; 
var maxCount = 1; 
for (x = 0; x < maxCount; x = x + 1) { 
    var recToSkip = x * size; 
    db.entities.find().skip(recToSkip).limit(size).forEach(function(record) { 
     var row = record._id + "," + record.stored_at.toISOString();; 
     record.statuses.forEach(function (l) { 
      print(row + "," + l.status + "," + l.score) 
     }); 
    }); 
} 
EOF 

# Execute on Mongo CLI 
_MONGO_HOSTS="db-01:27017,db-02:27017,db-03:27017/sample?replicaSet=statuses" 
mongo --quiet \ 
    "${_MONGO_HOSTS}" \ 
    export-csv.js \ 
    | split -l 500000 --filter='gzip > $FILE.csv.gz' - sample_ 

# Load all Splitted Files to Google Cloud Storage 
gsutil -m mv ./sample_* gs://your-bucket/sample/ 

# Load files to BigQuery 
bq load \ 
    --source_format=CSV \ 
    --max_bad_records=999999 \ 
    --ignore_unknown_values=true \ 
    --encoding=UTF-8 \ 
    --replace \ 
    "YOUR_DATASET.mongodb_sample" \ 
    "gs://your-bucket/sample/sample_*.csv.gz" \ 
    "ID,StoredDate:DATETIME,Status,Score:FLOAT" 

सुझाव:: यहाँ है कि मैं क्या एक ही प्रक्रिया के लिए किया था, लेकिन सीएसवी में उत्पादन करने के लिए जावास्क्रिप्ट का इस्तेमाल किया तो मैं यह BigQuery में बहुत आसान लोड कर सकते हैं है ऊपर स्क्रिप्ट में मैंने किया था करने में सक्षम करने के लिए उत्पादन पाइप द्वारा छोटे चाल sample_ उपसर्ग के साथ कई फ़ाइलों में आउटपुट विभाजित करें। इसके अलावा विभाजन के दौरान यह आउटपुट जीज़िप करेगा ताकि आप जीसीएस को आसान बना सकें।

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