ключ слияния sqoop, создающий несколько файлов деталей вместо одного, который не предназначен для использования ключа слияния - PullRequest
0 голосов
/ 04 октября 2018

В идеале, когда мы запускаем инкрементное без merge-key, это создаст новый файл с добавленным набором данных, но если мы используем merge-key, то он создаст новый весь набор данных, включая предыдущий набор данных, только в одном файле.Но я не получаю один файл детали, когда использую incremental append в моей работе sqoop.Ниже приведены мои шаги:

1) Исходные данные:

mysql> select * from departments_per;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
|             2 | Fitness         |
|             3 | Footwear        |
|             4 | Apparel         |
|             5 | Golf            |
|             6 | Outdoors        |
|             7 | Fan Shop        |
+---------------+-----------------+  

2) Команда sqoop для первоначального импорта данных в hdf:

sqoop import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_per \
--target-dir /departments \
-m 1

Теперь, когда я вижуотделы каталогов под hdfs Я вижу один файл части, который в порядке.

3) Теперь я обновляю свои исходные данные в mysql:

mysql> select * from departments_demo;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
|             2 | Fitness         |
|             3 | Footwear        |
|             4 | Apparel         |
|             5 | Golf            |
|             6 | Outdoors        |
|             7 | Fan             |
|             8 | Tushar MC       |
+---------------+-----------------+

4) Теперь я создаю добавочное задание и выполняю его:

sqoop job --create appendJobs12 \
-- import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_demo \
-m 1 \
--target-dir /departments \
--incremental append \
--merge-key department_id \
--check-column department_id \
--last-value 0 

sqoop job --exec appendJobs12   

5) Iможно увидеть два файла детали в каталоге hdfs, хотя я использовал концепцию merge-key.

[cloudera@quickstart ~]$ hadoop fs -ls /departments
Found 3 items
-rw-r--r--   1 cloudera supergroup          0 2018-10-04 00:31 /departments/_SUCCESS
-rw-r--r--   1 cloudera supergroup         60 2018-10-04 00:31 /departments/part-m-00000
-rw-r--r--   1 cloudera cloudera           67 2018-10-04 00:37 /departments/part-m-00001  

Когда я отображаю данные, они выглядят так:

[cloudera@quickstart ~]$ hadoop fs -cat /departments/part-m-00000
2,Fitness
3,Footwear
4,Apparel
5,Golf
6,Outdoors
7,Fan Shop 
[cloudera@quickstart ~]$ hadoop fs -cat /departments/part-m-00001
    2,Fitness
    3,Footwear
    4,Apparel
    5,Golf
    6,Outdoors
    7,Fan
    8, Tushar MC

, где один файл детали содержит исходные данные, а второй - обновленные данные.Может кто-нибудь сказать мне, где я иду не так, из-за которого я не могу получить один файл детали с обновленным набором данных.Заранее спасибо

1 Ответ

0 голосов
/ 06 октября 2018

Я исследовал это и получил ту же ошибку с вашим подходом.Так что это не правильно - читая разные вещи, которые я должен сказать, я думаю, что это не так ясно.В любом случае.

Создается впечатление, что для промежуточных целевых каталогов требуются внешние таблицы и некоторые сценарии LINUX.

Итак, 1) я добавил данные в mysql и 2) выполнил импорт sqoop3) обновление в mysql, за которым следует 4) другой инкрементальный импорт, как вы сделали, что, на мой взгляд, не совсем корректно, но вы хотите, чтобы обновления были в порядке, затем 5) codegen и, наконец, 6) sqoop MERGE.

Вот основные шаги:

Начальный импорт

sqoop import -m 1 --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged  --warehouse-dir=/user/hive/warehouse --create-hive-table --hive-import --fields-terminated-by ',' --hive-drop-import-delims

Инкрементная загрузка, как вы сделали

sqoop import -m 1 --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged  --warehouse-dir=/user/hive/warehouse --fields-terminated-by ',' --hive-drop-import-delims --last-value 0 --merge-key id --incremental append --check-column id

Codegen

 sqoop codegen --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged

Слияние

 sqoop merge --new-data /user/hive/warehouse/ged --onto /user/hive/warehouse/new_ged --merge-key id --target-dir /user/hive/merged/ged2 --jar-file /tmp/sqoop-cloudera/compile/c8d374075351d228c50d89354959762e/ged.jar -class-name ged

Результаты: [cloudera @ quickstart ~] $ hadoop fs -cat / user / hive / merged / ged2 / * 1, YYY 2, Питер 3, Бобби 4, Мария 5, Шутка 6, Джокер

, в результате чего у меня изначально было 1, XXX, но не 6, Джокер

Это несколько другое, поэтому я не уверен, что сказать.В любом случае файл 1 не является допустимым предположением с большим количеством данных.Ваше утверждение может работать с дополнительными параметрами, но это также работает.

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

...