hadoop流媒体-如何更改Map输入字段分隔符?

bhmjp9jg  于 2021-05-31  发布在  Hadoop
关注(0)|答案(0)|浏览(285)

我在使用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)

有人知道是什么导致了问题,我在哪里犯了错吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题