No meu post anterior, você aprendeu como indexar mensagens de e-mail em modo batch e quase em tempo real, usando Apache Flume com MorphlineSolrSink. Neste post, você aprenderá como indexar e-mails usando Cloudera Search com Apache HBase e Lily HBase Indexer, mantido pela NGDATA e Cloudera. (Se você não leu o post anterior, eu recomendo que você faça isso antes de continuar lendo.)
Qual método quase em tempo real escolher, HBase Indexer ou Flume MorphlineSolrSink, dependerá inteiramente do seu caso de uso, mas abaixo estão algumas coisas a serem consideradas ao tomar essa decisão:
- O HBase é um meio de armazenamento ideal para o caso de uso específico?
- Os dados já foram ingeridos no HBase?
- Existe algum padrão de acesso que exija que os arquivos sejam armazenados em um formato diferente de HFiles?
- Se o HBase não estiver em execução, haverá recursos de hardware suficientes para ativá-lo?
Existem duas maneiras de configurar o Cloudera Search para indexar documentos armazenados no HBase:alterar os arquivos de configuração diretamente e iniciar o Lily HBase Indexer manualmente ou como um serviço, ou configurar tudo usando o Cloudera Manager. Esta postagem se concentrará no último, porque é de longe a maneira mais fácil de habilitar a Pesquisa no HBase — ou qualquer outro serviço no CDH, nesse caso.
Compreendendo a replicação do HBase e o Lily HBase Indexer
Ao projetar esta solução, a Cloudera identificou quatro requisitos principais para tornar a indexação do HBase eficaz:
- A latência de indexação deve ser em tempo quase real (segundos) e ajustável
- O Índice Solr deve eventualmente ser consistente com a tabela HBase enquanto inserções, atualizações e exclusões são aplicadas ao HBase
- O mecanismo de indexação deve ser escalável e tolerante a falhas
- O processo de indexação não pode desacelerar as gravações do HBase
Para atender a esses requisitos, o Cloudera Search usa o mecanismo de replicação nativo do HBase. Para aqueles que não estão familiarizados com a replicação do HBase, aqui está um resumo breve e de alto nível:
À medida que as atualizações são aplicadas ao log de gravação antecipada (WAL), o HBase RegionServer escuta essas atualizações em um encadeamento separado. Quando o buffer desse encadeamento é preenchido ou atinge o final do arquivo, ele envia os lotes com todas as atualizações replicadas para um RegionServer de mesmo nível em execução em um cluster diferente. O WAL, portanto, é essencial para que a indexação funcione.
O Cloudera Search usa o mecanismo de replicação do HBase, que escuta eventos de mutação de linha do HBase e, em vez de enviar atualizações para um RegionServer diferente, as envia para o Lily HBase Indexer. Por sua vez, o Lily HBase Indexer aplica a lógica de transformação Cloudera Morphlines, dividindo os eventos em campos Solr e encaminhando-os para o Apache Solr Server.
Há grandes vantagens em usar a replicação do HBase em relação à implementação da mesma funcionalidade nos coprocessadores HBase. Primeiro, a replicação funciona em paralelo e de forma assíncrona com os dados sendo ingeridos no HBase. Portanto, a indexação do Cloudera Search não adiciona latência ou instabilidade operacional à operação de rotina do HBase. Em segundo lugar, o uso do método de replicação permite alterações rápidas e contínuas na lógica de transformação. Por outro lado, para efetuar uma alteração por meio da modificação do coprocessador, é necessário reiniciar o RegionServer, o que tornaria os dados indisponíveis para os usuários do HBase. Talvez o mais importante seja que a implementação de coprocessadores é bastante intrusiva e, se não for testada corretamente, pode interromper o desempenho do HBase.
Este fluxo é ilustrado abaixo:
Instalação do Cloudera Search e implantação do Lily HBase Indexer
O Cloudera Manager baixa e implanta o Cloudera Search como um único pacote automaticamente. Tudo o que você precisa fazer é clicar no ícone “Pacotes” na navegação superior, escolher a versão do Solr e baixá-la, distribuí-la e ativá-la:
Como mencionado anteriormente, o Cloudera Search depende da replicação do HBase e, portanto, isso será ativado em seguida. Ative a replicação clicando em Serviço HBase->Configuração->Backup e garantir que “Ativar replicação do HBase” e “Ativar indexação” estejam marcados. Se necessário, salve as alterações e reinicie o serviço HBase.
Para adicionar o Lily HBase Indexer, vá para Serviços->Adicionar serviço , escolha “Keystore Indexer” e adicione-o, apontando-o para a instância do HBase que será usada para processamento de e-mail:
Configurando o Solr
Em seguida, configure o Solr exatamente como descrito no post anterior aqui.
- Gere um arquivo de configuração schema.xml de amostra:
$ solrctl --zk localhost:2181/solr \ instancedir --generate $HOME/emailSearchConfig
- Edite o arquivo schema.xml em $HOME/emailSearchConfig, com o arquivo de configuração que definirá os campos relevantes ao processamento de e-mail. Uma cópia completa do arquivo pode ser encontrada neste link.
- Faça upload das configurações do Solr para o ZooKeeper:
$ solrctl --zk localhost:2181/solr instancedir \ --create email_collection $HOME/emailSearchConfig
- Gere a coleção Solr:
$ solrctl --zk localhost:2181/solr collection \ --create email_collection -s 1
Registrando o Indexador
Esta etapa é necessária para adicionar e configurar o indexador e a replicação do HBase. O comando abaixo atualizará o ZooKeeper e adicionará myindexer como um peer de replicação para o HBase. Ele também inserirá configurações no ZooKeeper, que o Lily HBase Indexer usará para apontar para a coleção correta no 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 o nome do indexador que será registrado no ZooKeeper
- -c indexer-config.xml – arquivo de configuração que especificará o comportamento do indexador
- -cp solr.zk=localhost:2181/solr – especifica o local da configuração do ZooKeeper e do Solr. Isso deve ser atualizado com a localização específica do ambiente do ZooKeeper.
- -cp solr.collection=collection1 – especifica qual coleção atualizar. Lembre-se da etapa de configuração do Solr em que criamos a coleção1.
O arquivo index-config.xml é relativamente direto neste caso; tudo o que ele faz é especificar para o indexador qual tabela examinar, a classe que será usada como mapeador (com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper) e a localização do arquivo de configuração do Morphline. O tipo de mapeamento está definido como coluna porque queremos obter cada célula como um documento Solr individual. Por padrão, o tipo de mapeamento é definido como linha , caso em que o documento Solr se torna a linha completa.
Param name=”morphlineFile” especifica a localização do arquivo de configuração do Morphlines. A localização pode ser um caminho absoluto do seu arquivo Morphlines, mas como você está usando o Cloudera Manager, especifique o caminho relativo:“morphlines.conf”.
O conteúdo do arquivo de configuração do hbase-indexer pode ser encontrado neste link.
Para a referência completa do comando hbase-indexer, é suficiente executar o comando sem nenhum argumento:
$ hbase-indexer Usage: hbase-indexerwhere 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.
Configurando e iniciando o Lily HBase Indexer
Se você se lembra, quando adicionou o Lily HBase Indexer, você especificou a instância do HBase à qual ele está associado. Portanto, você não precisa fazer isso nesta etapa. No entanto, você precisa especificar a lógica de transformação Morphlines que permitirá que esse indexador analise mensagens de email e extraia todos os campos relevantes.
Vá para Serviços e escolha Lily HBase Indexer que você adicionou anteriormente. Selecione Configurações->Visualizar e Editar->Serviço-Wide->Morphlines . Copie e cole o arquivo morphlines.
A biblioteca de morfinas de e-mail executará as seguintes ações:
1. Leia os eventos de e-mail do HBase com o comando extractHBaseCells
2. Divida o texto não estruturado em campos com o comando grok
3. Se Message-ID estiver faltando no email, gere-o com o comando generateUUID
4. Converta a data/timestamp em um campo que o Solr entenda, com o comando convertTimestamp
5. Elimine todos os campos extras que não especificamos no schema.xml, com o comando repairUknownSolrFields
O comando extractHBaseCells merece mais atenção, pois é a única diferença na configuração de morphlines do HBase Indexer. Os parâmetros são:
- inputColumn – especifica colunas nas quais se inscrever (pode ser curinga)
- outputFied – o nome do campo para onde os dados são enviados
- tipo – o tipo do campo (é uma string no caso do corpo do email)
- fonte – pode ser valor ou qualificado; value especifica que o valor da célula deve ser indexado
extractHBaseCells { mappings : [ { inputColumn : "messages:*" outputField : "message" type : string source : value } ] }
Baixe uma cópia deste arquivo morphlines aqui.
Uma observação importante é que o campo id será gerado automaticamente pelo Lily HBase Indexer. Essa configuração é configurável no arquivo index-config.xml acima, especificando o atributo unique-key-field. É uma prática recomendada deixar o nome padrão de id — como não foi especificado no arquivo xml acima, o campo id padrão foi gerado e será uma combinação de RowID-Column Family-Column Name.
Neste ponto, salve as alterações e inicie o Lily HBase Indexer no Cloudera Manager.
Configurando a tabela de caixa de entrada no HBase
Há muitas maneiras de criar a tabela no HBase programaticamente (API Java, API REST ou um método semelhante). Aqui você usará o shell do HBase para criar a tabela de caixa de entrada (intencionalmente usando um nome de família de colunas descritivo para facilitar o acompanhamento). Em aplicativos de produção, o nome da família deve ser sempre curto, pois sempre é armazenado com todos os valores como parte de uma chave de célula. O comando a seguir fará isso e habilitará a replicação em uma família de colunas chamada “messages”:
hbase(main):003:0> create 'inbox', {NAME => 'messages', REPLICATION_SCOPE => 1}
Para verificar se a tabela foi criada corretamente execute o seguinte 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'}]}
A partir deste ponto, qualquer e-mail colocado na tabela “caixa de entrada” na família de colunas “mensagens” acionará um evento para o Lily HBase Indexer, que processará o evento, o dividirá em campos e o enviará ao Solr para indexação.
O esquema da tabela de caixa de entrada é simples:O ID da linha é o nome da pessoa a quem esta caixa de entrada pertence. Cada célula é uma mensagem individual com a coluna sendo um ID inteiro exclusivo. Abaixo está um instantâneo de uma tabela de amostra exibida pela interface HBase do Hue:
Acessando os dados
Você tem a opção de muitas ferramentas visuais para acessar os e-mails indexados. Hue e Solr GUI são opções muito boas. O HBase também permite várias técnicas de acesso, não apenas a partir de uma GUI, mas também por meio do shell do HBase, API e até mesmo técnicas de script simples.
A integração com o Solr oferece grande flexibilidade e também pode fornecer opções de pesquisa muito simples e avançadas para seus dados. Por exemplo, configurar o arquivo schema.xml do Solr de forma que todos os campos dentro do objeto de e-mail sejam armazenados no Solr permite que os usuários acessem corpos de mensagem completos por meio de uma pesquisa simples, com a compensação de espaço de armazenamento e complexidade de computação.
Como alternativa, você pode configurar o Solr para armazenar apenas um número limitado de campos, como id, remetente e assunto. Com esses elementos, os usuários podem pesquisar rapidamente o Solr e recuperar os IDs da mensagem que, por sua vez, podem ser usados para recuperar a mensagem completa do próprio HBase.
O exemplo abaixo armazena apenas o ID da mensagem no Solr, mas indexa todos os campos dentro do objeto de email. A pesquisa do Solr neste cenário recupera IDs de email, que você pode usar para consultar o HBase. Esse tipo de configuração é ideal para o Solr, pois mantém os custos de armazenamento baixos e aproveita ao máximo os recursos de indexação do Solr.
O script de shell abaixo emite uma consulta à API Solr Rest para uma palavra-chave “productId” e retorna o campo “id” no formato CSV. O resultado é uma lista de IDs de documentos que correspondem à consulta. O script então percorre os ids e os divide em Row Id, Column Family e Column Name, que são usados para acessar o HBase por meio da API REST HBase padrão.
#!/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
Conclusão
Neste post você viu como é fácil indexar e-mails armazenados no HBase — quase em tempo real e de forma totalmente não intrusiva ao fluxo principal do HBase. Em resumo, tenha em mente estes passos principais:
- Ativar replicação no HBase
- Configurar corretamente o Lily HBase Indexer
- Use Morphlines no Lily HBase Indexer para ajudar nas transformações (sem necessidade de codificação!)
Se você teve a oportunidade de ler o post anterior, pode ver que o arquivo morphlines.conf é praticamente idêntico nos três casos. Isso significa que é muito fácil aumentar os casos de uso de pesquisa no ecossistema Hadoop. Se os dados já estiverem em HDFS, use MapReduceIndexerTool para indexá-los. Se os dados estiverem chegando pelo Flume, use SolrMorphlineSink com um arquivo morphlines idêntico. Se posteriormente você decidir que o HBase se encaixa no caso de uso, apenas uma alteração mínima será necessária para iniciar a indexação de células no HBase:Basta adicionar o comando extractHBaseCells ao arquivo morphlines.
Embora este exemplo se concentre em emails como um caso de uso, esse método pode ser aplicado em muitos outros cenários em que o HBase é usado como uma camada de armazenamento e acesso. Se sua empresa já usa o HBase para um caso de uso específico, considere implementar o Cloudera Search em cima dele. Não requer codificação e pode realmente abrir os dados para um público muito mais amplo na organização.
Jeff Shmain é arquiteto de soluções na Cloudera.