scala - 使用 AWS s3 的分段上传 API 时出现内存不足问题

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

我尝试将驱动程序内存和执行程序内存增加到 100 G,并尝试了一些其他的 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 accepts 文件:

public PutObjectRequest(String bucketName, String key, File file)

像下面这样的东西应该可以工作(虽然我还没有检查过):

val result = TransferManagerBuilder.standard.withS3Client(s3Client)
  .build
  .upload(
    new PutObjectRequest(
      bucketName,
      keyName,
      new File(new Path(hdfsFilePath))
    )
    .withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(kmsKey))
    .withCannedAcl(CannedAccessControlList.BucketOwnerFullControl)
  )

https://stackoverflow.com/questions/56739977/

相关文章:

python-3.x - 如何在 Google Cloud Composer 中设置 chromed

python - 删除谷歌驱动器文件时权限不足错误

c - 如何使用 DejaGnu 设置单元测试

visual-studio-code - 寻找用于 i18n 资源包编辑的 visual studi

amazon-web-services - 如何终止到 elb 的 HTTPS 流量并且容器正在运行

python - 有没有办法在 Windows 上使用 gradle 编译 python proto

google-kubernetes-engine - 无法将 gsutil 与 GKE 集群的工作负

linux - devtoolset-7 STL_vector.h 未定义对 `std::__thr

amazon-web-services - 如何使用单例类解决 AWS 模拟测试

hive - 如何禁用 Hive 表的事务?