sql >> Base de Datos >  >> NoSQL >> HBase

Indexación de correo electrónico con Cloudera Search y HBase

En mi publicación anterior, aprendió cómo indexar mensajes de correo electrónico en modo por lotes y casi en tiempo real, usando Apache Flume con MorphlineSolrSink. En esta publicación, aprenderá cómo indexar correos electrónicos usando Cloudera Search con Apache HBase y Lily HBase Indexer, mantenido por NGDATA y Cloudera. (Si no ha leído la publicación anterior, le recomiendo que lo haga antes de seguir leyendo).

El método casi en tiempo real que elija, HBase Indexer o Flume MorphlineSolrSink, dependerá completamente de su caso de uso, pero a continuación se presentan algunas cosas que debe considerar al tomar esa decisión:

  • ¿Es HBase un medio de almacenamiento óptimo para el caso de uso dado?
  • ¿Los datos ya se introdujeron en HBase?
  • ¿Existe algún patrón de acceso que requiera que los archivos se almacenen en un formato que no sea HFiles?
  • Si HBase no se está ejecutando actualmente, ¿habrá suficientes recursos de hardware para abrirlo?

Hay dos formas de configurar Cloudera Search para indexar documentos almacenados en HBase:alterar los archivos de configuración directamente e iniciar Lily HBase Indexer manualmente o como un servicio, o configurar todo usando Cloudera Manager. Esta publicación se centrará en este último, porque es, con mucho, la forma más fácil de habilitar la búsqueda en HBase, o cualquier otro servicio en CDH, para el caso.

Comprensión de la replicación HBase y el indexador Lily HBase

Al diseñar esta solución, Cloudera identificó cuatro requisitos principales para que la indexación de HBase sea efectiva:

  • La latencia de indexación debe ser casi en tiempo real (segundos) y ajustable
  • El índice Solr finalmente debe ser consistente con la tabla HBase mientras que las inserciones, actualizaciones y eliminaciones se aplican a HBase
  • El mecanismo de indexación debe ser escalable y tolerante a fallas
  • El proceso de indexación no puede ralentizar las escrituras de HBase

Para cumplir con estos requisitos, Cloudera Search utiliza el mecanismo de replicación nativo de HBase. Para aquellos que no están familiarizados con la replicación HBase, aquí hay un resumen breve y de muy alto nivel:

A medida que se aplican actualizaciones al registro de escritura anticipada (WAL), HBase RegionServer escucha estas actualizaciones en un subproceso separado. Cuando el búfer de ese subproceso se llena o llega al final del archivo, envía los lotes con todas las actualizaciones replicadas a un RegionServer par que se ejecuta en un clúster diferente. El WAL, por lo tanto, es esencial para que la indexación funcione.

Cloudera Search utiliza el mecanismo de replicación de HBase, que escucha los eventos de mutación de fila de HBase y, en lugar de enviar actualizaciones a un RegionServer diferente, las envía a Lily HBase Indexer. A su vez, Lily HBase Indexer aplica la lógica de transformación de Cloudera Morphlines, dividiendo los eventos en campos Solr y reenviándolos al servidor Apache Solr.

Hay ventajas importantes en el uso de la replicación de HBase frente a la implementación de la misma funcionalidad en los coprocesadores de HBase. En primer lugar, la replicación funciona en paralelo y de forma asíncrona con los datos que se incorporan a HBase. Por lo tanto, la indexación de Cloudera Search no agrega latencia ni inestabilidad operativa a la operación rutinaria de HBase. En segundo lugar, el uso del método de replicación permite realizar cambios sobre la marcha en la lógica de transformación. Por el contrario, para efectuar un cambio a través de la modificación del coprocesador se requiere reiniciar RegionServer, lo que haría que los datos no estuvieran disponibles para los usuarios de HBase. Quizás lo más importante es que la implementación de coprocesadores es bastante intrusiva y, si no se prueba correctamente, puede afectar el rendimiento de HBase.

Este flujo se ilustra a continuación:

Instalación de Cloudera Search e implementación de Lily HBase Indexer

