来自inputStream的AWS分段上传具有错误的遗忘

时间:2015-09-24 16:15:40

标签: hadoop amazon-web-services amazon-s3 hdfs

我正在使用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个额外字符,好像我没有修改过这条线。

任何想法可能出错?

谢谢, 谢尔班

1 个答案:

答案 0 :(得分:0)

我明白了。这来自我的一个愚蠢的假设。事实证明,“。withFileOffset(...)”中的文件偏移量告诉您在目标文件中写入的偏移量。它没有说明来源。通过反复打开和关闭流,我总是从文件的开头写入,但是到不同的偏移量。解决方案是在打开流后添加一个seek语句:

            FSDataInputStream inputStream = fs.open(new Path(hdfsFullPath));

            inputStream.seek(currentFilePosition);