AWS Glue作业抛出java.lang.OutOfMemoryError:Java堆空间

时间:2020-04-29 15:07:15

标签: apache-spark aws-glue

我正在执行粘合ETL转换作业。假定此作业是从s3读取数据并将其转换为镶木地板。

下面是粘合源。...sourcePath是s3文件的位置。

在这个位置,我们大约有1亿个json文件。所有文件都嵌套在子文件夹中。

因此,这就是我应用exclusionPattern排除和以a开头的文件(大约270万个文件)的原因,我相信只有以a开头的文件会被处理。

val file_paths = Array(sourcePath)

val exclusionPattern = "\"" + sourcePath + "{[!a]}**" + "\""

glueContext
  .getSourceWithFormat(connectionType = "s3",
    options = JsonOptions(Map(
      "paths" -> file_paths, "recurse" -> true, "groupFiles" -> "inPartition", "exclusions" -> s"[$exclusionPattern]"
    )),
    format = "json",
    transformationContext = "sourceDF"
  )
  .getDynamicFrame()
  .map(transformRow, "error in row")
  .toDF()

在使用标准工作人员类型和G2工作人员类型运行此作业之后。我不断收到错误消息

#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
#   Executing /bin/sh -c "kill -9 27788"...

在cloudwatch中,我可以看到驱动程序内存正在100%被利用,但是执行程序内存的使用几乎为零。

运行作业时,我正在设置spark.driver.memory=10gspark.driver.memoryOverhead=4096以及--conf作业参数。

这是日志中的详细信息

--conf spark.hadoop.yarn.resourcemanager.connect.max-wait.ms=60000 
--conf spark.hadoop.fs.defaultFS=hdfs://ip-myip.compute.internal:1111 
--conf spark.hadoop.yarn.resourcemanager.address=ip-myip.compute.internal:1111 
--conf spark.dynamicAllocation.enabled=true 
--conf spark.shuffle.service.enabled=true 
--conf spark.dynamicAllocation.minExecutors=1 
--conf spark.dynamicAllocation.maxExecutors=4 
--conf spark.executor.memory=20g 
--conf spark.executor.cores=16 
--conf spark.driver.memory=20g 
--conf spark.default.parallelism=80 
--conf spark.sql.shuffle.partitions=80 
--conf spark.network.timeout=600 
--job-bookmark-option job-bookmark-disable 
--TempDir s3://my-location/admin 
--class com.example.ETLJob 
--enable-spark-ui true 
--enable-metrics 
--JOB_ID j_111... 
--spark-event-logs-path s3://spark-ui 
--conf spark.driver.memory=20g 
--JOB_RUN_ID jr_111... 
--conf spark.driver.memoryOverhead=4096 
--scriptLocation s3://my-location/admin/Job/ETL 
--SOURCE_DATA_LOCATION s3://xyz/ 
--job-language scala 
--DESTINATION_DATA_LOCATION s3://xyz123/ 
--JOB_NAME ETL

任何想法都可能是问题所在。

谢谢

2 个答案:

答案 0 :(得分:1)

如果文件太多,可能是驱动程序不堪重负。尝试使用useS3ListImplementation。这是Amazon S3 ListKeys操作的实现,该操作将大型结果集拆分为多个响应。

尝试添加:

"useS3ListImplementation" -> true

[1] https://aws.amazon.com/premiumsupport/knowledge-center/glue-oom-java-heap-space-error/

答案 1 :(得分:0)

如@eman所建议...

我像下面一样应用了所有3个groupFiles,groupSize和useS3ListImplementation ..

options = JsonOptions(Map(
            "path" -> sourcePath,
            "recurse" -> true,
            "groupFiles" -> "inPartition",
            "groupSize" -> 104857600,//100 mb
            "useS3ListImplementation" -> true
    ))

这对我有用...如果数据排列不正确,还可以选择“ acrossPartitions”。