1

sqoop を使用して HDFS から mysql にデータをエクスポートしようとしていますが、次の問題に直面しています。

サンプルデータ:

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 テーブルに 1600 レコード中 100 レコードしか含まれていないことを確認しました。同じプログラムを別のテーブルで実行すると、8000 レコードのうち 6800 レコードのみが実行され、376927 レコードのうち 235202 レコードが mysql テーブルにエクスポートされました。上記のプログラム実行エラーに関する提案を誰でも提供できますか。

返信をお待ちしております。ご協力をお願いいたします。

4

2 に答える 2

0

「認証できませんでした」のように数字が期待される文字列があるようです。(あなたが共有したトレースからわかるように)。データベースにプッシュされているソース データを確認してください。

編集

区切り文字として他の文字を使用してください。データが HDFS に書き込まれるとき (MR プログラムがこのデータを生成していると仮定します)、まれな文字 (^A、#、@ など) を区切り文字として使用します。

「エクスポート」コマンドには、「--enclosed-by」、「--escaped-by」などのさまざまなオプションがあります。ただし、データはそれに応じて準備する必要があります。最も単純なオプションは、データ内で発生する可能性が非常に低い区切り文字を選択することです。

編集-2 その場合、エスケープ文字や文字列を囲むことなく区切り文字がデータフィールドの間に入っているため (「こんにちは、お元気ですか」など)、どのツールでもできることはほとんどありません。データは保管中に管理する必要があります。したがって、flume を介して抽出するときは、',' またはエスケープ ',' ("Hello\, How are you" など) 文字とは異なる区切り文字を使用するか、各フィールドを囲むことができるようにする必要があります ("Hello, How are you")。

したがって、flume を介してデータを抽出および保存する際に、これを達成する必要があります。これらを達成するための Flume のオプションがあるかどうかを調べる必要があります。

あるいは、MR プログラムを作成して問題レコードをクレンジングまたはフィルターで除外する (個別に処理する) か、データを MYSQL のステージング テーブルにロードし、SP を作成して問題レコード シナリオを扱い、ターゲット テーブルに挿入することもできます。

于 2013-08-23T15:13:58.687 に答える