0

3 つのステップで構成されるジョブがあります。私の入力は、Amazon S3 に保存された暗号化された JSON オブジェクト (1 行に 1 つ) です。(s3e://)。

ジョブ パラメータ:

job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

その他の重要なパラメータ:

mapred.min.split.size           0
mapred.job.reuse.jvm.num.tasks  -1
fs.s3.block.size             67108864

JSON が正しく終了していないことを除いて、2 番目のステップのマッパーがほぼ常に失敗するという問題に直面しています。さらに調査した結果、JSON 自体は入力ファイルで正しく、不完全な値を読み取るのはマッパーであることがわかりました。によって読み取られた値TextInputFormatが不完全であり、正しく終了していません。

JsonException Value: {..."tag_action_code":"ndi","tag_value":"tribhutes
FATAL - JSON exception while handling exception 
org.json.JSONException: Unterminated string at character 390
    at org.json.JSONTokener.syntaxError(JSONTokener.java:410)
    at org.json.JSONTokener.nextString(JSONTokener.java:244)
    at org.json.JSONTokener.nextValue(JSONTokener.java:341)
    at org.json.JSONObject.<init>(JSONObject.java:190)
    at org.json.JSONObject.<init>(JSONObject.java:402)
    at com.amazon.associates.lib.ExtractItemMapReduce.putItemProcessingStateToExtracItemText(ExtractItemMapReduce.java:92)
    at com.amazon.associates.mapred.common.FatTireMapper$1.putItemProcessingState(FatTireMapper.java:51)
    at com.amazon.associates.mapred.common.FatTireMapReduceExecutor.handleException(FatTireMapReduceExecutor.java:35)
    at com.amazon.associates.mapred.common.FatTireMapperExecutor.execute(FatTireMapperExecutor.java:55)
    at com.amazon.associates.mapred.common.FatTireMapper.map(FatTireMapper.java:63)
    at com.amazon.associates.mapred.common.FatTireMapper.map(FatTireMapper.java:21)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:771)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:375)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)
Filename: part-00004 Split Details: Start: 0 Length: 593575152
Key: 536936059 Value: {..."tag_action_code":"ndi","tag_value":"tribhutes

これはかなり一貫して起こっています。しかし、おもしろいのは、2 番目のステップが成功し、3 番目のステップで失敗する場合があることです。

私のテスト データは非常に巨大で、最初のステップ (常に実行されます) が正常に完了すると、550 ~ 600 MB のチェックポイントの断続的なファイルが 5 つ得られ、これらは 2 番目のステップに入力されます。

2 番目のステップへの入力が暗号化されていない試行の 1 つで、成功しました。

私はかなり立ち往生しています。あらゆる種類のポインタやヘルプをいただければ幸いです。

4

1 に答える 1

0

あなたの暗号化方式では、レコードの暗号化されたバージョンに改行文字が含まれる可能性がありますか? その場合、Hadoop はその JSON オブジェクトを 2 つの別個のレコードと誤って見なします。ここで何が起こっているかについての私の推測です。TextInputFormat を使用する場合は、データから改行文字を慎重にエスケープまたは削除してください。

于 2013-02-01T01:31:02.070 に答える