Exploración del índice secundario de Phoenix

Phoenix Secondary Index Exploration

Información de versión:

  • HDP -> 3.0.0
  • Hadoop -> 3.0.1
  • HBase -> 2.0.0
  • Fénix -> 5.0.0

HBASE Es una implementación de código abierto de Google-Bigtable, un sistema de almacenamiento distribuido orientado a columnas construido sobre HDFS. HBase es una base de datos no relacional y no es compatible con SQL, por lo que usamos FÉNIX . Phoenix es una capa SQL construida en HBase que nos permite crear tablas, insertar datos y consultar datos de HBase utilizando las API de JDBC estándar en lugar de las API de cliente de HBase, y Phoenix también proporciona tecnología de indexación secundaria que nos permite. -consultas de teclas.



Índice secundario

Phoenix clasifica las teclas de fila, por lo que cuando consulta en función de la tecla de fila, la velocidad es muy rápida. Al diseñar la clave de fila, bajo el principio de garantizar el hash y la unicidad, las condiciones de consulta comúnmente utilizadas generalmente se diseñan en la clave de fila, pero la clave de fila tiene un cierto límite de longitud y es imposible poner todas las condiciones de la consulta en la clave de fila. Por tanto, se puede utilizar un índice secundario. Después de crear un índice para una tabla de negocios, el campo de índice se almacena de forma redundante en la ubicación de la clave de fila en HBase, por lo que el índice puede escanear el alcance para evitar el escaneo completo de la tabla, lo que mejora en gran medida la velocidad de consulta. Una mesa de negocios puede crear hasta 10 índices de forma predeterminada. Se asigna a 10 tablas de índice en Phoenix. Si hay más de 10 índices, lanzará una excepción si lo crea. java.sql.SQLException: ERROR 1047 (43A04): Too many indexes have already been created on the physical table. tableName=DMP.DMP_INDEX_TEST . El plan de ejecución seleccionará un índice óptimo de todos los índices para usar al ejecutar la consulta, es decir, solo se usará un índice por consulta. El índice se puede dividir en mutable con immutable , El valor predeterminado es mutable Puede declararse creando una mesa de negocios IMMUTABLE_ROWS=true Para crear una tabla inmutable, el índice creado por esta tabla inmutable también es inmutable, está dirigido a only written once and never updated La escena, la escena actual de la empresa no está involucrada, ya no se discute en detalle, las siguientes son para mutable Para hacer la consulta. Los índices variables se pueden dividir en índices de cobertura, índices locales, índices globales, etc. Para admitir índices variables, necesita hbase-site.xml Aumente la configuración.



Configuración hbase-site.xml Apoyar mutable índice

|_+_|

Índice local

Los objetivos de indexación local escriben casos de uso pesados ​​y con limitaciones de espacio. Al igual que con los índices globales, Phoenix seleccionará automáticamente si usar o no un índice local en el momento de la consulta. Con índices locales, los datos de índice y de tabla conviven en el mismo servidor, lo que evita cualquier sobrecarga de la red durante las escrituras. Los índices locales se pueden usar incluso cuando la consulta no está completamente cubierta (es decir, Phoenix recupera automáticamente las columnas que no están en el índice a través del punto de comparación con la tabla de datos). A diferencia de los índices globales, todos los índices locales de una tabla se almacenan en una única tabla compartida separada antes de la versión 4.8.0. Desde 4.8.0 en adelante, estamos almacenando todos los datos del índice local en las familias de columnas de sombra separadas en la misma tabla de datos. En el momento de la lectura cuando se utiliza el índice local, cada región debe examinarse en busca de datos, ya que la ubicación exacta de la región de los datos del índice no puede predeterminarse. Por lo tanto, se produce algo de sobrecarga en el tiempo de lectura.



