ОШИБКА org.apache.sqoop.tool.ExportTool — ошибка во время экспорта: задание экспорта не удалось

мы пытаемся экспортировать данные из HDFS в mysql с помощью sqoop и сталкиваемся со следующей проблемой.

Образец данных:

4564,38,153,2013-05-30 10:40:42.767,false,No credentials attempted,,,00 00 00 00 01 64 e6 a6

4565,38,160,2013-05-30 10:40:42.767,false,No credentials attempted,,,00 00 00 00 01 64 e6 a7

4566,38,80,2013-03-07 12:16:26.03,false,No SSH or Telnet credentials available. If an HTTP(S) exists for this asset, it was not able to authenticate.,,,00 00 00 00 01 0f c7 e6

Следуя программе Sqoop, мы использовали для экспорта данных из HDFS в MYSQL и указали схему в таблице:

public static void main(String[] args) {

        String[] str = { "export", "--connect", "jdbc:mysql://-------/test", 
            "--table", "status", "--username", "root", "--password", "******", 
            "--export-dir", "hdfs://-----/user/hdfs/InventoryCategoryStatus/", 
            "--input-fields-terminated-by", ",", "--input-lines-terminated-by", "\n"
            };

        Sqoop.runTool(str);
    }

Ошибка после выполнения программы:

[exec:exec]
0    [main] WARN  org.apache.sqoop.tool.SqoopTool  - $SQOOP_CONF_DIR has not been set in the environment. Cannot check for additional configuration.
123  [main] WARN  org.apache.sqoop.tool.BaseSqoopTool  - Setting your password on the command-line is insecure. Consider using -P instead.
130  [main] WARN  org.apache.sqoop.ConnFactory  - $SQOOP_CONF_DIR has not been set in the environment. Cannot check for additional configuration.
Note: /tmp/sqoop-manish/compile/fd0060344195ec9b06030b84cdf6e243/status.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
9516 [main] WARN  org.apache.hadoop.util.NativeCodeLoader  - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
11166 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.jar is deprecated. Instead, use mapreduce.job.jar
16598 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.reduce.tasks.speculative.execution is deprecated. Instead, use mapreduce.reduce.speculative
16612 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.map.tasks.speculative.execution is deprecated. Instead, use mapreduce.map.speculative
16614 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps
16618 [main] WARN  org.apache.sqoop.mapreduce.JobBase  - SQOOP_HOME is unset. May not be able to find all job dependencies.
17074 [main] WARN  org.apache.hadoop.conf.Configuration  - session.id is deprecated. Instead, use dfs.metrics.session-id
17953 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.job.classpath.files is deprecated. Instead, use mapreduce.job.classpath.files
17956 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.cache.files is deprecated. Instead, use mapreduce.job.cache.files
17957 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.reduce.tasks is deprecated. Instead, use mapreduce.job.reduces
17958 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.mapoutput.value.class is deprecated. Instead, use mapreduce.map.output.value.class
17959 [main] WARN  org.apache.hadoop.conf.Configuration  - mapreduce.map.class is deprecated. Instead, use mapreduce.job.map.class
17959 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.job.name is deprecated. Instead, use mapreduce.job.name
17959 [main] WARN  org.apache.hadoop.conf.Configuration  - mapreduce.inputformat.class is deprecated. Instead, use mapreduce.job.inputformat.class
17960 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.input.dir is deprecated. Instead, use mapreduce.input.fileinputformat.inputdir
17960 [main] WARN  org.apache.hadoop.conf.Configuration  - mapreduce.outputformat.class is deprecated. Instead, use mapreduce.job.outputformat.class
17960 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.cache.files.timestamps is deprecated. Instead, use mapreduce.job.cache.files.timestamps
17961 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.mapoutput.key.class is deprecated. Instead, use mapreduce.map.output.key.class
17961 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.working.dir is deprecated. Instead, use mapreduce.job.working.dir
19283 [main] WARN  org.apache.hadoop.mapred.LocalDistributedCacheManager  - LocalJobRunner does not support symlinking into current working dir.
19312 [main] WARN  org.apache.hadoop.conf.Configuration  - mapred.cache.localFiles is deprecated. Instead, use mapreduce.job.cache.local.files
20963 [Thread-29] WARN  org.apache.hadoop.mapred.LocalJobRunner  - job_local_0001
java.lang.Exception: java.lang.NumberFormatException: For input string: " it was not able to authenticate."
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:400)
Caused by: java.lang.NumberFormatException: For input string: " it was not able to authenticate."
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:481)
    at java.lang.Integer.valueOf(Integer.java:582)
    at status.__loadFromFields(status.java:412)
    at status.parse(status.java:334)
    at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:77)
    at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:36)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
    at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:183)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:338)
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:232)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
21692 [main] WARN  mapreduce.Counters  - Group FileSystemCounters is deprecated. Use org.apache.hadoop.mapreduce.FileSystemCounter instead
21698 [main] WARN  mapreduce.Counters  - Group org.apache.hadoop.mapred.Task$Counter is deprecated. Use org.apache.hadoop.mapreduce.TaskCounter instead
21699 [main] ERROR org.apache.sqoop.tool.ExportTool  - Error during export: Export job failed!
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 30.419s
Finished at: Fri Aug 23 15:28:03 IST 2013
Final Memory: 14M/113M

