【问题标题】:Azure Data Factory pipeline into compressed Parquet file: “java.lang.OutOfMemoryError:Java heap space”Azure 数据工厂管道到压缩 Parquet 文件中:“java.lang.OutOfMemoryError:Java heap space”
【发布时间】:2020-01-17 16:25:29
【问题描述】:

我有一个管道,它从 MS SQL Server 读取数据并将它们存储到 Azure 存储中 BLOB 容器中的文件中。该文件具有 Parquet(或 Apache Parquet,也称为)格式。

因此,当“接收器”(输出)文件以压缩方式(snappy 或 gzip - 无关紧要)存储并且文件足够大(超过 50 Mb)时,管道失败。消息如下:

"errorCode": "2200",
    "message": "Failure happened on 'Sink' side. 
ErrorCode=UserErrorJavaInvocationException,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=An error occurred when invoking java, message: java.lang.OutOfMemoryError:Java heap space\ntotal entry:11\r\njava.util.ArrayDeque.doubleCapacity(Unknown Source)\r\njava.util.ArrayDeque.addFirst(Unknown Source)\r\njava.util.ArrayDeque.push(Unknown Source)\r\norg.apache.parquet.io.ValidatingRecordConsumer.endField(ValidatingRecordConsumer.java:108)\r\norg.apache.parquet.example.data.GroupWriter.writeGroup(GroupWriter.java:58)\r\norg.apache.parquet.example.data.GroupWriter.write(GroupWriter.java:37)\r\norg.apache.parquet.hadoop.example.GroupWriteSupport.write(GroupWriteSupport.java:87)\r\norg.apache.parquet.hadoop.example.GroupWriteSupport.write(GroupWriteSupport.java:37)\r\norg.apache.parquet.hadoop.InternalParquetRecordWriter.write(InternalParquetRecordWriter.java:123)\r\norg.apache.parquet.hadoop.ParquetWriter.write(ParquetWriter.java:292)\r\ncom.microsoft.datatransfer.bridge.parquet.ParquetBatchWriter.addRows(ParquetBatchWriter.java:60)\r\n,Source=Microsoft.DataTransfer.Common,''Type=Microsoft.DataTransfer.Richfile.JniExt.JavaBridgeException,Message=,Source=Microsoft.DataTransfer.Richfile.HiveOrcBridge,'",
    "failureType": "UserError",
    "target": "Work_Work"
}

"Work_Work" 是管道中复制数据活动的名称。 如果我关闭压缩(生成的 BLOB 文件未压缩),则不会发生错误。

这是link中描述的错误吗

“……如果您使用自托管将数据复制到 Parquet 格式或从 Parquet 格式复制数据 集成运行时并点击错误说“发生错误时 调用 java,消息:java.lang.OutOfMemoryError:Java heap space", 您可以在机器中添加一个环境变量 _JAVA_OPTIONS 托管自托管 IR 以将 JVM 的最小/最大堆大小调整为 授权这样的副本,然后重新运行管道……”?

如果是,我是否正确理解我必须执行以下操作: 转到“自托管集成运行时”(仍然不知道它是什么)的服务器并增加 JVM 的最大堆大小。这是正确的吗?

如果是,我的下一个问题是:最大堆大小应该有多大?我的管道可以生成一个大小为 30 GB 的文件。
什么“最大堆大小”可以保证这样的文件不会导致失败?

【问题讨论】:

    标签: azure azure-blob-storage azure-pipelines parquet azure-data-factory-2


    【解决方案1】:

    如果您使用自托管集成运行时将数据复制到 Parquet 格式或从 Parquet 格式复制数据并遇到错误提示“调用 java 时发生错误,消息:java.lang.OutOfMemoryError:Java heap space”,您可以添加环境变量 _JAVA_OPTIONS在托管自托管 IR 的机器中调整 JVM 的最小/最大堆大小以授权此类副本,然后重新运行管道。

    示例: 将变量 _JAVA_OPTIONS 设置为 -Xms256m -Xmx16g。标志 Xms 指定 Java 虚拟机 (JVM) 的初始内存分配池,而 Xmx 指定最大内存分配池。这意味着 JVM 将以 Xms 的内存量启动,并且能够使用最大 Xmx 的内存量。默认情况下,ADF 使用最小 64MB 和最大 1G。

    参考:https://docs.microsoft.com/en-us/azure/data-factory/format-parquet

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 2022-11-11
      • 2020-06-27
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      相关资源
      最近更新 更多