Los índices locales son adecuados para escenarios con escrituras frecuentes y espacio de almacenamiento limitado. Al igual que los índices globales, Phoenix elige automáticamente si usar índices locales al realizar consultas. Usando índices locales, los datos de índice y de tabla se escribirán en el mismo <property> <name>hbase.regionserver.wal.codecname> <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodecvalue> property> Up, evitando así la sobrecarga de la red durante la escritura. Incluso si el índice local no cubre completamente todos los campos de la tabla de negocios, el índice se utilizará en el momento de la consulta (Phoenix recuperará automáticamente los campos fuera del índice y obtendrá los datos consultando la tabla de negocios). A diferencia de los índices globales, antes de la versión 4.8.0, todos los índices locales para las tablas de negocios se almacenaban en una tabla compartida separada. Después de la versión 4.8.0, todos los datos del índice local se almacenan en una familia de columnas separada de la misma tabla de negocios. Al leer datos utilizando un índice local, la posición del área exacta de los datos del índice no se puede determinar de antemano, lo que tiene cierta influencia en la velocidad de lectura.

Almacén de datos indexado localmente

Crear Region Servers Mesa de negocios

crear tabla dmp.dmp_index_test (id varchar no nula clave primaria, nombre varchar, edad varchar, sex varchar, addr varchar)



Insertar datos

insertar en los valores dmp.dmp_index_test ('id01', 'nombre01', 'edad01', 'sex01', 'addr01')

Crea un índice local

crear índice local index_local_test_name en dmp.dmp_index_test (nombre)

Ver datos en HBase

Después de 4.8, los datos del índice local se almacenan en una familia de columnas específica de la misma tabla de negocios. El valor predeterminado es dmp.dmp_index_test . En algunos casos, el uso del comando Phoenix para eliminar un índice local se agotará, puede elegir L#0 Ejecución hbase shell Comando para forzar la eliminación del índice. Este proceso debe realizarse primero en la mesa de negocios. alter 'DMP.DMP_INDEX_TEST', {NAME => 'L#0', METHOD => 'delete'} Operación, la operación se completa y luego se ejecuta disable operando.

Si el índice local golpea

Compruebe si el índice coincide, puede utilizar enable Para ver el plan de ejecución, aquí hay algunas explicaciones del plan de ejecución:

  • CLIENTE: indica si la operación se realiza en el lado del cliente o en el lado del servidor. El cliente intenta devolver menos datos. Si explain Indica ejecución en el lado del servidor.

  • FILTRO POR expresión: devuelve el resultado que coincide con los criterios del filtro.

  • FULL SCAN OVER tableName: indica que una tabla completa escanea una tabla de negocios.

  • RANGE SCAN OVER tableName [...]: indica que el rango representativo explora una tabla con paréntesis que representan el inicio y el final de la clave de fila.

  • ROUND ROBIN - Cuando no hay operación ORDER BY, ROUND ROBIN representa la paralelización del cliente maximizado.

  • x-CHUNK: la cantidad de subprocesos que hacen esto.

  • PARALLEL x-WAY: indica cuántas exploraciones paralelas se fusionan.

  • EST_BYTES_READ: el número total de bytes que se espera escanear cuando se ejecuta la consulta.

  • EST_ROWS_READ: cuántas filas se espera escanear cuando se ejecuta la consulta.

  • EST_INFO_TS - recopilar información de consulta SERVER

El campo de consulta de índice local no está en la columna de índice y también usará el índice

Crea un índice de cobertura

crear índice local index_local_include_test_one en dmp.dmp_index_test (edad) incluir (sexo)

Iremos a ver HBase en este momento, podemos ver la familia de columnas de índice. epoch time Almacenamiento redundante L#0 Campo

Anular el índice puede evitar que la condición de consulta se indexe en la columna sin utilizar el índice. Solo cuando la condición de consulta no esté en la columna de índice o en la columna de superposición, se realizará el escaneo completo de la tabla.

Puede crear un índice compuesto para resolver múltiples aciertos de índices de consultas condicionales. El primer campo del índice compuesto debe estar en la condición de consulta.

resumen

