hdp 3在hbase中上载大小超过10mb的pdf文件

4uqofj5v  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(968)

我们使用的是hdp3。我们正在尝试将pdf文件插入hbase表中特定列族的一列中。开发环境是python3.6,hbase连接器是happybase 1.1.0。
我们无法在hbase中上载任何大于10 mb的pdf文件。
在hbase中,我们设置了如下参数:


我们得到以下错误:
ioerror(message=b'org.apache.hadoop.hbase.client.retriesHaustedWithDetailsException:失败1操作:org.apache.hadoop.hbase.donotretryioexception:大小为80941994的单元格超过了10485760字节的限制\n\tat org.apache.hadoop.hbase.regionserver.rsrpcservices.checkcellsizelimit(rsrpcservices)。java:937)\否\torg.apache.hadoop.hbase.regionserver.rsrpcservices.dobatchop(rsrpcservices)。java:1010)\n\t org.apache.hadoop.hbase.regionserver.rsrpcservices.dononatomicbatchop(rsrpcservices)。java:959)\n\tat org.apache.hadoop.hbase.regionserver.rsrpcservices.dononatomicregionmutation(rsrpcservices)。java:922)\否\torg.apache.hadoop.hbase.regionserver.rsrpcservices.multi(rsrpcservices。java:2683)\n\t org.apache.hadoop.hbase.shaded.protobuf.generated.clientprotos$clientservice$2.callblockingmethod(clientprotos。java:42014)\n\t org.apache.hadoop.hbase.ipc.rpcserver.call(rpcserver。java:409)\否\torg.apache.hadoop.hbase.ipc.callrunner.run(callrunner。java:131)\n\t org.apache.hadoop.hbase.ipc.rpcexecutor$handler.run(rpcexecutor。java:324)\否\t

0g0grzrc

0g0grzrc1#

您必须检查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的序列化格式进行估计。请注意,这里的size中添加了一个额外的sizeof int,用于指示以连续格式序列化单元格(例如在rpcs中)时单元格的实际长度。
您必须检查值集在哪里。首先检查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

相关问题