我正在执行粘合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=10g
和spark.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
任何想法都可能是问题所在。
谢谢
答案 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”。