Estructura del archivo
Tanto el índice de bloques de datos como el filtro Bloom adoptan un diseño de índice jerárquico.
El índice de bloque de datos puede admitir índices de tres niveles cuando se usa en HFile V2: el índice de bloque de datos más bajo se llama bloque de índice de hoja, que puede indexar directamente al bloque de datos se llama capa intermedia; bloque de índice medio, y la capa superior se llama bloque de índice de hoja Índice para los datos raíz. El índice de datos raíz se almacena en un área llamada "sección de carga al abrir" y cuando se abre el área, se carga en la memoria. La lógica de indexación básica es: desde el índice de datos raíz hasta el índice de bloque intermedio, luego desde el índice de bloque intermedio hasta el bloque de índice de hoja, y finalmente encuentre el bloque de datos correspondiente del bloque de índice de hoja. En escenarios reales, los índices de bloques intermedios básicamente no existen. Al final del artículo, explicaremos la razón por la que básicamente no existe mediante cálculos detallados. Por lo tanto, la lógica de indexación se simplifica de la siguiente manera: el índice de datos raíz indexa directamente al bloque de índice de hoja, y luego el bloque de índice de hoja encuentra el bloque de datos correspondiente.
En el área "Sección de bloque de escaneo", el bloque de datos (usado para almacenar el valor clave de los datos del usuario), el bloque de índice de hoja (usado para almacenar el índice del bloque de datos) y el Bloom bloque (datos del filtro Bloom) se cruzan.
Los datos de índice del bloque de datos y los datos del filtro Bloom se dividen en varios bloques. Según este diseño, tanto los datos de índice como el filtro Bloom se pueden leer bajo demanda, lo que evita leer una gran cantidad de datos a la vez durante la fase de apertura de la región o la fase de lectura, lo que reduce efectivamente la latencia.
En este punto, se ha generado un HFile completo. Podemos revisar brevemente la ubicación y la relación de índice del bloque de índice raíz, el bloque de índice de hoja y el bloque de datos a través de la siguiente figura:
El filtro Bloom contiene metadatos de Bloom (tipo de función hash, número de funciones hash, etc. ) y datos de mapa de bits. Para evitar cargar todos los datos de floración cada vez, la parte de datos de floración en el archivo V2 se divide en varios bloques pequeños de floración. BloomData también se considera una especie de bloque en línea, que intersecta el bloque de datos y el bloque de índice de hoja, mientras que los metadatos sobre el filtro Bloom y la información de índice de varios bloques Bloom se almacenan en la sección Load-On-Open. Pero cabe señalar que en la sección FileInfo se guarda la información del tipo de configuración de BloomFilter, * * incluidos tres tipos: no habilitado, creación de BloomFilter en función de filas y creación de Bloom Filter en función de filas + columnas. La composición de HFile mezclado con bloques BloomFilter se muestra en la siguiente figura:
Veamos cómo hbase recupera una fila de datos en hdfs. Primero, siempre que la recuperación de hbase se base en valores de clave de fila o rangos de valores de clave de fila, ahora la tabla raíz solo tendrá una región cuando busque la ubicación de la hregión de la tabla mata, y nunca la tendrá.
Se divide para garantizar que la ubicación de la hregion de la tabla mata se pueda obtener al mismo tiempo y que la información de la región de todas las tablas de usuario se guarde en la tabla mata. La clave de fila de una región consta de la tabla correspondiente a la región y la clave de fila de la primera fila, porque la clave de fila de la tabla está en todas
Todas las regiones están ordenadas lexicográficamente. Si desea recuperar una clave de fila, puede saber que los datos que contienen la clave de fila modificada están en ese rango comparando las claves de fila para ese rango en la tabla mata. Este meta también contiene información sobre el hregionserver de la región.
La información regional en mata puede ubicar directamente el servidor hregion donde se encuentra la región que contiene datos de clave de fila.
No basta con saber en qué hregionserver se ubican rápidamente los datos de las claves de fila de la región. La región dividirá los datos en tiendas según los hogares, y una tienda solo puede contener un hogar. Al guardar en HDFS, el almacenamiento es en realidad un directorio. El verdadero almacenamiento de datos es el almacenamiento de archivos, es decir, hfile. Cuando cada archivo h alcance un cierto tamaño, se dividirá en dos archivos h, por lo que un directorio de almacenamiento contendrá varios archivos h.
Debido a que la tabla está dividida en regiones según las claves de fila, el tamaño predeterminado de la región es 256 M, que generalmente se establece en 1G, 2G, 4G, etc. , por lo que hfile no puede ser mayor que el valor del área.
Sin embargo, el archivo h puede seguir siendo muy grande, por lo que se dividirá en diferentes fragmentos en HDFS y se colocará en diferentes nodos de datos, por lo que aún es imposible localizarlo con precisión.
Hfile continúa dividiéndose en bloques de datos, índices de bloques, colas, etc. Cuando se encuentra en el archivo h donde se encuentra la clave de fila, primero leerá la información final del archivo h para obtener la ubicación del índice del bloque. La clave de un índice de bloque es la clave de la primera fila del bloque de datos. Por lo tanto, a través de la clave del índice del bloque, la clave de fila que se va a recuperar se puede ubicar con precisión en el bloque de datos y luego el bloque de datos se puede leer directamente en la memoria. Cabe señalar que los bloques de datos aquí ya son muy pequeños (el valor predeterminado es 64k, que es diferente de los bloques de datos en HDFS, que son 64M de forma predeterminada. Los bloques en el archivo hbase son mucho más pequeños. Esto es suficiente para El fragmento). se lee en la memoria y los datos se pueden recuperar iterando sobre el fragmento para obtener la clave de fila requerida, lo cual es muy rápido considerando que el fragmento aquí es de solo 64k. Es por eso que los bloques de datos de hfile deben ser tan pequeños.