hadoop thriftfs读取中的额外efbfbd字节

kognpnkq  于 2021-06-03  发布在  Hadoop
关注(0)|答案(0)|浏览(424)

在hadoop-0.20中,我们有一个thriftfs contrib,它允许我们用其他编程语言访问hdfs。hadoop提供了一个hdfs.py脚本用于演示。问题出在 do_get 以及 do_put 方法。
如果我们使用 get 下载一个utf-8文本文件,这是完全可以的,但当我们 get 一个文件在其他编码方式下,我们无法得到原始文件,下载的文件有很多额外的“efbfbd”字节。我猜hadoopthriftserver上的这些java代码可能会导致这些问题。

public String read(ThriftHandle tout, long offset,
                    int length) throws ThriftIOException {
   try {
     now = now();
     HadoopThriftHandler.LOG.debug("read: " + tout.id +
                                  " offset: " + offset +
                                  " length: " + length);
     FSDataInputStream in = (FSDataInputStream)lookup(tout.id);
     if (in.getPos() != offset) {
       in.seek(offset);
     }
     byte[] tmp = new byte[length];
     int numbytes = in.read(offset, tmp, 0, length);
     HadoopThriftHandler.LOG.debug("read done: " + tout.id);
     return new String(tmp, 0, numbytes, "UTF-8");
   } catch (IOException e) {
     throw new ThriftIOException(e.getMessage());
   }
 }

hdfs.py中的python代码是

output = open(local, 'wb')
path = Pathname();
path.pathname = hdfs;
input = self.client.open(path)

# find size of hdfs file

filesize = self.client.stat(path).length

# read 1MB bytes at a time from hdfs

offset = 0
chunksize = 1024 * 1024
while True:
   chunk = self.client.read(input, offset, chunksize)
   if not chunk: break
   output.write(chunk)
   offset += chunksize
   if (offset >= filesize): break

self.client.close(input)
output.close()

希望有人能帮我。
谢谢。

暂无答案!

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

相关问题