AWS Бросок задания на клей java .lang.OutOfMemoryError: Java пространство кучи - PullRequest
0 голосов
/ 29 апреля 2020

Я выполняю задание преобразования ETL клея. Эта работа предполагает чтение данных из s3 и преобразование в паркет.

Ниже приведен источник клея .... sourcePath - это местоположение файла s3.

В этом месте у нас около 100 миллионов json файлов ... все они вложенные в подпапки.

По этой причине я применяю exclusionPattern для исключения и файлы, начинающиеся с a (что составляет около 2,7 миллиона файлов), и я считаю, что только файлы, начинающиеся с 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"...

И в облачных часах я вижу, что память драйвера используется на 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

Любые идеи, что может быть проблемой.

Спасибо

1 Ответ

1 голос
/ 29 апреля 2020

Если у вас слишком много файлов, вы, вероятно, перегружаете драйвер. Попробуйте использовать useS3ListImplementation. Это реализация операции Amazon S3 ListKeys, которая разбивает большие наборы результатов на несколько ответов.

попробуйте добавить:

"useS3ListImplementation" -> true

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

...