我正在使用Java Amazon AWS SDK执行从HDFS到S3的一些分段上传。我的代码如下:
for (int i = startingPart; currentFilePosition < contentLength ; i++)
{
FSDataInputStream inputStream = fs.open(new Path(hdfsFullPath));
// Last part can be less than 5 MB. Adjust part size.
partSize = Math.min(partSize, (contentLength - currentFilePosition));
// Create request to upload a part.
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket).withKey(s3Name)
.withUploadId(currentUploadId)
.withPartNumber(i)
.withFileOffset(currentFilePosition)
.withInputStream(inputStream)
.withPartSize(partSize);
// Upload part and add response to our list.
partETags.add(s3Client.uploadPart(uploadRequest).getPartETag());
currentFilePosition += partSize;
inputStream.close();
lastFilePosition = currentFilePosition;
}
但是,上传的文件与原始文件不同。更具体地说,我正在测试一个大约20 MB的测试文件。我上传的部分各5 MB。在每个5MB部分的末尾,我看到一些额外的文本,总是96个字符长。
更奇怪的是,如果我向.withFileOffset()添加一些愚蠢的东西,例如,
.withFileOffset(currentFilePosition-34)
错误保持不变。我期待得到其他角色,但我得到了额外的96个额外字符,好像我没有修改过这条线。
任何想法可能出错?
谢谢, 谢尔班
答案 0 :(得分:0)
我明白了。这来自我的一个愚蠢的假设。事实证明,“。withFileOffset(...)”中的文件偏移量告诉您在目标文件中写入的偏移量。它没有说明来源。通过反复打开和关闭流,我总是从文件的开头写入,但是到不同的偏移量。解决方案是在打开流后添加一个seek语句:
FSDataInputStream inputStream = fs.open(new Path(hdfsFullPath));
inputStream.seek(currentFilePosition);