Scala 使用AWS s3的多部分上载API时内存不足问题

Scala 使用AWS s3的多部分上载API时内存不足问题,scala,amazon-web-services,amazon-s3,aws-sdk,awss3transfermanager,Scala,Amazon Web Services,Amazon S3,Aws Sdk,Awss3transfermanager,我尝试使用aws SDK和spark使用aws多部分上传,文件大小约为14GB,但内存不足错误。这一行的给定错误-val bytes:Array[Byte]=IOUtils.toByteArray(is) 我曾尝试将驱动程序内存和执行程序内存提升到100g,并尝试了其他一些spark优化 下面是我正在尝试使用的代码:- val tm = TransferManagerBuilder.standard.withS3Client(s3Client).build val fs = File

我尝试使用aws SDK和spark使用aws多部分上传,文件大小约为14GB,但内存不足错误。这一行的给定错误-
val bytes:Array[Byte]=IOUtils.toByteArray(is)

我曾尝试将驱动程序内存和执行程序内存提升到100g,并尝试了其他一些spark优化

下面是我正在尝试使用的代码:-

val tm = TransferManagerBuilder.standard.withS3Client(s3Client).build
      val fs = FileSystem.get(new Configuration())
      val filePath = new Path(hdfsFilePath)
      val is:InputStream = fs.open(filePath)
      val om = new ObjectMetadata()
      val bytes: Array[Byte] = IOUtils.toByteArray(is)
      om.setContentLength(bytes.length)
      val byteArrayInputStream: ByteArrayInputStream = new ByteArrayInputStream(bytes)
      val request = new PutObjectRequest(bucketName, keyName, byteArrayInputStream, om).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(kmsKey)).withCannedAcl(CannedAccessControlList.BucketOwnerFullControl)
      val upload = tm.upload(request)
这是我得到的一个例外:-

java.lang.OutOfMemoryError
                at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123)
                at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117)
                at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
                at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
                at com.amazonaws.util.IOUtils.toByteArray(IOUtils.java:45)

PutObjectRequest
文件

public PutObjectRequest(String bucketName, String key, File file)
类似于以下的东西应该可以工作(但我还没有检查):

val result=TransferManagerBuilder.standard.With3Client(s3Client)
.建造
.上传(
新PutObjectRequest(
bucketName,
关键字名称,
新文件(新路径(hdfsFilePath))
)
.WithSeawskeyManagementParams(新的SSEAwsKeyManagementParams(kmsKey))
.带CanneDacl(CanneDaccess控制器。BucketOwnerFullControl)
)

如果库支持它,则最好发送一个流,而不是将整个内容转换为字节数组。这里有一个相关的问题,您可以看看,以指导您了解更多需要查找的内容:您好,您可以看看(我是其中的一名撰稿人),它支持对象存储操作上的Akka流