hadoop - 读取到Mapper类中的map方法的值不正确或读取不完全

标签 hadoop amazon-s3 amazon-emr emr

我的工作包含3个步骤。我的输入是存储在Amazon S3中的加密J​​SON对象(每行一个)。 (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的检查点间歇文件,这些文件被输入到第二步。

在第二步输入未加密的尝试中,它成功了。

我很困。任何指针或帮助将不胜感激。

最佳答案

使用您的加密方案,记录的加密版本是否可能包含换行符?如果是这样,这将导致Hadoop错误地将该JSON对象视为两个单独的记录。这是我对这里发生的事情的猜测。使用TextInputFormat时,请务必非常小心地转义或从数据中删除换行符。

关于hadoop - 读取到Mapper类中的map方法的值不正确或读取不完全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14626910/

相关文章:

amazon-s3 - 优化 EC2 -> S3 性能/成本

amazon-web-services - EMR5 上的 S3-Dist-Cp 失败

scala - 列出文件 scala emr hdfs(缺少 csv 文件)

xml - 在 Hive 中使用横向 View 时出现异常

java - aws s3上传优化,使用java sdk

macos - 适用于 OS X 的 Amazon S3 GUI 客户端,允许 AWS STS 担任角色

scala - 在 emr 5.29.0 上运行 Scala 2.12

json - hadoop - 验证加载到 hive 仓库中的 json 数据

regex - Regex_Extract使用PIG

database - Spark 中的快速条件加入