文档章节

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

 战_天涯
发布于 2016/06/28 16:25
字数 2636
阅读 92
收藏 0
点赞 0
评论 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
HBase数据管理/寻址机制以及行键设计

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

datapro
2015/06/11
0
0
高手如何实践HBase?不容错过的滴滴内部技巧

摘要: HBase和Phoenix的优势大家众所周知,想要落地实践却问题一堆?replication的随机发送、Connection的管理是否让你头痛不已?本次分享中,滴滴以典型的应用场景带大家深入探究HBase和P...

阿里云云栖社区
06/13
0
0
基于solr实现hbase的二级索引

基于solr实现hbase的二级索引 [X] 目的: 由于hbase基于行健有序存储,在查询时使用行健十分高效,然后想要实现关系型数据库那样可以随意组合的、、等就比较麻烦了。想要实现这样的功能,我们可...

白石
2015/01/16
0
7
八年磨一剑,阿里云ApsaraDB for HBase2.0正式上线

一)HBase2.0和阿里云的前世今生 ApsaraDB for HBase2.0于2018年6月6日即将正式发布上线啦! 它是基于社区HBase2.0稳定版的升级,也是阿里HBase多年的实践经验和技术积累的持续延伸,全面解决...

天斯
06/05
0
0
八年磨一剑,解读阿里云ApsaraDB for HBase2.0

一.HBase2.0和阿里云的前世今生 ApsaraDB for HBase2.0于2018年6月6日即将正式发布上线啦! ApsaraDB for HBase2.0是基于社区HBase2.0稳定版的升级,也是阿里HBase多年的实践经验和技术积累的...

HBase技术社区
06/19
0
0
hive与hbase数据交互的详解指南 | ApacheCN(apache中文网)

HBase和Hive的集成原理 ApacheCN | apache中文网 Hive和Hbase有各自不同的特征:hive是高延迟、结构化和面向分析的,hbase是低延迟、非结构化和面向编程的。Hive数据仓库在hadoop上是高延迟...

片刻
2014/06/28
0
0
HBase是什么?为什么要使用HBase?

HBase是什么? HBase是Apache Hadoop中的一个子项目,Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用hadoop的DFS工具就可以看到这些这些数据 存储文件夹的结构,还可以通过Map/Red...

zqiang
2013/03/09
0
0
使用hive读取hbase数据

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为 MapReduce任务进行运行。 其优点是学习成本低,可以通过类...

凡16
2013/12/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部