Не удается обновить MySQL с помощью Hadoop, только вставить

#mysql #hadoop

#mysql #hadoop

Вопрос:

Я пытаюсь использовать Hadoop для чтения данных, обработки и последующей записи обратно в MySQL. Однако кажется, что я могу выполнять только вставку. Если я попытаюсь выполнить обратную запись с тем же первичным ключом (это означает обновление), появится ошибка типа «Дублировать XXX для первичного ключа». Кто-нибудь решил эту проблему? И возможно ли обновить? Большое спасибо!!!

Ответ №1:

Используете ли вы Sqoop или используете инструкции SQL в задачах Map / Reduce? Похоже, что несколько редукторов или один редуктор снова и снова записывают данные с одним и тем же первичным ключом. Вам нужно перепроектировать карту / сократить задачи или схему базы данных, чтобы избавиться от ошибок.

Как это известно в редукторе, если необходимо выполнить обновление или вставку? Проверяется ли строка с тем же первичным ключом в базе данных, а затем выполняется вставка или обновление?

Дизайн приложения должен быть известен в деталях, чтобы решить проблему.

Комментарии:

1. при вставке в базу данных из M / R задания всегда полезно установить reduce task равным 1, если ключ является первичным ключом в таблице для вставки. Если вам все равно, выполните «обновление дубликата ключа / игнорирование»

2. @Thomas — Как это помогает иметь один Редуктор , когда Reducer Key = Primary Key of Table ? Я думаю, это не должно иметь значения.

3. Потому что Hadoop заботится о том, чтобы ключ был отличным / уникальным на этапе сокращения, предотвращая коллизии в базе данных.

4. Спасибо, Правин и Томас. Я использую DBOutputFormat. Проблема, как и сказал Томас, в том, что в базе данных действительно есть дубликаты ключей. Но я не знаю, как установить «при обновлении / игнорировании дубликата ключа», потому что запрос на вставку генерируется DBOutputFormat. Я стараюсь, спасибо!

5. @Thomas — Я не понимаю — пожалуйста, объясните подробно на примере — тем не менее, я думаю, что 1 или N редукторов не имеют значения. R1 получит K1, K2 и R2 получат K3 и K4, иначе R1 получит K1, K2, K3 и K4. Какое это имеет значение?