在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()
希望有人能帮我。
谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!