Невозможно загрузить pdf-файлы размером более 10 МБ в Hbase через python happybase - HDP 3
Мы используем HDP 3. Мы пытаемся вставить PDF-файлы в один из столбцов определенного семейства столбцов в таблице Hbase. Средой разработки является python 3.6, а соединителем hbase - happybase 1.1.0.
Мы не можем загрузить файл PDF размером более 10 МБ в hbase.
В hbase мы установили параметры следующим образом:
Мы получаем следующую ошибку:
IOError (message = b'org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: сбой 1 действие: org.apache.hadoop.hbase.DoNotRetryIOException: ячейка с размером 80941994 превышает ограничение 10485760 байт \ n \ tath. Org.ap.hbase.regionserver.RSRpcServices.checkCellSizeLimit(RSRpcServices.java:937)\n\tat org.apache.hadoop.hbase.regionserver..regionserver.RSRpcServices.doNonAtomicBatchOp(RSRpcServices.java:959)\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.ap.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.RpcE Xecutor$Handler.run(RpcExecutor.java:324)\ п \ тат
0 ответов
Вы должны проверить исходный код 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. Обратите внимание, что здесь добавлен дополнительный 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 или меньше отключает проверку. Значение по умолчанию составляет 10 МБ. Это параметр безопасности для защиты сервера от ситуаций OOM. По умолчанию
10485760