Cloudera Manager descarga e implementa Cloudera Search como un paquete único automáticamente. Todo lo que tiene que hacer es hacer clic en el ícono "Paquetes" en la parte superior de navegación, elegir la versión de Solr y descargarla, distribuirla y activarla:

Como se mencionó anteriormente, Cloudera Search depende de la replicación de HBase y, por lo tanto, se habilitará a continuación. Active la replicación haciendo clic en Servicio HBase->Configuración->Copia de seguridad y asegurarse de que tanto "Habilitar replicación de HBase" como "Habilitar indexación" estén marcados. Si es necesario, guarde los cambios y reinicie el servicio HBase.

Para agregar Lily HBase Indexer, vaya a Servicios->Agregar servicio , elija "Keystore Indexer" y agréguelo, apuntándolo a la instancia de HBase que se usará para el procesamiento de correo electrónico:

Configuración de Solr

A continuación, configure Solr exactamente como se describe en la publicación anterior aquí.

  1. Genera un archivo de configuración schema.xml de muestra:
    $ solrctl --zk localhost:2181/solr \
    instancedir --generate $HOME/emailSearchConfig
    

  2. Edite el archivo schema.xml en $HOME/emailSearchConfig, con el archivo de configuración que definirá los campos relevantes para el procesamiento de correo electrónico. Se puede encontrar una copia completa del archivo en este enlace.
  3. Cargue las configuraciones de Solr en ZooKeeper:
    $ solrctl --zk localhost:2181/solr instancedir  \
    --create email_collection $HOME/emailSearchConfig
    

  4. Generar la colección Solr:
    $ solrctl --zk localhost:2181/solr collection  \
    --create email_collection -s 1
    

Registrar el indexador

Este paso es necesario para agregar y configurar el indexador y la replicación de HBase. El siguiente comando actualizará ZooKeeper y agregará myindexer como par de replicación para HBase. También insertará configuraciones en ZooKeeper, que Lily HBase Indexer usará para apuntar a la colección correcta en Solr.

$ hbase-indexer add-indexer -n myindexer -c indexer-config.xml  \
       -cp solr.zk=localhost:2181/solr  \
       -cp solr.collection=collection1

Argumentos:

  • -n myindexer:especifica el nombre del indexador que se registrará en ZooKeeper
  • -c indexer-config.xml:archivo de configuración que especificará el comportamiento del indexador
  • -cp solr.zk=localhost:2181/solr :especifica la ubicación de la configuración de ZooKeeper y Solr. Esto debe actualizarse con la ubicación específica del entorno de ZooKeeper.
  • -cp solr.collection=collection1:especifica qué colección actualizar. Recuerde el paso de Configuración de Solr donde creamos la colección 1.

El archivo index-config.xml es relativamente sencillo en este caso; todo lo que hace es especificar al indexador qué tabla mirar, la clase que se usará como mapeador (com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper) y la ubicación del archivo de configuración de Morphline. El tipo de asignación se establece en columna porque queremos obtener cada celda como un documento Solr individual. De forma predeterminada, el tipo de asignación se establece en fila , en cuyo caso el documento Solr se convierte en la fila completa.

Param name=”morphlineFile” especifica la ubicación del archivo de configuración de Morphlines. La ubicación podría ser una ruta absoluta de su archivo Morphlines, pero dado que está utilizando Cloudera Manager, especifique la ruta relativa:"morphlines.conf".

   
   


   
   

El contenido del archivo de configuración de hbase-indexer se puede encontrar en este enlace.

Para la referencia completa del comando hbase-indexer, es suficiente ejecutar el comando sin ningún argumento:

$ hbase-indexer

Usage: hbase-indexer 
where  an option from one of these categories:

TOOLS
  add-indexer
  update-indexer
  delete-indexer
  list-indexers

PROCESS MANAGEMENT
  server           run the HBase Indexer server node

REPLICATION (EVENT PROCESSING) TOOLS
  replication-status
  replication-wait

PACKAGE MANAGEMENT
  classpath        dump hbase CLASSPATH
  version          print the version

 or
  CLASSNAME        run the class named CLASSNAME
