3

我们正在使用 HDP 3。我们正在尝试在 Hbase 表中特定列族的列之一中插入 PDF 文件。开发环境为python 3.6,hbase连接器为happybase 1.1.0。

我们无法在 hbase 中上传任何大于 10 MB 的 PDF 文件。

在hbase中我们设置了如下参数: 在此处输入图像描述

在此处输入图像描述

我们收到以下错误:

IOError(message=b'org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: 失败 1 操作: org.apache.hadoop.hbase.DoNotRetryIOException: 大小为 80941994 的单元格超过 10485760 字节的限制\n\tat org.apache.hadoop .hbase.regionserver.RSRpcServices.checkCellSizeLimit(RSRpcServices.java:937)\n\tat org.apache.hadoop.hbase.regionserver.RSRpcServices.doBatchOp(RSRpcServices.java:1010)\n\tat org.apache.hadoop.hbase .regionserver.RSRpcServices.doNonAtomicBatchOp(RSRpcServices.java:959)\n\tat org.apache.hadoop.hbase.regionserver.RSRpcServices.doNonAtomicRegionMutation(RSRpcServices.java:922)\n\tat org.apache.hadoop.hbase.regionserver .RSRpcServices.multi(RSRpcServices.java:2683)\n\tat org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:42014)\n\tat org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:409)\n\tat org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:131)\n\tat org.apache。 hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:324)\n\tat

4

1 回答 1

3

您必须检查hbase 源代码以查看发生了什么:

private void checkCellSizeLimit(final HRegion r, final Mutation m) throws IOException {
    945    if (r.maxCellSize > 0) {
    946      CellScanner cells = m.cellScanner();
    947      while (cells.advance()) {
    948        int size = PrivateCellUtil.estimatedSerializedSizeOf(cells.current());
    949        if (size > r.maxCellSize) {
    950          String msg = "Cell with size " + size + " exceeds limit of " + r.maxCellSize + " bytes";
    951          if (LOG.isDebugEnabled()) {
    952            LOG.debug(msg);
    953          }
    954          throw new DoNotRetryIOException(msg);
    955        }
    956      }
    957    }
    958  }

根据错误消息,您超出了r.maxCellSize.

上述注意事项:该功能PrivateCellUtil.estimatedSerializedSizeOf已贬值,将在未来的版本中删除。

这是它的描述:

在 RPC 层根据 keyvalue 的序列化格式进行估计。请注意,在此处的大小中添加了一个额外的 SIZEOF_INT,用于指示单元格以连续格式序列化的情况(例如,在 RPC 中)的单元格的实际长度。

您必须检查值设置在哪里。首先检查HRegion.java中的“普通”值

this.maxCellSize = conf.getLong(HBASE_MAX_CELL_SIZE_KEY, DEFAULT_MAX_CELL_SIZE);

因此,某处HBASE_MAX_CELL_SIZE_KEY可能存在一个和DEFAULT_MAX_CELL_SIZE限制:

public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";
public static final int DEFAULT_MAX_CELL_SIZE = 10485760;

在这里,您有10485760限制,显示在您的错误消息中。如果您需要,可以尝试将此限制提高到您的限制值。我建议在使用它之前对其进行适当的测试(限制可能有一些原因)。

编辑:添加有关如何更改base.server.keyvalue.maxsize. 检查config.files

您可以在哪里阅读:

hbase.client.keyvalue.maxsize(描述)

指定 KeyValue 实例的组合最大允许大小。这是为保存在存储文件中的单个条目设置上限。由于它们无法拆分,因此有助于避免由于数据太大而无法进一步拆分区域。将其设置为最大区域大小的一小部分似乎是明智的。将其设置为零或更少会禁用检查。默认

10485760

hbase.server.keyvalue.maxsize(描述)

单个单元格的最大允许大小,包括值和所有关键组件。值为 0 或更小会禁用检查。默认值为 10MB。这是保护服务器免受 OOM 情况影响的安全设置。默认

10485760
于 2019-03-06T13:56:17.547 回答