文档章节

基于key-Value store indexer ,solrcloud创建Hbase二级索引

 战_天涯
发布于 2016/06/28 16:25
字数 2636
阅读 101
收藏 0

基于key-Value store indexer ,solrcloud创建Hbase二级索引 1.HBase表启用replication 创建新表: create 'table',{NAME => 'cf', REPLICATION_SCOPE => '1'} #其中1表示开启replication功能,0表示不开启,默认为0 或修改已经存在的表: disable 'table'
alter 'table',{NAME => 'cf', REPLICATION_SCOPE => '1'}
enable 'table'

2.创建一个你需要索引的Solr Collection 2.1 生产实体配置文件: solrctl instancedir --generate $HOME/solr_conf #其中$HOME为自己设置的一个放置生成实体配置文件的目录,譬如我设置的为/data1/bbdhadoop/luobenhua/install;solr_conf 为生成的这个配置的目录名称 生成配置文件后会在solr_conf/conf这个目录下产生很多配置文件,我们可以根据自己的需要修改schema.xml文件,将需要创建索引的列名添加到schema.xml中,例如:

<field name="fname" type="string" indexed="true" stored="true"/> <field name="university" type="int" indexed="true" stored="true"/> <field name="address" type="string" indexed="true" stored="true" />

需要说明的是,在schema.xml中uniqueKey必须为rowkey,而rowkey使用'id'字段表示,所以<field>中必须要有id字段

注意:该配置文件的name字段的名字一定要与Morphlines.conf 配置文件中outputField 字段的名字一致 2.2创建 collection 实例并将配置文件上传到 zookeeper: solrctl --zk c4node11:2181,c4node13:2181,c4node12:2181/solr instancedir --create user_index $HOME/solr_conf 说明:solr的安装过程中默认指定solr的工作目录为的zk节点为/solr目录,所以在上传配置文件到zk时需要将/solr的根目录加上,上传成功后将在zk中的/solr/configs/ user _index下面查询到上传的各个配置文件。 附件管理命令: 查看实体: solrctl --zk c4node11:2181,c4node13:2181,c4node12:2181 instancedir --list 删除实体: solrctl --zk c4node11:2181,c4node13:2181,c4node12:2181 instancedir --delete user_index 2.3 创建连接 上传到 zookeeper 之后,其他节点就可以从上面下载配置文件。接下来创建 collection: solrctl --zk c4node11:2181,c4node13:2181,c4node12:2181 collection --create user_index -s 3 -r 2 -m 3 其中:-s表示设置Shard数为3,-r表示设置的replica数为2 -m表示设置最大shard数量

重要说明:创建collection时,当该操作是在solr集群机器上面执行,操作命令如上; 如果不在集群内机器上面执行,者需加上 --solr http://c4node5:8983/solr 参数

3.生成Lily HBase Indexer配置文件 在HBase-Solr的安装目录/opt/cloudera/parcels/CDH/lib/hbase-solr下,创建morphline-hbase-mapper.xml文件,文件内容如下: $ cat $HOME/morphline-hbase-mapper.xml

<?xml version="1.0"?>

<indexer table=" test_tab_index " mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">

<!-- The relative or absolute path on the local file system to the morphline configuration file. -->

<!-- Use relative path "morphlines.conf" for morphlines managed by Cloudera Manager -->

<param name="morphlineFile" value="morphlines.conf"/> <!-- The optional morphlineId identifies a morphline if there are multiple morphlines in morphlines.conf --> <!-- <param name="morphlineId" value="morphline1"/> --> </indexer>

说明:其中table表示需要索引的HBase表名称,上面为record表;mapper表示用来实现和读取指定的Morphline配置文件类,固定为MorphlineResultToSolrMapper。param中的name参数用来指定当前配置为morphlineFile文件,value用来指定morphlines.conf文件的路径,绝对或者相对路径用来指定本地路径,如果是使用Cloudera Manager来管理morphlines.conf就直接写入值“morphlines.conf”。注意:当使用绝对或者相对路径来指定路径时,集群中的其它机器也要在配置路径上有该文件,如果是通过Cloudera Manager管理的话只需要在CM中修改后即可,CM会自动分发给集群

