使用 MapR MultipleOutputs 写入 OrcNewOutputFormat 时出错

Posted

技术标签:

【中文标题】使用 MapR MultipleOutputs 写入 OrcNewOutputFormat 时出错【英文标题】:Error writing to OrcNewOutputFormat using MapR MultipleOutputs 【发布时间】:2019-03-19 17:08:51 【问题描述】:

我们从 ORC 文件中读取数据并使用 MultipleOutputs 将其写回 ORC 和 Parquet 格式。我们的工作只是 Map,没有 reducer。 在某些情况下,我们会遇到以下错误,这会导致整个工作失败。我认为这两个错误都是相关的,但不确定为什么这些错误不是针对每项工作的。 如果需要更多信息,请告诉我。

Error: java.lang.RuntimeException: Overflow of newLength. smallBuffer.length=1073741824, nextElemLength=300947

Error: java.lang.ArrayIndexOutOfBoundsException: 1000
    at org.apache.orc.impl.writer.StringTreeWriter.writeBatch(StringTreeWriter.java:70)
    at org.apache.orc.impl.writer.StructTreeWriter.writeRootBatch(StructTreeWriter.java:56)
    at org.apache.orc.impl.WriterImpl.addRowBatch(WriterImpl.java:546)
    at org.apache.hadoop.hive.ql.io.orc.WriterImpl.flushInternalBatch(WriterImpl.java:297)
    at org.apache.hadoop.hive.ql.io.orc.WriterImpl.close(WriterImpl.java:334)
    at org.apache.hadoop.hive.ql.io.orc.OrcNewOutputFormat$OrcRecordWriter.close(OrcNewOutputFormat.java:67)
    at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs$RecordWriterWithCounter.close(MultipleOutputs.java:375)
    at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.close(MultipleOutputs.java:574)


Error: java.lang.NullPointerException
    at java.lang.System.arraycopy(Native Method)
    at org.apache.orc.impl.DynamicByteArray.add(DynamicByteArray.java:115)
    at org.apache.orc.impl.StringRedBlackTree.addNewKey(StringRedBlackTree.java:48)
    at org.apache.orc.impl.StringRedBlackTree.add(StringRedBlackTree.java:60)
    at org.apache.orc.impl.writer.StringTreeWriter.writeBatch(StringTreeWriter.java:70)
    at org.apache.orc.impl.writer.StructTreeWriter.writeRootBatch(StructTreeWriter.java:56)
    at org.apache.orc.impl.WriterImpl.addRowBatch(WriterImpl.java:546)
    at org.apache.hadoop.hive.ql.io.orc.WriterImpl.flushInternalBatch(WriterImpl.java:297)
    at org.apache.hadoop.hive.ql.io.orc.WriterImpl.close(WriterImpl.java:334)
    at org.apache.hadoop.hive.ql.io.orc.OrcNewOutputFormat$OrcRecordWriter.close(OrcNewOutputFormat.java:67)
    at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs$RecordWriterWithCounter.close(MultipleOutputs.java:375)
    at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.close(MultipleOutputs.java:574)

【问题讨论】:

你找到原因了吗? 【参考方案1】:

就我而言,解决方案是将orc.rows.between.memory.checks(或spark.hadoop.orc.rows.between.memory.checks)从5000(默认值)更改为1

因为似乎 ORC 编写器无法处理向条带添加异常大的行。

该值可能会进一步调整以实现更好的安全性能平衡。

【讨论】:

以上是关于使用 MapR MultipleOutputs 写入 OrcNewOutputFormat 时出错的主要内容,如果未能解决你的问题,请参考以下文章

MapR 分发中使用的容器架构是啥?

一文读懂MapR Apache Hadoop的MapR发行版白皮书

MapR 和 Map Reduce 有啥区别?

Hadoop再凉凉,MapR终被HPE收购

MapR提供免费NoSQL数据库(英文)

text MapR导入JSON CLI