Не удается записать все данные в таблицу DynamodB? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь вставить данные файла CSV в DynamodB, но я могу записать только 1537 записей в мою таблицу DynamodB.

Кодирование

 try {

        S3EventNotificationRecord record = s3event.getRecords().get(0);
        String srcBucket = record.getS3().getBucket().getName();
        String srcKey = record.getS3().getObject().getKey().replace('+', ' ');  
        srcKey = URLDecoder.decode(srcKey, "UTF-8");
        AmazonS3 s3Client = new AmazonS3Client();
        S3Object s3Object = s3Client.getObject(new GetObjectRequest(srcBucket, srcKey));
        statusReport.setFileSize(s3Object.getObjectMetadata().getContentLength());


        BufferedReader br = new BufferedReader(new InputStreamReader(s3Object.getObjectContent())); 
        CSVReader reader = new CSVReader(br);

        AmazonDynamoDB dynamoDBClient = new AmazonDynamoDBClient();

        dynamoDBClient.setRegion(AWS_REGION);
        DynamoDB dynamoDB = new DynamoDB(dynamoDBClient);
        TableWriteItems energyDataTableWriteItems = new TableWriteItems(DYNAMO_TABLE_NAME);
        List<Item> itemList = new ArrayList<Item>();
        String[] nextLine;


        while ((nextLine = reader.readNext()) != null) {
            Item newItem = helper.parseIt(nextLine);
            itemList.add(newItem);
        }
for (List<Item> partition : Lists.partition(itemList, 25)) {
            energyDataTableWriteItems.withItemsToPut(partition);
            BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem(energyDataTableWriteItems);

 do {
        Map<String, List<WriteRequest>> unprocessedItems = outcome.getUnprocessedItems();

        if (outcome.getUnprocessedItems().size() > 0) {
                    logger.log("Retrieving the unprocessed " + String.valueOf(outcome.getUnprocessedItems().size())
                            + " items.");
                    outcome = dynamoDB.batchWriteItemUnprocessed(unprocessedItems);
                }

        } while (outcome.getUnprocessedItems().size() > 0);*/
}
 logger.log("Load finish in " + String.valueOf(System.currentTimeMillis() - startTime) + "ms");

        reader.close();
        br.close();
        s3Object.close();

        statusReport.setStatus(true);
    } catch (Exception ex) {
        logger.log(ex.getMessage());
    }

    statusReport.setExecutiongTime(System.currentTimeMillis() - startTime);
    return statusReport;
}

Могу я узнать причину, по которой он так себя ведет. Я пробовал использовать более 5 таблиц, но получаю тот же результат.

1 Ответ

0 голосов
/ 04 мая 2018

Возможно, вы столкнулись с ограничением пропускной способности:

Из документов :

Операция BatchWriteItem помещает или удаляет несколько элементов в одной или нескольких таблицах. Один вызов BatchWriteItem может записать до 16 МБ данных, которые могут содержать до 25 запросов на установку или удаление. Размер отдельных записываемых элементов может достигать 400 КБ.

Также:

Если DynamoDB возвращает какие-либо необработанные элементы, вам следует повторить пакетную операцию с этими элементами.

Пока вы разбиваете свои записи на порции по 25 элементов, это не единственное ограничение. Если вы посмотрите на JavaDoc для BatchWriteItemOutcome, вы увидите функцию getUnprocessedItems().

Наконец, вы не показываете свой блок catch, но можем ли мы предположить, что он действительно что-то делает?

...