如何避免 Parquet MemoryManager 异常

How to avoid Parquet MemoryManager exception

我正在从 PIG (v0.15.0) 脚本生成一些镶木地板 (v1.6.0) 输出。我的脚本采用多个输入源并将它们与一些嵌套连接起来。脚本运行没有错误,但在 STORE 操作期间我得到:

2016-04-19 17:24:36,299 [PigTezLauncher-0] INFO  org.apache.pig.backend.hadoop.executionengine.tez.TezJob - DAG Status: status=FAILED, progress=TotalTasks: 249 Succeeded: 220 Running: 0 Failed: 1 Killed: 28 FailedTaskAttempts: 43, diagnostics=Vertex failed, vertexName=scope-1446, vertexId=vertex_1460657535752_15030_1_18, diagnostics=[Task failed, taskId=task_1460657535752_15030_1_18_000000, diagnostics=[TaskAttempt 0 failed, info=[Error: Failure while running task:parquet.hadoop.MemoryManager: New Memory allocation 134217728 exceeds minimum allocation size 1048576 with largest schema having 132 columns
    at parquet.hadoop.MemoryManager.updateAllocation(MemoryManager.java:125)
    at parquet.hadoop.MemoryManager.addWriter(MemoryManager.java:82)
    at parquet.hadoop.ParquetRecordWriter.<init>(ParquetRecordWriter.java:104)
    at parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.java:309)
    at parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.java:262)
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigOutputFormat.getRecordWriter(PigOutputFormat.java:81)
    at org.apache.tez.mapreduce.output.MROutput.initialize(MROutput.java:398)
    ...

当我使用 -x tez 执行脚本时抛出了上述异常,但在使用 mapreduce 时我得到了同样的异常。我尝试使用 SET default_parallel 增加并行化,并在我的 STORE 操作之前添加一个(不必要的 w.r.t。我的真正目标)ORDER BY 操作以确保 PIG 有一个将数据发送到不同减速器的机会,并最大限度地减少任何给定减速器所需的内存。最后,我尝试使用 SET mapred.child.java.opts 增加可用内存。然而,None 其中有帮助。

有什么我想念的吗?是否有已知的策略来避免一个减速器承载过多负载并导致写入期间失败的问题?我在写入 avro 输出时遇到了类似的问题,这些问题似乎是由执行压缩步骤的内存不足引起的。

编辑:根据this source file,问题似乎归结为memAllocation/nCols<minMemAllocation。但是,内存分配似乎不受我尝试的 mapred.child.java.opts 设置的影响。

我最终使用参数 parquet.block.size 解决了这个问题。默认值(参见 source)足以写入一个 128 列宽的文件,但不会更大。 pig 中的解决方案是使用 SET parquet.block.size x;,其中 x >= y * 1024^2y 是输出中的列数。