2016-06-18 3 views
1

У меня есть каталог из примерно 45 000 файлов json. В настоящее время общий размер составляет около 12,8 ГБ. Это данные веб-сайта от kissmetrics, а его структура - detailed here.Обработка ошибок на mongoimport

Данные: Каждый файл несколько документов JSON, разделенных символом новой строки Он будет обновляться каждые 12 часов с новыми дополнительными файлами

Я хочу, чтобы импортировать эти данные в MongoDB используя mongoimport. Я попробовал этот скрипт, чтобы сделать процесс проще:

for filename in revisions/*; 

do 

echo $filename 
mongoimport --host <HOSTNAME>:<PORT> --db <DBNAME> --collection <COLLECTIONNAME> \ 
    --ssl --sslCAFile ~/mongodb.pem --username <USERNAME> --password <PASSWORD> \ 
    --authenticationDatabase admin $filename 

done 

Это будет иметь ошибки

2016-06-18T00:31:10.781+0000 using 1 decoding workers 
2016-06-18T00:31:10.781+0000 using 1 insert workers 
2016-06-18T00:31:10.781+0000 filesize: 113 bytes 
2016-06-18T00:31:10.781+0000 using fields: 
2016-06-18T00:31:10.822+0000 connected to: <HOSTNAME>:<PORT> 
2016-06-18T00:31:10.822+0000 ns: <DBNAME>.<COLLECTION> 
2016-06-18T00:31:10.822+0000 connected to node type: standalone 
2016-06-18T00:31:10.822+0000 standalone server: setting write concern w to 1 
2016-06-18T00:31:10.822+0000 using write concern: w='1', j=false, fsync=false, wtimeout=0 
2016-06-18T00:31:10.822+0000 standalone server: setting write concern w to 1 
2016-06-18T00:31:10.822+0000 using write concern: w='1', j=false, fsync=false, wtimeout=0 
2016-06-18T00:31:10.824+0000 Failed: error processing document #1: invalid character 'l' looking for beginning of value 
2016-06-18T00:31:10.824+0000 imported 0 documents 

я потенциально буду работать в эту ошибку, и из моей инспекции не из-за некорректные данные.

Ошибка может произойти в течение часа.

Могу ли я разобрать ошибку в mongoimport, чтобы повторить один и тот же документ? Я не знаю, будет ли ошибка иметь эту же форму, поэтому я не уверен, могу ли я попытаться обработать ее в bash. Могу ли я отслеживать прогресс в bash и перезапускать, если он завершен раньше? Любые предложения по импорту больших данных этого размера или обработке ошибки в оболочке?

ответ

0

Обычно заданная команда возвращает коды ошибок, когда она терпит неудачу (и, мы надеемся, задокументированы на странице man для команды).

Так что, если вы хотите сделать что-то Hacky и просто повторить один раз,

cmd="mongoimport --foo --bar..." 
$cmd 
ret=$? 
if [ $ret -ne 0 ]; then 
    echo "retrying..." 
    $cmd 
    if [ $? -ne 0 ]; then 
    "failed again. Sadness." 
    exit 
    fi 
fi 

Или, если вам действительно нужно то, что mongoimport выходы, захватить его, как этот

results=`mongoimport --foo --bar...` 

Теперь переменная $results будет содержать что было возвращено на stdout. Возможно, придется перенаправить stderr.