Real-time сохранение изменяющихся данных в Apache SOLR с помощью Kafka + Lily HBase Batch Indexer

   Apache Solr очень хороший инструмент как для поиска так и для аналитики. Но изменение данных является дорогой операцией и желательно это не делать вообще или делать это как можно реже.

   Для этого был разработан подход на базе key-value базы HBase которая хорошо работает с обновлением данных. После сохранение обновлений в HBase, данные с помощью Lily HBase Batch Indexer считываются изменения с update log-a в HBase и заливают изменения в индекс Solr.

Для начала создаём таблицу в HBase:
hbase shell
hbase(main):021:0> create 'table_for_index', {NAME => 'data', REPLICATION_SCOPE => 1}
hbase(main):021:0> put 'table_for_index', 'row1', 'data', 'value'
hbase(main):022:0> put 'table_for_index', 'row2', 'data', 'value2'

Далее создаём индекс в Solr в который будут сохранятся изменения из HBase:
solrctl instancedir --generate $HOME/hbase-index
//Вносим необходимые поля из HBase таблички
vim $HOME/hbase-collection1/conf/schema.xml
solrctl instancedir --create hbase-index $HOME/hbase-index
solrctl collection --create hbase-index

Далее нам нужно настроить Lily HBase indexer используя утилиту hbase-indexer. Конфигурация происходит xml файле как приведено ниже:
cat $HOME/morphline-hbase-index-mapper.xml

<indexer mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper" table="table_for_index">
   <!-- Путь к локальному файлу с настроками для morphline. -->
   <param name="morphlineFile" value="/etc/hbase-solr/conf/morphlines.conf" />

   <!--Указываем morphlineId идентификатор в файле настроек для morphline -->
    <param name="morphlineId" value="morphline1"/>

</indexer>
 

Далее необходимо создать настройки обработки и сохранения данных для morphline:

cat /etc/hbase-solr/conf/morphlines.conf

morphlines : [
  {
    id : morphline1
    importCommands : ["org.kitesdk.morphline.**", "com.ngdata.**"]

    commands : [                    
      {
        extractHBaseCells {
          mappings : [
            {
              inputColumn : "data:*"
              outputField : "data" 
              type : string 
              source : value
            }
          ]
        }
      }

      { logTrace { format : "output record: {}", args : ["@{}"] } }    
    ]
  }
]
 

   Строка  extractHBaseCells извлекает  extracts данные из HBase и трансформирует их в SolrInputDocument.
   Стоит заметить, что файл настроек для  morphline не должен иметь строку loadSolr. Суть в том, что именно Lily HBase Indexer отвечает за сохранение документов в Solr а не morphline.

   Есть нюанс, что файлы с настройками должны быть доступны на всех серверах. Потому файлы предварительно нужно скопировать на все сервера с помощью утилиты scp, rsync или любой другой утилиты.
   Осталось только запустить создание индекса в Solr для HBase таблички с помощью hbase-indexer:
hbase-indexer add-indexer -n hbase_indexer_from_table_for_index-to-hbase-indexer \
-c $HOME/morphline-hbase-index-mapper.xml \
-cp solr.zk=127.0.0.1:2181/solr -cp solr.collection=hbase-index

Полезные ссылки:

Коментарі

Популярні дописи з цього блогу

Минимальные требование для кластера Hadoop(with Spark)

Линейная регрессия простыми словами

Исправляем ошибку HDFS Under-Replicated Blocks