El índice local no es compatible con la tabla de depósitos. No hay mantenimiento de tabla por separado en HBase. En Phoenix, habrá un mapeo de tabla de índice. Cuando se realiza la operación de escritura, los datos se almacenan localmente y no se realiza ninguna E / S de red adicional cuando se realiza la operación de lectura, el índice se escanea de acuerdo con el rango de condiciones del índice y se implementa una consulta rápida si el espacio lo permite, una cobertura Se puede crear un índice para evitar que se cambie la condición del índice. Omitido. El escenario aplicable es la escritura frecuente.

Índice global

Los objetivos de indexación global leen casos de uso intensivo. Con los índices globales, todas las penalizaciones de rendimiento de los índices se producen en el momento de la escritura. Interceptamos las actualizaciones de la tabla de datos al escribir (DELETE, UPSERT VALUES y UPSERT SELECT), construimos la actualización del índice y luego enviamos las actualizaciones necesarias a todas las tablas de índice interesadas. En el momento de la lectura, Phoenix seleccionará la tabla de índice a utilizar que producirá el tiempo de consulta más rápido y la escaneará directamente como cualquier otra tabla HBase. De forma predeterminada, a menos que se indique, no se utilizará un índice para una consulta que haga referencia a una columna que no forma parte del índice.

Los índices globales son adecuados para escenas leídas con frecuencia. Para los índices globales, todo el consumo de rendimiento ocurre al escribir, todas las operaciones de actualización en la tabla de negocios (DELETE, UPSERT VALUES y UPSERT SELECT) harán que el índice se actualice y el índice se distribuya en diferentes nodos, entre nodos La transmisión de datos aporta un gran consumo de rendimiento. Al leer datos, Phoenix elige el índice más rápido y lo escanea como una tabla HBase normal en lugar de escanear la tabla de negocios. De forma predeterminada, no se especifica ningún índice obligatorio y, si el campo de la consulta no está en la columna indexada, el índice no se utilizará en este caso.

Almacenamiento de datos indexados global

Crear include Mesa de negocios

crear tabla dmp.dmp_index_test (id varchar no nula clave primaria, nombre varchar, edad varchar, sex varchar, addr varchar)

Insertar datos

insertar en los valores dmp.dmp_index_test ('id01', 'nombre01', 'edad01', 'sex01', 'addr01')

Crea un índice global

  • crear índice index_global_test_name en dmp.dmp_index_test (nombre)

  • crear índice index_global_test_include_name en dmp.dmp_index_test (nombre) include (edad)

Ver datos en HBase

Se puede ver que para el índice global, habrá una tabla separada en HBase para mantener el índice. Por lo tanto, cuando la consulta llega al índice, el rango explora la tabla de índice de acuerdo con la condición de la consulta y no explora la tabla de datos de servicio. .

Si el índice global golpea

El campo de consulta de índice global no creó un índice, pero se utilizó dmp.dmp_index_test La palabra clave almacena el valor de este campo, luego el índice puede acertar.

El campo de consulta de índice global no creó un índice y no se usó include Las palabras clave cubren este campo, pueden pasar include El comando fuerza el uso del índice, pero está claro que después de filtrar la condición del filtro, el conjunto de resultados no es grande; de ​​lo contrario, provocará un escaneo completo de la tabla.

Con una consulta de varias condiciones, puede crear un índice compuesto, el primer campo del índice combinado debe ser una condición de consulta; de lo contrario, puede conducir a un escaneo completo de la tabla.

crear índice index_global_test_mutil en dmp.dmp_index_test (nombre, edad, sexo) include (addr)

resumen

El índice global admite la tabla de cubos. De forma predeterminada, se utiliza la misma regla de agrupamiento que la tabla de negocios. HBase tiene un mantenimiento de tabla de índice único y separado. Por lo tanto, durante la operación de escritura, puede haber E / S de red entre cada servidor de región. Es más consumible, por lo que es adecuado para escenarios con múltiples lecturas y escrituras. Cuando el índice global está en la consulta, en realidad es para verificar directamente la tabla de índices. Si el campo de consulta no crea un índice y desea utilizar el índice, puede utilizar /* + INDEX(TableName MyIndexName)*/ La palabra clave anula este campo y el valor de este campo se almacena de forma redundante, lo que ocupa espacio adicional, pero puede garantizar el índice de aciertos, o utilice include El comando fuerza el uso de un índice, que es adecuado para situaciones en las que el conjunto de resultados se devuelve menos, evitando escaneos completos de tablas.