Most commands print help when invoked w/o parameters.

Configurar e iniciar el indexador Lily HBase

Si recuerda, cuando agregó Lily HBase Indexer, especificó la instancia de HBase con la que está asociado. Por lo tanto, no necesita hacer eso en este paso. Sin embargo, debe especificar la lógica de transformación de Morphlines que permitirá que este indexador analice los mensajes de correo electrónico y extraiga todos los campos relevantes.

Vaya a Servicios y elija Lily HBase Indexer que agregó anteriormente. Seleccione Configuraciones->Ver y editar->Todo el servicio->Morphlines . Copie y pegue el archivo morphlines.

La biblioteca de morphlines de correo electrónico realizará las siguientes acciones:

1.     Lea los eventos de correo electrónico de HBase con el comando extractHBaseCells
2. Divide el texto no estructurado en campos con el comando grok
3. Si falta Message-ID en el correo electrónico, grábelo con el comando generateUUID
4. Convierta la fecha/marca de tiempo en un campo que Solr entienda, con el comando convertTimestamp
5. Descarte todos los campos adicionales que no especificamos en schema.xml, con el comando sanitizeUknownSolrFields

El comando extractHBaseCells merece más atención, ya que es lo único diferente en la configuración de morfolíneas de HBase Indexer. Los parámetros son:

  • inputColumn:especifica las columnas a las que suscribirse (pueden ser comodines)
  • outputFied:el nombre del campo donde se envían los datos
  • tipo:el tipo del campo (es una cadena en el caso del cuerpo del correo electrónico)
  • fuente:podría ser valor o calificado; value especifica que el valor de la celda debe indexarse
extractHBaseCells {
       mappings : [
        {
          inputColumn : "messages:*"
          outputField : "message"
          type : string
          source : value
          }
        ]
      }

Descargue una copia de este archivo de morfolinas desde aquí.

Una nota importante es que Lily HBase Indexer generará automáticamente el campo de identificación. Esa configuración se puede configurar en el archivo index-config.xml anterior especificando el atributo de campo de clave única. Es una buena práctica dejar el nombre predeterminado de id. Como no se especificó en el archivo xml anterior, se generó el campo de id predeterminado y será una combinación de RowID-Column Family-Column Name.

En este punto, guarde los cambios e inicie Lily HBase Indexer desde Cloudera Manager.

Configuración de la tabla de bandeja de entrada en HBase

Hay muchas formas de crear la tabla en HBase mediante programación (API de Java, API REST o un método similar). Aquí utilizará el shell de HBase para crear la tabla de la bandeja de entrada (usando intencionalmente un nombre de familia de columna descriptivo para facilitar el seguimiento). En las aplicaciones de producción, el nombre de familia siempre debe ser corto, ya que siempre se almacena con cada valor como parte de una clave de celda. El siguiente comando hará eso y habilitará la replicación en una familia de columnas llamada "mensajes":

hbase(main):003:0>  create 'inbox', {NAME => 'messages', REPLICATION_SCOPE => 1}

Para verificar que la tabla se creó correctamente, ejecute el siguiente comando:

hbase(main):003:0> describe 'inbox'
DESCRIPTION                                                                ENABLED
 {NAME => 'inbox', FAMILIES => [{NAME => 'messages', DATA_BLOCK_ENCODING => ' true
 NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '1', VERSIONS => '3',
 COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2147483647', KEEP_DEL
 ETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', ENCODE
 _ON_DISK => 'true', BLOCKCACHE => 'true'}]}

Desde este punto, cualquier correo electrónico colocado en la tabla "bandeja de entrada" en la familia de columnas "mensajes" activará un evento para Lily HBase Indexer, que procesará el evento, lo dividirá en campos y lo enviará a Solr para su indexación.

El esquema de la tabla de la bandeja de entrada es simple:el ID de la fila es el nombre de la persona a la que pertenece esta bandeja de entrada. Cada celda es un mensaje individual y la columna es un ID entero único. A continuación se muestra una instantánea de una tabla de muestra tal como se muestra en la interfaz HBase de Hue:

