UDH Search系统构建及其应用
作者 : 费英林
目录
2.6. 在 ZooKeeper 中初始化 Solr 命名空间
3.3. 创建 Lily HBase Indexer 配置文件
4.1. 建立 HBase 主从 Replication 集群
4.3. 设置 HBase 表的列族为 Replication 模式
UDH Search 是一个索引创建与检索服务,它与 UDH 高度集成,核心系统是 Apache Solr - 包括 Apache Lucene , SolrCloud , Apache Tika 和 Solr Cell 。 Search 生成的索引数据存储在 HDFS ,避免了海量数据的移动问题,缩短了索引的创建周期;同时, HDFS 的多数据备份保证了索引数据的安全性。借助于 UDH Search ,我们实现了对于存储在 HDFS 和 HBase 中的数据的近实时访问。在 UDH 平台,索引的创建有两种方式:批处理方式和近实时方式。
UDH Search 提供了标准的 Solr API 供客户端调用,它还提供了一个简单的 UI ,可集成在 Hue 的框架里。 UDH Search 的主要特性如下:
1 )生成的索引文件存储在 HDFS 里
2 )可以使用 MapReduce 批量创建索引
3 )可以在数据导入 HDFS 或 HBase 时实时创建索引
4 )可以与 Hue 集成,通过 Hue 实现界面访问
5 )可以通过索引数据检索 HBase 数据
本文以HBase数据的索引创建为例,阐述了利用 UDH Search 的基本工作原理及配置方法,包括批处理方式和实时处理方式。
1. Search 概要
1.1. Search中索引创建的主要流程
Search 有三种方式创建索引:
1 )实时索引创建
这是一种近实时的索引创建方式。通过 Flume 的配置文件,可以将输入数据中的字段映射到标准的 Solr schema , Lucene 建立索引并将索引数据写到 HDFS ,然后加载到 Solr 搜索引擎。
2 )使用 MapReduce 批量创建索引
对于存储在 HDFS 中的数据,我们可启动一个 MapReduce 工作流,在 Map 阶段执行字段抽取和 schema 映射,在 Reduce 阶段生成索引文件或索引分片。
3 ) HBase 数据索引创建
对于存储在 HBase 中的数据,有两种创建索引的方式:批处理方式和实时方式。
批处理方式 – 通过运行一个 MapReduce 作业,对已有数据批量创建索引;
实时方式 – 利用 HBase Replication 机制,实时获取 HBase 的数据流。
1.2. 主要组件
1 ) Morphline - 是一个开源框架,用于辅助 Search 的索引创建工作。通过配置文件来定义 ETL 流程,可实现数据读取、数据处理及数据加载。
2 ) Lily HBase NRT Indexer - 在 HBase 启用了复制模式后,可通过 Lily HBase NRT Indexer 实时获取 HBase 的增删改数据,动态创建索引并加载到 Solr 服务器。
3 ) MapReduceIndexerTool – 批量索引创建工具,生成的索引文件存储在 HDFS 。
2. Search 安装与配置
2.1. 安装节点选择
UDH Search 是一个分布式索引创建框架,需要访问 HDFS 或 HBase 中的数据。为降低网络 IO ,提高索引创建效率,可以在每个 DataNode 或 HBase RegionServer 所在的主机上部署 Search 服务。考虑到 Search 服务可能会影响到整个集群的性能,我们也可以单独搭建一个索引服务器集群。
2.2. 安装命令
安装 Solr 服务器: sudo yum install solr-server solr-doc
安装 Hue Search 服务: sudo yum install hue-search
安装 Spark Indexer: sudo yum install solr-crunc MapReduce h
安装 MapReduce Indexer : sudo yum install solr-mapreduce
安装 Lily HBase Indexer : sudo yum install hbase-solr-indexer hbase-solr-doc
2.3. 初始化 Solr
编辑 /etc/default/solr , 设置如下参数:
1 ) ZK 集群: SOLR_ZK_ENSEMBLE=<zkhost1>:2181,<zkhost2>:2181,<zkhost3>:2181/solr
2 ) HDFS : SOLR_HDFS_HOME=hdfs://namenodehost:8020/solr
3 ) Solr HDFS client : SOLR_HDFS_CONFIG=/etc/hadoop/conf ( 包含 core-site.xml/hdfs-site.xml 的目录 )
2.4. 配置 Solr 使用 Secure HDFS
1 )为每个 Solr 服务器创建 principals/Keytab :
addprinc -randkey solr/fully.qualified.domain.name@YOUR-REALM.COM
xst -norandkey -k solr.keytab solr/fully.qualified.domain.name
2 )在每个 Solr 服务器上配置 Keytab :
sudo mv solr.keytab /etc/solr/conf/
sudo chown solr:hadoop /etc/solr/conf/solr.keytab
sudo chmod 400 /etc/solr/conf/solr.keytab
3 )编辑 /etc/default/solr :
SOLR_KERBEROS_ENABLED=true
SOLR_KERBEROS_KEYTAB=/etc/solr/conf/solr.keytab
SOLR_KERBEROS_PRINCIPAL=solr/fully.qualified.domain.name@YOUR-REALM.COM
2.5. 在 HDFS 中创建 solr 目录
sudo -u hdfs hadoop fs -mkdir /solr
sudo -u hdfs hadoop fs -chown solr /solr
2.6. 在 ZooKeeper 中初始化Solr命名空间
solrctl init
solrctl init --force # 清除全部 Solr data ,中断所有运行的 Solr 服务器
2.7. 启动 Solr
sudo service solr-server restart
sudo jps –lm
2.8. 配置 – Hue Search
1 )设置 solr_url , 编辑 /etc/hue/hue.ini :
# Specify the Solr URL:
[search]
solr_url=http://SolrHostName:8983/solr/
2 )启用安全(在安全集群里) , 编辑 /etc/hue/hue.ini :
security_enabled=true
3 )启用代理 , 编辑 /etc/default/solr:
SOLR_SECURITY_ALLOWED_PROXYUSERS=hue
SOLR_SECURITY_PROXYUSER_hue_HOSTS=*
SOLR_SECURITY_PROXYUSER_hue_GROUPS=*
4 )验证
http://hue-host.com:8888/search /
3. 批量创建 HBase 索引
Search 有两种索引创建方式,即批量创建和实时创建。接下的两个章节将以 HBase 的索引创建为例,阐述相关的配置及运行方式。
3.1. 创建 HBase 表
在 HBase 中生成一张测试表,并新增几条数据。例如:
$ hbase shell
hbase(main):002:0> create 'record', {NAME => 'data'}
hbase(main):002:0> put 'record', 'row1', 'data', 'value'
hbase(main):001:0> put 'record', 'row2', 'data', 'value2'
3.2. 生成 collection
1 )生成一个 collection 的本地目录:
$ solrctl instancedir --generate $HOME/hbase-collection1
2 )编辑这个 collection 的 schema.xml ,加入希望生成的字段:
<field name=" data " type=" string " indexed="true" stored="true" />
3 )上传这个 collection 到 ZK 集群:
$ solrctl instancedir --create hbase-collection1 $HOME/hbase-collection1
$ solrctl collection --create hbase-collection1
3.3. 创建 Lily HBase Indexer 配置文件
在 collection 的本地目录中生成 Lily HBase Indexer 配置文件,如
如 $HOME/morphline-hbase-mapper.xml
<?xml version="1.0"?>
<indexer table="record" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">
<param name="morphlineFile" value="/etc/hbase-solr/conf/morphlines.conf"/>
<!-- <param name="morphlineId" value="morphline1"/> -->
</indexer>
3.4. 创建 Morphline 配置文件
生成相应的 Morphline 配置文件 /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 : ["@{}"] } }
]
}
]
3.5. 运行 Lily HBase Indexer
hadoop --config /etc/hadoop/conf jar \
/usr/lib/hbase-solr/tools/hbase-indexer-mr-*-job.jar --conf \
/etc/hbase/conf/hbase-site.xml -D 'mapred.child.java.opts=-Xmx500m' \
--hbase-indexer-file $HOME/morphline-hbase-mapper.xml --zk-host \
127.0.0.1/solr --collection hbase-collection1 --go-live --log4j \
src/test/resources/log4j.properties
3.6. 验证
在浏览器中输入地址 http:// solrhost :8983/solr ,选择相应的 collection ,点击查询进行验证。
3.7. 应用场景
批处理模式适用于数据量大,时效性要求不高的情况。
4. 实时生成 HBase 索引
通过 HBase 的 Replication 机制, Search 实现了 HBase 数据的(接近)实时索引创建。数据进入主集群,然后 Replicate 到从集群,从集群的 HBase Indexer 创建索引到在线 Solr 服务器。这个过程所用的时间通常是在秒级别。关于 HBase 备份集群的创建及配置方法请参考‘如何配置 UDH HBase Replication 集群’。
4.1. 建立 HBase 主从Replication集群
参见‘如何配置 UDH HBase Replication 集群’
4.2. 设置ZK集群
在 /etc/hbase-solr/conf/hbase-indexer-site.xml 中设置 HBase Indexer 需要访问的 ZK 集群:
<property>
<name>hbase.zookeeper.quorum</name>
<value>hbase-cluster-zookeeper</value>
</property>
<property>
<name>hbaseindexer.zookeeper.connectstring</name>
<value>hbase-cluster-zookeeper:2181</value>
</property>
4.3. 设置 HBase 表的列族为Replication模式
对于已经存在的表:
hbase shell> disable 'record'
hbase shell> alter 'record', {NAME => 'data', REPLICATION_SCOPE => 1}
hbase shell> enable 'record'
对于新表:
hbase shell> create 'record', {NAME => 'data', REPLICATION_SCOPE => 1}
4.4. 生成collection和配置文件
相关的配置与批量创建索引的配置一致,参考上一个章节。
4.5. 注册一个Indexer
在服务中注册 Indexer :
$ hbase-indexer add-indexer \
--name myIndexer \
--indexer-conf $HOME/morphline-hbase-mapper.xml \
--connection-param solr.zk=solr-cloude-zk1,solr-cloude-zk2/solr \
--connection-param solr.collection=hbase-collection1 \
--zookeeper hbase-cluster-zookeeper:2181
检查是否注册成功:
$ hbase-indexer list-indexers
4.6. 在HBase主集群中新增数据,验证结果
1 )重启服务:
sudo service hbase-solr-indexer restart
2 )添加记录到主集群:
hbase(main):001:0> put 'record', 'row1', 'data', 'value'
hbase(main):002:0> put 'record', 'row2', 'data', 'value2'
3 )页面检查索引数据,确认主集群数据已经在从集群中出现并建立了索引。
4.7. 应用场景
实时处理模式适用于有持续数据量,时效性要求很高的情况。不适用于存在删除、修改的数据流。
5. 安装包
http://archive-primary.cloudera.com/cdh5/redhat/6/x86_64/cdh/5.0.4/RPMS/noarch/
hbase-solr-1.3+cdh5.0.4+49-1.cdh5.0.4.p0.11.el6.noarch.rpm
hbase-solr-doc-1.3+cdh5.0.4+49-1.cdh5.0.4.p0.11.el6.noarch.rpm
hbase-solr-indexer-1.3+cdh5.0.4+49-1.cdh5.0.4.p0.11.el6.noarch.rpm
search-1.0.0+cdh5.0.4+0-1.cdh5.0.4.p0.8.el6.noarch.rpm
solr-4.4.0+cdh5.0.4+198-1.cdh5.0.4.p0.14.el6.noarch.rpm
solr-doc-4.4.0+cdh5.0.4+198-1.cdh5.0.4.p0.14.el6.noarch.rpm
solr-mapreduce-1.0.0+cdh5.0.4+0-1.cdh5.0.4.p0.8.el6.noarch.rpm
solr-server-4.4.0+cdh5.0.4+198-1.cdh5.0.4.p0.14.el6.noarch.rpm
http://archive-primary.cloudera.com/cdh5/redhat/6/x86_64/cdh/5.0.4/RPMS/x86_64/
hue-search-3.5.0+cdh5.0.4+387-1.cdh5.0.4.p0.11.el6.x86_64.rpm
Attachments:
专题_基于UDH的一种实时查询系统构建方案.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)
图1.png (image/png)
图2.png (image/png)
图3.png (image/png)
图4.png (image/png)
专题-UDH Search系统构建及其应用.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)
专题-UDH Search系统构建及其应用.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)