我在使用hadoop流媒体压缩hdfs上的文本文件时遇到了一个问题。hadoop流中的默认字段分隔符是tab( \t
),但我使用unicode字符 \u001E
. 我尝试使用以下参数:
stream.map.input.field.separator=$'\x1e'
但它不起作用。这里的问题是使用不接受不可打印字符的xml版本1.0。
我决定从github官方帐户下载hadoop流媒体源代码,更改默认分隔符并重新编译代码。所以我把文件中的第80行改为:
mapInputFieldSeparator = job.get("stream.map.input.field.separator", "\t").getBytes("UTF-8");
收件人:
mapInputFieldSeparator = job.get("stream.map.input.field.separator", "\u001E").getBytes("UTF-8");
重新编译java代码:
javac -cp `hadoop classpath` PipeMapper.java
交换jar中的java类文件:
jar -uf /tmp/hadoop-streaming.jar org/apache/hadoop/streaming/PipeMapper.class
问题是它不起作用,当我尝试使用新的、定制的jar时,仍然会出现这个错误:
Error: java.io.IOException: Too many bytes before newline: 2147483648
at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:249)
at org.apache.hadoop.util.LineReader.readLine(LineReader.java:174)
at org.apache.hadoop.mapreduce.lib.input.UncompressedSplitLineReader.readLine(UncompressedSplitLineReader.java:94)
at org.apache.hadoop.mapred.LineRecordReader.<init>(LineRecordReader.java:136)
at org.apache.hadoop.mapred.TextInputFormat.getRecordReader(TextInputFormat.java:67)
at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.<init>(MapTask.java:169)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:432)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:170)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1869)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:164)
有人知道是什么导致了问题,我在哪里犯了错吗?
暂无答案!
目前还没有任何答案,快来回答吧!