Índice asincrónico

De forma predeterminada, cuando se crea un índice, se completa sincrónicamente durante la llamada CREATE INDEX. Esto puede no ser factible dependiendo del tamaño actual de la tabla de datos. A partir de 4.5, el llenado inicial de un índice se puede realizar de forma asincrónica al incluir la palabra clave ASYNC en la declaración DDL de creación del índice. El trabajo de reducción del mapa que llena la tabla del índice debe iniciarse por separado a través de la línea de comando de HBase

De forma predeterminada, cuando se crea un índice, los datos del índice se completan sincrónicamente durante la ejecución de CREATE INDEX. Para mesas pequeñas, esto se puede hacer. Si tiene una tabla grande, el índice se agotará. A partir de 4.5, puede usarlo al crear un índice /* + INDEX(TableName MyIndexName)*/ La palabra clave completa el llenado de los datos del índice de forma asincrónica. El estado del índice una vez completada la creación es ASYNC Debe iniciarse por separado a través de la línea de comando de HBase BUILDING La tarea consiste en completar el trabajo de llenado de datos de índice. Una vez que la tarea de MR se ha ejecutado correctamente, el estado del índice de la vista cambia a map reduce para que el índice se pueda utilizar normalmente.

Crea un índice asincrónico

En nuestro escenario empresarial real, en muchos casos, un índice se personaliza para una tabla de negocios de acuerdo con los requisitos. En este momento, el volumen de datos de la tabla de negocios es muy grande y la creación del índice síncrono definitivamente expirará. En este momento, se puede crear un índice asincrónico. resuelve este problema.

crear índice index_global_test_async en dmp.dmp_index_test (nombre) include (edad) ASYNC

Inicie la tarea de MR, complete el llenado de datos y la activación del índice

Antes de ejecutar el comando HBase, asegúrese de que el usuario actual tenga permisos para HBase y las tablas que se utilizan. ACTIVE Cambiar a su - hbase Usuario, luego ejecute el comando correspondiente. En nuestro entorno, porque está habilitado Kerberos , por lo que antes de ejecutar el comando, primero debe ejecutar hbase El comando completa la autenticación del usuario y luego ejecuta el comando HBase para enviar la tarea MR. Si el entorno también administra permisos para YARN, entonces se requiere la herramienta de autorización para otorgar el permiso para enviar la tarea MR. kinit usuario.

Autenticación de usuario Kerberos

kinit -kt /path/hbase.headless.keytab [correo electrónico protegido]

Inicie la tarea de MR con el comando HBase

HADOOP_CLASSPATH = '/ etc / hbase / conf' hadoop jar /path/phoenix/phoenix-client.jar org.apache.phoenix.mapreduce.index.IndexTool --schema DMP --data-table DMP_INDEX_TEST --index-table INDEX_GLOBAL_TEST_ASYNC -ruta-de-salida / hbase-backup2

Una vez completada la tarea de MR, el estado de la tabla de índice de vista ha cambiado a hbase En este punto, la tabla de índice está habilitada.

Cree un índice asincrónico sin realizar una tarea de MR

La tarea MR se ejecuta con éxito y el estado del índice es ACTIVE

Herramienta de índice de Pit of Phoenix

En el sitio web de Phoenix, el comando para iniciar la tarea de MR es

|_+_|

