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.
Reimpresión por favor indique la fuente! Bienvenido a prestar atención a mi cuenta pública de WeChat [Notas de trabajo de HBase]