来自inputstream的aws多部分上载具有错误的offset

huus2vyu  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(388)

我正在使用javaamazonawsdk执行一些从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;
        }

但是,上传的文件与原来的不一样。更具体地说,我正在测试一个测试文件,它大约有20MB。我上传的部分是5 mb每个。在每个5mb部分的末尾,我看到一些额外的文本,总是96个字符长。
更奇怪的是,如果我在.withfileoffset()中添加了一些愚蠢的东西,

.withFileOffset(currentFilePosition-34)

错误保持不变。我本来希望得到其他字符,但我得到了确切的96个额外字符,好像我没有修改行。
有什么问题吗?
谢谢,塞尔维亚人

bjp0bcyl

bjp0bcyl1#

我想出来了。这是我一个愚蠢的假设。结果是,“.withfileoffset(…)”中的文件偏移量告诉您在目标文件中写入的偏移量。它没有说任何关于源头的事。通过重复地打开和关闭流,我总是从文件的开头开始写入,但是写入的偏移量不同。解决方案是在打开流后添加seek语句:

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

            inputStream.seek(currentFilePosition);

相关问题