Análisis de HBase BucketAllocatorException

Recientemente, se han observado los siguientes registros WARN en el clúster HBase:

2020-04-18 16: 17: 03,081 WARN [regionerver / xxx-BucketCacheWriter-1] bucket.BucketCache: asignación fallida para 604acc82edd349ca906939af14464bcb_175674734;
org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocatorException: asignación demasiado grande size = 1114202; ajuste los tamaños de BucketCache hbase.bucketcache.bucket.sizes para acomodarlos si el tamaño parece razonable y desea almacenarlo en caché.

Probablemente signifique: BucketAllocator no puede asignar espacio para el bloque porque es demasiado grande (tamaño = 1114202). Si desea ser almacenado en caché y cree que es razonable, puede ajustar el parámetro hbase.bucketcache.bucket.sizes.

De forma predeterminada, el valor máximo de HBase BucketCache puede bloquear el caché es 512 KB, es decir hbase.bucketcache.bucket.sizes = 5120,9216,17408,33792,41984,50176,58368,66560,99328,132096,197632,263168,394240, 525312, 14 etiquetas de tamaño por defecto. Si queremos almacenar en caché un bloque más grande, podemos ajustar los parámetros a hbase.bucketcache.bucket.sizes = 5120,9216,17408,33792,41984,50176,58368,66560,99328,132096,197632,263168,394240,525312 , 1049600, 2098176, en este momento el bloque máximo permitido de 2 MB.

Echemos un vistazo breve al código fuente correspondiente, las clases relacionadas son:
/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java
BucketAllocator implementa principalmente la organización y la gestión del bucket , Asignar espacio de memoria para el bloque.

/**
   * Allocate a block with specified size. Return the offset
   * @param blockSize size of block
   * @throws BucketAllocatorException
   * @throws CacheFullException
   * @return the offset in the IOEngine
   */
  public synchronized long allocateBlock(int blockSize) throws CacheFullException,
      BucketAllocatorException {
    assert blockSize > 0;
    BucketSizeInfo bsi = roundUpToBucketSizeInfo(blockSize);
    if (bsi == null) {
      throw new BucketAllocatorException("Allocation too big size=" + blockSize +
        "; adjust BucketCache sizes " + BlockCacheFactory.BUCKET_CACHE_BUCKETS_KEY +
        " to accomodate if size seems reasonable and you want it cached.");
    }
    long offset = bsi.allocateBlock();

    // Ask caller to free up space and try again!
    if (offset < 0)
      throw new CacheFullException(blockSize, bsi.sizeIndex());
    usedSize += bucketSizes[bsi.sizeIndex()];
    return offset;
  }

Después de llamar al método roundUpToBucketSizeInfo (), si el resultado devuelto es nulo, se genera una excepción BucketAllocatorException. Eche un vistazo al método roundUpToBucketSizeInfo ():

/**
 * Round up the given block size to bucket size, and get the corresponding
 * BucketSizeInfo
*/
public BucketSizeInfo roundUpToBucketSizeInfo(int blockSize) {
	for (int i = 0; i < bucketSizes.length; ++i)
	  if (blockSize <= bucketSizes[i])
		return bucketSizeInfos[i];
	return null;
}

Este método compara el bloque blockSize entrante con la matriz bucketSizes comenzando en el índice 0. Una vez que es menor que bucketSize [i], asigna el tamaño de bucketSizeInfos [i] para almacenar el bloque.

Echemos un vistazo al proceso de inicialización de la matriz bucketSizes:

private static final int DEFAULT_BUCKET_SIZES[] = { 4 * 1024 + 1024, 8 * 1024 + 1024,
  16 * 1024 + 1024, 32 * 1024 + 1024, 40 * 1024 + 1024, 48 * 1024 + 1024,
  56 * 1024 + 1024, 64 * 1024 + 1024, 96 * 1024 + 1024, 128 * 1024 + 1024,
  192 * 1024 + 1024, 256 * 1024 + 1024, 384 * 1024 + 1024,
  512 * 1024 + 1024 };

private final int[] bucketSizes;
BucketAllocator(long availableSpace, int[] bucketSizes)
  throws BucketAllocatorException {
  this.bucketSizes = bucketSizes == null ? DEFAULT_BUCKET_SIZES : bucketSizes;
  Arrays.sort(this.bucketSizes);
  ...
}

Como puede ver, si bucketSizes == null, el valor de DEFAULT_BUCKET_SIZES se toma de manera predeterminada y la matriz se ordena. El orden de este paso sentó las bases para la comparación cíclica del paso anterior.

El valor de la matriz DEFAULT_BUCKET_SIZES es el valor predeterminado del parámetro hbase.bucketcache.bucket.sizes.

Escanee el código QR para seguir la cuenta oficial del blogger

Reimpresión por favor indique la fuente! Bienvenido a prestar atención a mi cuenta pública de WeChat [Notas de trabajo de HBase]

Supongo que te gusta

Origin www.cnblogs.com/zpb2016/p/12756332.html
Recomendado
Clasificación