Este comando se utiliza ACTIVE , existe en este paquete $ {HBASE_HOME} / bin / hbase org.apache.phoenix.mapreduce.index.IndexTool --schema MY_SCHEMA --data-table MY_TABLE --index-table ASYNC_IDX --output-path ASYNC_IDX_HFILES El conflicto de dependencia, por lo que el uso de este comando para iniciar la tarea de MR dará como resultado un error: phoenix-server.jar , por lo que debe utilizarlo al iniciar la tarea de RM. commons-cli Comando, especifique uso Exception in thread 'main' java.lang.NoClassDefFoundError: org/apache/commons/cli/DefaultParser La tarea se envió y ejecutó correctamente. Este problema es PHOENIX-4880 con HBASE-20201 También hay instrucciones más detalladas, que se pueden resolver consultando la descripción en Seguimiento de problemas.

para resumir

Phoenix ofrece una variedad de tecnologías de indexación. $ hadoop jar $PHOENIX_HOME/phoenix-*client.jar org.apache.phoenix.mapreduce.index.IndexTool Almacenamiento redundante de valores de valor, utilizando el espacio para cambiar la velocidad, ahorrando tiempo cuando las consultas devuelven resultados. phoenix-client.jar Menor pérdida de rendimiento de escritura para escenas con escrituras frecuentes, Covered Indexes Mantenga una tabla de índice por separado y devuelva el conjunto de resultados directamente escaneando la tabla de índice. Es adecuado para escenas de uso frecuente. Este artículo explora varios índices de uso común y cómo ver si llegan al índice. Por supuesto, Phoenix tiene una combinación más complicada y sigue las reglas básicas de indexación de una sola tabla. El modo de consulta flexible de Phoenix, ya sea el límite del número de índices o el impacto del mecanismo de indexación, será ligeramente insuficiente y no es compatible con consultas OLAP de una gran cantidad de tipos de escaneo. El índice de Phoenix también tiene sus propios escenarios adecuados y ventajas y desventajas. De acuerdo con los escenarios comerciales reales y los requisitos de consulta, la selección razonable y el índice de diseño, Phoenix puede estar bien satisfecho.

Preguntas y respuestas

  • Cree un índice local de forma asincrónica y utilice uno personalizado Local Indexes , usando IndexTool para informar un error Global Indexes

    Usar personalizado schema Crea un índice asincrónico, actualmente solo crea un índice global. Use default Error: java.lang.RuntimeException: org.apache.phoenix.schema.TableNotFoundException: ERROR 1012 (42M03) Se pueden admitir índices locales e índices globales. La solución específica, la comunidad aún no ha respondido.

  • Verifique el índice del plan de ejecución, ¿por qué el tiempo de ejecución es tan largo?

    No existe una relación proporcional absoluta entre el índice de acierto y el tiempo de ejecución. Está determinada por las condiciones reales de la consulta. A veces, el índice golpea, pero la condición de consulta no filtra la mayoría de los datos. Si va a la tabla de negocios de escaneo de rango en este momento, lleva mucho tiempo, incluso más lento que los escaneos de tabla completa, así que asegúrese de usar el índice para filtrar la mayoría de los datos al diseñar el índice.

  • ¿Por qué usar una mesa de cubo?

    Para evitar escrituras en puntos de acceso de HBase, Phoenix hace que la carga del servidor esté desequilibrada, proporcionando así una forma de personalizar el depósito. schema Consiste en usar el prefijo de la clave de salazón en la clave de fila para evitar que la clave de fila no se haga hash, lo que da como resultado problemas candentes, que se pueden declarar al crear la tabla de negocios. schema Atributos para agrupar la tabla, luego de que se crea la tabla, habrá x Regiones de tabla con hash en diferentes Servidores de región, y el valor de x es generalmente 1 ~ 256.

referencia

https://mp.weixin.qq.com/s/7bg1hu7LI9m7KbXAt-SN2Q

https://blog.csdn.net/gaoshui87/article/details/52381927

https://blog.csdn.net/maomaosi2009/article/details/45619679

https://phoenix.apache.org/index.html

https://sematext.com/blog/hbasewd-avoid-regionserver-hotspotting-despite-writing-records-with-sequential-keys/