4.修改Morphlines配置文件 在CM管理界面: 具体操作为:进入Key-Value Store Indexer面板->配置->服务范围->Morphlines->Morphlines文件 morphlines : [
{
id : morphline1 importCommands : ["org.kitesdk.morphline.", "com.ngdata."]
commands : [
{
extractHBaseCells {
mappings : [
{
inputColumn : "cf:fname"
outputField : "fname"
type : string
source : value
}
{
inputColumn : "cf: university "
outputField : " university "
type : string
source : value
} {
inputColumn : "cf:address"
outputField : "address"
type : string
source : value
}

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

} ]

说明: id:表示当前morphlines文件的ID名称。 importCommands:需要引入的命令包地址。 extractHBaseCells:该命令用来读取HBase列数据并写入到SolrInputDocument对象中,该命令必须包含零个或者多个mappings命令对象。 mappings:用来指定HBase列限定符的字段映射。 inputColumn:需要写入到solr中的HBase列字段。值包含列族和列限定符,并用‘:’分开。其中列限定符也可以使用通配符‘*’来表示,譬如可以使用data:表示读取只要列族为data的所有hbase列数据,也可以通过data:my来表示读取列族为data列限定符已my开头的字段值。 outputField:用来表示morphline读取的记录需要输出的数据字段名称,该名称必须和solr中的schema.xml文件的字段名称保持一致,否则写入不正确。 type:用来定义读取HBase数据的数据类型,我们知道HBase中的数据都是以byte[]的形式保存,但是所有的内容在Solr中索引为text形式,所以需要一个方法来把byte[]类型转换为实际的数据类型。type参数的值就是用来做这件事情的。现在支持的数据类型有:byte,int,long,string,boolean,float,double,short和bigdecimal。当然你也可以指定自定的数据类型,只需要实现com.ngdata.hbaseindexer.parse.ByteArrayValueMapper接口即可。 source:用来指定HBase的KeyValue那一部分作为索引输入数据,可选的有‘value’和'qualifier',当为value的时候表示使用HBase的列值作为索引输入,当为qualifier的时候表示使用HBase的列限定符作为索引输入。

5.注册Lily HBase Indexer配置文件到Lily HBase Indexer Service服务 当前面的所有步骤完成之后,我们需要把Lily HBase Indexer的配置文件注册到Zookeeper中,使用如下命令: hbase-indexer add-indexer
--name userTestIndexer
--indexer-conf /data1/bbdhadoop/luobenhua/install/morphline-hbase-mapper.xml
--connection-param solr.zk=c4node11:2181,c4node13:2181,c4node12:2181/solr
--connection-param solr.collection=user_index
--zookeeper c4node11:2181,c4node13:2181,c4node12:2181

查看service服务: hbase-indexer list-indexers --zookeeper c4node11:2181,c4node13:2181,c4node12:2181 删除service服务: hbase-indexer delete-indexer -n userTestIndexer --zookeeper c4node11:2181,c4node13:2181,c4node12:2181

6.HBase写入数据 向HBase中配置的索引表写入数据 当写入数据后,稍过几秒我们可以在相对于的solr中查询到该插入的数据,表明配置已经成功。

7.JAVA API操作solr读取数据 public void getHbaseDataFromSolr(){ String url = "http://118.123.9.95:8983/solr/test_index"; //连接solr的url,test_index为上面创建的solr的连接实例名称 SolrServer server = new HttpSolrServer(url); long startTime = System.currentTimeMillis(); SolrQuery query = new SolrQuery("fname:aaa_176 AND address:bejing_264 AND university:chuanda_352 "); //按列条件查询语句,具体的查询语法见目录8 query.setStart(0); // 数据起始行,分页用 query.setRows(10); // 返回记录数,分页用 QueryResponse response=null; try { response = server.query(query); } catch (SolrServerException e) { e.printStackTrace(); } SolrDocumentList docs = response.getResults(); System.out.println("文档个数:" + docs.getNumFound()); // 数据总条数也可轻易获取 System.out.println("查询时间:" + response.getQTime()); for (SolrDocument doc : docs) { System.out.println((String) doc.getFieldValue("id") + "\t" + (String) doc.getFieldValue("fname") + "\t" + (String) doc.getFieldValue("address") + "\t" + (String) doc.getFieldValue("university")); } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); }

小数据量查询效率: 数据量20W的表,按照上面的条件对三个字段按照条件查询,响应时间再毫秒级

更大数据量的效率还需进一步做详细测试。 8. solr的常用查询语法 8.1 solr web ui常用查询参数说明
q - 查询字符串,必须的。
fl - 指定返回那些字段内容,用逗号或空格分隔多个。
start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
rows - 指定返回结果最多有多少条记录,配合start来实现分页。
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。官方文档:http://wiki.apache.org/solr/CommonQueryParameter

不常用  
q.op - 覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定  “OR” 
df - 默认的查询字段,一般默认指定  
qt - (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。  

其它  
indent - 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。  
version - 查询语法的版本,建议不使用它,由服务器指定默认值。 

solrconfig.xml的配置实例 

查询配置(以上参数项都可以配置到该配置文件) <requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int> <str name="defType">edismax</str> //使用的是solr 扩展的查询解析器 <str name="q.alt">:</str> <str name="fq">sell_price:[1 TO *]</str> <str name="hl">true</str> <str name="hl.fl">room_name</str> <str name="bf">sum(product(termfreq(room_status,"dzz"),1.2),1)</str> //额外的评分字段,这个是可以影响score的打分的 <str name="pf"> //要查询的字段 room_name house_code room_code zr_house_code hire_commissioner_name broker_name rating_address resblock_name district_name subway_station_name subway_line_name </str> <str name="qf"> //各自段分配的权重 room_name^5 house_code room_code zr_house_code hire_commissioner_name broker_name rating_address resblock_name^2 district_name subway_station_name subway_line_name </str> </lst> </requestHandler>

另外schema.xml的defaultOperator参数是个很重要的参数,默认是“OR”,意思是要查询的关键词做完分词后的词做 “OR”连接,然后再做查询,而“AND”呢,要至少全包含要搜索的关键词才行。

8.2 Solr的检索运算符 “:” 指定字段查指定值,如返回所有值*:² “?”²表示单个任意字符的通配 “” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)² “~”²表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。 ²邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10 “^”²控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache 布尔操作符AND、||² 布尔操作符OR、²&& 布尔操作符NOT、!、-²(排除操作符不能单独与项使用构成查询) “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在² ( ) 用于构成子查询² ² [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710] {}²不包含范围检索,如检索某时间段记录,不包含头尾 date:{200707 TO 200710} " 转义操作符,特殊字符包括+ -² && || ! ( ) { } [ ] ^ ” ~ * ? : "

非空数据的查询 比如:fq=fcode:['' TO *] 查询fcode非空的数据 

取反实例:fq=!fstate:1

8.3 facet查询

分类统计 facet  
q=*:*&facet=true&facet.field=cat&facet.field=inStock  //按cat  inStock进行分类统计 
q=ipod&facet=true&facet.query=price:[0 TO 100]&facet.query=price:[100 TO *]  //区间统计 价格在0-100 和100-无穷大的

--solr的分组查询(facet) 
http://IP:port/solr/room/select?rows=0&q=bizcircle_code:XXXXXX&facet=on&facet.field=resblock_id&facet.field=resblock_name&facet.limit=3   //同一个bizcircle_code下的 前三个resblock 各自的文档数量

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 3
码字总数 2980
作品 0
成都
云HBaseSQL及分析-Phoenix&Spark

在2018年1月的数据库直播大讲堂峰会HBase专场,来自阿里云的研发工程师瑾谦和沐远分享了云HBaseSQL以及分析Phoenix&Spark。本文介绍了详细了Phoinix和Spark的架构,适用性以及优缺点,并在最...

HBase技术社区
06/05
0
0
Hbase的应用场景、原理及架构分析

Hbase概述 hbase是一个构建在HDFS上的分布式列存储系统。HBase是Apache Hadoop生态系统中的重要 一员,主要用于海量结构化数据存储。从逻辑上讲,HBase将数据按照表、行和列进行存储。 如图所...

xiangxizhishi
2017/07/22
0
0
阿里云EMR异步构建云HBase二级索引

一、非HA EMR构建二级索引 云HBase借助Phoenix实现二级索引功能,对于Phoenix二级索引的详细介绍可参考https://yq.aliyun.com/articles/536850?spm=a2c4e.11153940.blogrightarea544746.26.6...

shining0227
09/10
0
0
HBase数据管理/寻址机制以及行键设计

1、hbase对数据的管理机制 1.1、hbase中的表很大---bigtable,都是分布式存储在集群的各个regionserver上 1.2、分布式存储时,需要对表进行切分,首先是按行切分成若干个hregion 1.3、表的每...

datapro
2015/06/11
0
0
Phoenix全局索引设计实践

概述 全局索引是Phoenix的重要特性,合理的使用二级索引能降低查询延时,让集群资源得以充分利用。 本文将讲述如何高效的设计和使用索引。 全局索引说明 全局索引的根本是通过单独的HBase表来...

HBase技术社区
09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
2
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部