Acceso a los datos

Tiene la opción de muchas herramientas visuales para acceder a los correos electrónicos indexados. Hue y Solr GUI son muy buenas opciones. HBase también permite una serie de técnicas de acceso, no solo desde una GUI, sino también a través del shell de HBase, la API e incluso técnicas de secuencias de comandos simples.

La integración con Solr le brinda una gran flexibilidad y también puede proporcionar opciones de búsqueda muy simples y avanzadas para sus datos. Por ejemplo, configurar el archivo schema.xml de Solr de modo que todos los campos dentro del objeto de correo electrónico se almacenen en Solr permite a los usuarios acceder al cuerpo completo del mensaje a través de una búsqueda simple, con el compromiso de espacio de almacenamiento y complejidad informática.

Alternativamente, puede configurar Solr para almacenar solo una cantidad limitada de campos, como la identificación, el remitente y el asunto. Con estos elementos, los usuarios pueden buscar rápidamente en Solr y recuperar los ID del mensaje que, a su vez, se pueden usar para recuperar el mensaje completo de HBase.

El siguiente ejemplo almacena solo el ID del mensaje en Solr pero indexa todos los campos dentro del objeto de correo electrónico. La búsqueda de Solr en este escenario recupera ID de correo electrónico, que luego puede usar para consultar HBase. Este tipo de configuración es ideal para Solr, ya que mantiene bajos los costos de almacenamiento y aprovecha al máximo las capacidades de indexación de Solr.

El siguiente script de shell emite una consulta a Solr Rest API para una palabra clave "productId" y devuelve el campo "id" en formato CSV. El resultado es una lista de ID de documentos que coinciden con la consulta. Luego, la secuencia de comandos recorre los identificadores y los divide en identificador de fila, familia de columnas y nombre de columna, que se utilizan para acceder a HBase a través de la API REST de HBase estándar.

#!/bin/bash

#  Query SOLR and return the id field for every document
#  that contains the word resign
query_resp=$(curl -s 'http://spark:8983/solr/collection1_shard1_replica1/select?q=productId&fl=id&wt=csv')

# Loop through results of the previous command,
# and use the id to retrieve the cells from HBase via the HBase REST API
for i in  $query_resp
do
            if [ "$i" != "id" ]; then
            cmd=$(echo $i |awk -F'-' '{print "curl -s http://spark:20550/inbox/" $1 "/" $2 ":"  $3}')
            $cmd -H "Accept: application/x-protobuf "
            fi
done

Conclusión

En esta publicación, ha visto lo fácil que es indexar correos electrónicos que están almacenados en HBase, casi en tiempo real y de forma completamente no intrusiva para el flujo principal de HBase. En resumen, tenga en cuenta estos pasos principales:

  • Habilitar replicación en HBase
  • Configurar correctamente Lily HBase Indexer
  • Use Morphlines en Lily HBase Indexer para ayudar con las transformaciones (¡no se requiere codificación!)

Si has tenido la oportunidad de leer el post anterior, puedes ver que el archivo morphlines.conf es prácticamente idéntico en los tres casos. Esto significa que es muy fácil hacer crecer los casos de uso de búsqueda en el ecosistema de Hadoop. Si los datos ya están en HDFS, utilice MapReduceIndexerTool para indexarlos. Si los datos llegan a través de Flume, use SolrMorphlineSink con un archivo de morphlines idéntico. Si luego decide que HBase se ajusta al caso de uso, solo se requiere un cambio mínimo para comenzar a indexar celdas en HBase:simplemente agregue el comando extractHBaseCells al archivo morphlines.

Aunque este ejemplo se concentra en los correos electrónicos como caso de uso, este método se puede aplicar en muchos otros escenarios donde HBase se usa como una capa de almacenamiento y acceso. Si su empresa ya usa HBase para un caso de uso específico, considere implementar Cloudera Search además. No requiere codificación y realmente puede abrir los datos a una audiencia mucho más amplia en la organización.

Jeff Shmain es arquitecto de soluciones en Cloudera.