После этого мы проверили, что таблица mysql содержит только 100 записей из 1600 записей. Ту же программу мы выполнили на других таблицах, тогда из 8000 записей только 6800 записей и 235202 записи из 376927 записей были экспортированы в таблицу mysql. Может ли кто-нибудь дать некоторое предложение относительно вышеуказанной ошибки выполнения программы.

С нетерпением жду ответа, ваша помощь очень ценится.


person Community    schedule 23.08.2013    source источник


Ответы (2)


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

4566,38,80,2013-03-07 12:16:26.03,false,No SSH or Telnet credentials available. If an HTTP(S) exists for this asset, it was not able to authenticate.,,,00 00 00 00 01 0f c7 e6

6-й столбец (No SSH...) содержит запятую внутри. В результате Sqoop разделит этот столбец на два разных столбца и, следовательно, вы получите исключение. Я бы предложил очистить ваши данные. Если вы используете Sqoop для их импорта в HDFS, вы можете использовать параметры --enclosed-by или --escaped-by для решения этой проблемы.

person Jarek Jarcec Cecho    schedule 24.08.2013
comment
Спасибо, Ярек, я использовал Flume для импорта данных в HDFS и теперь пытаюсь экспортировать их в MySql. Ну, я понял, что ваше объяснение относительно 6-го столбца содержит запятую внутри. Можем ли мы использовать --enclosed-by или --escaped-by во время экспорта, чтобы решить эту проблему. Мне нужно Нет доступных учетных данных SSH или Telnet. Если для этого актива существует HTTP(S), значит, ему не удалось пройти аутентификацию. как единый 6-й столбец. - person ; 26.08.2013

Кажется, у вас есть строка, в которой ожидается число, например «не удалось пройти аутентификацию». (как я вижу из трассировки, которой вы поделились). Пожалуйста, проверьте исходные данные, которые передаются в базу данных.

Изменить

Используйте другой символ в качестве разделителя. Когда данные записываются (я предполагаю, что программа MR генерирует эти данные) в HDFS, используйте редкий символ (например, ^A, #, @) в качестве разделителя.

В команде «экспорт» есть различные параметры, такие как «--enclosed-by», «--escaped-by». Но ваши данные должны быть подготовлены соответствующим образом. Самый простой вариант — выбрать символ-разделитель, который вряд ли появится в ваших данных.

Edit-2 В этом случае ни один инструмент не может сделать ничего особенного, так как символ-разделитель вставляется между полем данных без какого-либо escape-символа или без заключающих строк (например, «Привет, как дела»). . Данные необходимо контролировать при хранении. Таким образом, при извлечении через flume вы должны использовать разделитель, отличный от ',' ИЛИ ​​экранировать ',' (например, «Привет \, Как дела») символы ИЛИ иметь возможность заключить каждое поле («Привет, как дела»).

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

В качестве альтернативы вы можете написать программу MR для очистки или фильтрации записей о проблемах (для обработки отдельно) ИЛИ загрузить данные в промежуточную таблицу на MYSQL и написать SP для обработки сценария записи о проблеме и вставки в целевую таблицу.

person Rags    schedule 23.08.2013
comment
Спасибо Rags, я использовал flume для импорта данных в HDFS, которые уже есть в CSV, и теперь пытаюсь экспортировать их в MySql. Мне нужно Нет доступных учетных данных SSH или Telnet. Если для этого актива существует HTTP(S), значит, ему не удалось пройти аутентификацию. как единый 6-й столбец. Схема MySql создается в соответствии с данными, но если я укажу разделитель как , то он будет сохранен в таблице как 6-й столбец. Нет доступных учетных данных SSH или Telnet. Если для этого актива и 7-го столбца существует HTTP(S), он не смог пройти аутентификацию. Можем ли мы решить эту проблему, используя '--enclosed-by', '--escaped-by'? - person ; 26.08.2013