我的工作包括3个步骤。我的输入是存储在Amazon S3中的加密JSON对象(每行一个)。 (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被错误地终止。经过进一步调查,我确定输入文件中的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
这种情况非常一致。但有趣的是,有时第二步会完成,第三步就会失败。
我的测试数据非常庞大,在成功完成第一步(总是经历)之后,我得到了5 550-600 MB的检查点间歇文件,这些文件输入到第二步。
在第二步的输入未加密的尝试之一中,它成功了。
我很困惑。任何类型的指针或帮助都将受到高度赞赏。
答案 0 :(得分:0)
您的加密方案是否可以将记录的加密版本包含换行符?如果是这样,这将导致Hadoop错误地将JSON对象视为两个单独的记录。这是我对这里发生的事情的猜测。使用TextInputFormat时,请务必小心地从数据中删除或删除换行符。