solr server 必须和nutch hbase solrindexer 在一台机器上吗

5788人阅读
H4_SOLR/LUCENCE(12)
作者同类文章X
1、RemoteSolrException:&Expected mime type application/octet-stream but got text/html
SLF4J: Failed to load class &org.slf4j.impl.StaticLoggerBinder&.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread &main& org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException:Expected mime type application/octet-stream but got text/html. &html&&head&&title&Apache Tomcat/7.0.54
- Error report&/title&&style&&!--H1 {font-family:Tahoma,Arial,sans-color:background-color:#525D76;font-size:22} H2 {font-family:Tahoma,Arial,sans-color:background-color:#525D76;font-size:16} H3 {font-family:Tahoma,Arial,sans-color:background-color:#525D76;font-size:14}
BODY {font-family:Tahoma,Arial,sans-color:background-color:} B {font-family:Tahoma,Arial,sans-color:background-color:#525D76;} P {font-family:Tahoma,Arial,sans-background:color:font-size:12}A {color :}A.name
{color :}HR {color : #525D76;}--&&/style& &/head&&body&&h1&HTTP Status 405 - HTTP method POST is not supported by this URL&/h1&&HR size=&1& noshade=&noshade&&&p&&b&type&/b& Status report&/p&&p&&b&message&/b& &u&HTTP method POST is not supported by this
URL&/u&&/p&&p&&b&description&/b& &u&The specified HTTP method is not allowed for the requested resource.&/u&&/p&&HR size=&1& noshade=&noshade&&&h3&Apache Tomcat/7.0.54&/h3&&/body&&/html&
at org.apache.solr.client.solrj.impl.HttpSolrServer.executeMethod(HttpSolrServer.java:516)
at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:210)
at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:206)
at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:124)
at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:116)
at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:102)
at org.ljh.test.solr.BasicSolrJIndexDemo.main(BasicSolrJIndexDemo.java:23)
由于各种错误导致了solr返回一个错误页面,而不是index成功的结果,因此出现以上异常。
其中上述html代码格式化后呈现:
HTTP Status 405 - HTTP method POST is not supported by this URL
type&Status report
message&HTTP method POST is not supported by this URL
description&The specified HTTP method is not allowed for the requested resource.
Apache Tomcat/7.0.54
解决方法:
在使用Tomcat部署Solr后,Collection1的地址为:http://ip:8080/solr/#/collection1,但使用SolrJ进行索引的时候,应该使用http://ip:8080/solr/collection1,即无中间的#号。
即正确代码为:
String serverUrl = (args != null && args.length & 0) ? args[0]
: &http://ip:8080/solr/collection1&;错误代码为:
String serverUrl = (args != null && args.length & 0) ? args[0]
: &http://ip:8080/solr/#/collection1&;
错误代码将导致上述错误。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:488294次
积分:6764
积分:6764
排名:第1662名
原创:194篇
转载:77篇
评论:63条
(1)(3)(1)(10)(16)(16)(11)(3)(21)(27)(26)(23)(6)(2)(17)(21)(7)(6)(3)(5)(2)(36)(1)(1)(6)HBase(8)
作者同类文章X
Java(68)
作者同类文章X
某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询。HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力。针对HBase的多条件查询也有多种方案,但是这些方案要么太复杂,要么效率太低,本文只对基于Solr的HBase多条件查询方案进行测试和验证。
基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。
测试环境:
solr 4.0.0版本,使用其自带的jetty服务端容器,单节点;
hbase-0.94.2-cdh4.2.1,10台Lunux服务器组成的HBase集群。
HBase中2512万条数据172个字段;
Solr索引HBase中的100万条数据;
测试结果:
1、100万条数据在Solr中对8个字段建立索引。在Solr中最多8个过滤条件获取51316条数据的rowkey值,基本在57-80毫秒。根据Solr返回的rowkey值在HBase表中获取所有51316条数据12个字段值,耗时基本在15秒;
2、数据量同上,过滤条件同上,采用Solr分页查询,每次获取20条数据,Solr获得20个rowkey值耗时4-10毫秒,拿到Solr传入的rowkey值在HBase中获取对应20条12个字段的数据,耗时6毫秒。
以下列出测试环境的搭建、以及相关代码实现过程。
一、Solr环境的搭建
因为初衷只是测试Solr的使用,Solr的运行环境也只是用了其自带的jetty,而非大多人用的Tomcat;没有搭建Solr集群,只是一个单一的Solr服务端,也没有任何参数调优。
1)在&Apache网站上下载Solr 4:&,我们这里下载的是“&apache-solr-4.0.0.tgz”;
2)在当前目录解压Solr压缩包:
-xvzf apache-solr-..tgz
3)修改Solr的配置文件schema.xml,添加我们需要索引的多个字段(配置文件位于“/opt/apache-solr-4.0.0/example/solr/collection1/conf/”)
name=&rowkey& type=&string& indexed=&true& stored=&true& required=&true& multiValued=&false& /&
name=&time& type=&string& indexed=&true& stored=&true& required=&false& multiValued=&false& /&
name=&tebid& type=&string& indexed=&true& stored=&true& required=&false& multiValued=&false& /&
name=&tetid& type=&string& indexed=&true& stored=&true& required=&false& multiValued=&false& /&
name=&puid& type=&string& indexed=&true& stored=&true& required=&false& multiValued=&false& /&
name=&mgcvid& type=&string& indexed=&true& stored=&true& required=&false& multiValued=&false& /&
name=&mtcvid& type=&string& indexed=&true& stored=&true& required=&false& multiValued=&false& /&
name=&smaid& type=&string& indexed=&true& stored=&true& required=&false& multiValued=&false& /&
name=&mtlkid& type=&string& indexed=&true& stored=&true& required=&false& multiValued=&false& /&
另外关键的一点是修改原有的uniqueKey,本文设置HBase表的rowkey字段为Solr索引的uniqueKey:
type 参数代表索引数据类型,我这里将type全部设置为string是为了避免异常类型的数据导致索引建立失败,正常情况下应该根据实际字段类型设置,比如整型字段设置为int,更加有利于索引的建立和检索;
indexed 参数代表此字段是否建立索引,根据实际情况设置,建议不参与条件过滤的字段一律设置为false;
stored 参数代表是否存储此字段的值,建议根据实际需求只将需要获取值的字段设置为true,以免浪费存储,比如我们的场景只需要获取rowkey,那么只需把rowkey字段设置为true即可,其他字段全部设置flase;
required 参数代表此字段是否必需,如果数据源某个字段可能存在空值,那么此属性必需设置为false,不然Solr会抛出异常;
multiValued 参数代表此字段是否允许有多个值,通常都设置为false,根据实际需求可设置为true。
4)我们使用Solr自带的example来作为运行环境,定位到example目录,启动服务监听:
cd /opt/apache-solr-4.0.0/example
java -jar ./start.jar
如果启动成功,可以通过浏览器打开此页面:http://192.168.1.10:8983/solr/
二、读取HBase源表的数据,在Solr中建立索引
一种方案是通过HBase的普通API获取数据建立索引,此方案的缺点是效率较低每秒只能处理100多条数据(或许可以通过多线程提高效率):
package com.ultrapower.hbase.import java.io.IOEimport org.apache.hadoop.conf.Cimport org.apache.hadoop.hbase.HBaseCimport org.apache.hadoop.hbase.KeyVimport org.apache.hadoop.hbase.client.HTimport org.apache.hadoop.hbase.client.Rimport org.apache.hadoop.hbase.client.ResultSimport org.apache.hadoop.hbase.client.Simport org.apache.hadoop.hbase.util.Bimport org.apache.solr.client.solrj.SolrServerEimport org.apache.solr.client.solrj.impl.HttpSolrSimport org.mon.SolrInputDpublic class SolrIndexer { /**
IOException
SolrServerException
public static void main(String[] args) throws IOException,
SolrServerException {
HttpSolrServer solrServer = new HttpSolrServer(
&http://192.168.1.10:8983/solr&);
conf = HBaseConfiguration.create();
HTable table = new HTable(conf, &hb_app_xxxxxx&);
Scan scan = new Scan();
scan.addFamily(Bytes.toBytes(&d&));
scan.setCaching(500);
scan.setCacheBlocks(false);
ResultScanner ss = table.getScanner(scan);
System.out.println(&start ...&);
int i = 0;
for (Result r : ss) {
SolrInputDocument solrDoc = new SolrInputDocument();
solrDoc.addField(&rowkey&, new String(r.getRow()));
for (KeyValue kv : r.raw()) {
String fieldName = new String(kv.getQualifier());
String fieldValue = new String(kv.getValue());
if (fieldName.equalsIgnoreCase(&time&)
|| fieldName.equalsIgnoreCase(&tebid&)
|| fieldName.equalsIgnoreCase(&tetid&)
|| fieldName.equalsIgnoreCase(&puid&)
|| fieldName.equalsIgnoreCase(&mgcvid&)
|| fieldName.equalsIgnoreCase(&mtcvid&)
|| fieldName.equalsIgnoreCase(&smaid&)
|| fieldName.equalsIgnoreCase(&mtlkid&)) {
solrDoc.addField(fieldName, fieldValue);
solrServer.add(solrDoc);
</mit(true, true, true);
i = i &#43; 1;
System.out.println(&已经成功处理 & &#43; i &#43; & 条数据&);
ss.close();
table.close();
System.out.println(&done !&);
} catch (IOException e) {
} finally {
ss.close();
table.close();
System.out.println(&erro !&);
另外一种方案是用到HBase的Mapreduce框架,分布式并行执行效率特别高,处理1000万条数据仅需5分钟,但是这种高并发需要对Solr服务器进行配置调优,不然会抛出服务器无法响应的异常:
Error: org.mon.SolrException: Server at http://192.168.1.10:8983/solr returned non ok status:503, message:Service Unavailable
MapReduce入口程序:
package com.ultrapower.hbase.import java.io.IOEimport java.net.URISyntaxEimport org.apache.hadoop.conf.Cimport org.apache.hadoop.hbase.HBaseCimport org.apache.hadoop.hbase.client.Simport org.apache.hadoop.hbase.mapreduce.TableMapReduceUimport org.apache.hadoop.hbase.util.Bimport org.apache.hadoop.mapreduce.Jimport org.apache.hadoop.mapreduce.lib.output.NullOutputFpublic class SolrHBaseIndexer {
private static void usage() {
System.err.println(&输入参数: &配置文件路径& &起始行& &结束行&&);
System.exit(1);
private static C
public static void main(String[] args) throws IOException,
InterruptedException, ClassNotFoundException, URISyntaxException { if (args.length == 0 || args.length & 3) {
createHBaseConfiguration(args[0]);
ConfigProperties tutorialProperties = new ConfigProperties(args[0]);
String tbName = tutorialProperties.getHBTbName();
String tbFamily = tutorialProperties.getHBFamily();
Job job = new Job(conf, &SolrHBaseIndexer&);
job.setJarByClass(SolrHBaseIndexer.class);
Scan scan = new Scan(); if (args.length == 3) {
scan.setStartRow(Bytes.toBytes(args[1]));
scan.setStopRow(Bytes.toBytes(args[2]));
scan.addFamily(Bytes.toBytes(tbFamily));
scan.setCaching(500);
scan.setCacheBlocks(false);
SolrHBaseIndexerMapper.class, null, null, job);
job.setOutputFormatClass(NullOutputFormat.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
* 从配置文件读取并设置HBase配置信息
propsLocation
private static void createHBaseConfiguration(String propsLocation) {
ConfigProperties tutorialProperties = new ConfigProperties(
propsLocation);
conf = HBaseConfiguration.create();
conf.set(&hbase.zookeeper.quorum&, tutorialProperties.getZKQuorum());
conf.set(&hbase.zookeeper.property.clientPort&,
tutorialProperties.getZKPort());
conf.set(&hbase.master&, tutorialProperties.getHBMaster());
conf.set(&hbase.rootdir&, tutorialProperties.getHBrootDir());
conf.set(&solr.server&, tutorialProperties.getSolrServer());
对应的Mapper:
package com.ultrapower.hbase.import java.io.IOEimport org.apache.hadoop.conf.Cimport org.apache.hadoop.hbase.KeyVimport org.apache.hadoop.hbase.client.Rimport org.apache.hadoop.hbase.io.ImmutableBytesWimport org.apache.hadoop.hbase.mapreduce.TableMimport org.apache.hadoop.io.Timport org.apache.solr.client.solrj.SolrServerEimport org.apache.solr.client.solrj.impl.HttpSolrSimport org.mon.SolrInputDpublic class SolrHBaseIndexerMapper extends TableMapper&Text, Text& {
public void map(ImmutableBytesWritable key, Result hbaseResult,
Context context) throws InterruptedException, IOException {
Configuration conf = context.getConfiguration();
HttpSolrServer solrServer = new HttpSolrServer(conf.get(&solr.server&));
solrServer.setDefaultMaxConnectionsPerHost(100);
solrServer.setMaxTotalConnections(1000);
solrServer.setSoTimeout(20000);
solrServer.setConnectionTimeout(20000);
SolrInputDocument solrDoc = new SolrInputDocument(); try {
solrDoc.addField(&rowkey&, new String(hbaseResult.getRow()));
for (KeyValue rowQualifierAndValue : hbaseResult.list()) {
String fieldName = new String(
rowQualifierAndValue.getQualifier());
String fieldValue = new String(rowQualifierAndValue.getValue());
if (fieldName.equalsIgnoreCase(&time&)
|| fieldName.equalsIgnoreCase(&tebid&)
|| fieldName.equalsIgnoreCase(&tetid&)
|| fieldName.equalsIgnoreCase(&puid&)
|| fieldName.equalsIgnoreCase(&mgcvid&)
|| fieldName.equalsIgnoreCase(&mtcvid&)
|| fieldName.equalsIgnoreCase(&smaid&)
|| fieldName.equalsIgnoreCase(&mtlkid&)) {
solrDoc.addField(fieldName, fieldValue);
solrServer.add(solrDoc);
mit(true, true, true);
} catch (SolrServerException e) {
System.err.println(&更新Solr索引异常:& &#43; new String(hbaseResult.getRow()));
读取参数配置文件的辅助类:
package com.ultrapower.hbase.import java.io.Fimport java.io.FileRimport java.io.IOEimport java.util.Ppublic class ConfigProperties {
private static P
private String HBASE_ZOOKEEPER_QUORUM;
private String HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT;
private String HBASE_MASTER;
private String HBASE_ROOTDIR;
private String DFS_NAME_DIR;
private String DFS_DATA_DIR;
private String FS_DEFAULT_NAME;
private String SOLR_SERVER;
props = new Properties(); try {
File file = new File(propLocation);
System.out.println(&从以下位置加载配置文件: & &#43; file.getAbsolutePath());
FileReader is = new FileReader(file);
props.load(is);
HBASE_ZOOKEEPER_QUORUM = props.getProperty(&HBASE_ZOOKEEPER_QUORUM&);
HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT = props.getProperty(&HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT&);
HBASE_MASTER = props.getProperty(&HBASE_MASTER&);
HBASE_ROOTDIR = props.getProperty(&HBASE_ROOTDIR&);
DFS_NAME_DIR = props.getProperty(&DFS_NAME_DIR&);
DFS_DATA_DIR = props.getProperty(&DFS_DATA_DIR&);
FS_DEFAULT_NAME = props.getProperty(&FS_DEFAULT_NAME&);
SOLR_SERVER = props.getProperty(&SOLR_SERVER&);
HBASE_TABLE_NAME = props.getProperty(&HBASE_TABLE_NAME&);
HBASE_TABLE_FAMILY = props.getProperty(&HBASE_TABLE_FAMILY&);
} catch (IOException e) {
throw new RuntimeException(&加载配置文件出错&);
} catch (NullPointerException e) {
throw new RuntimeException(&文件不存在&);
public String getZKQuorum() { return HBASE_ZOOKEEPER_QUORUM;
public String getZKPort() { return HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT;
public String getHBMaster() { return HBASE_MASTER;
public String getHBrootDir() { return HBASE_ROOTDIR;
public String getDFSnameDir() { return DFS_NAME_DIR;
public String getDFSdataDir() { return DFS_DATA_DIR;
public String getFSdefaultName() { return FS_DEFAULT_NAME;
public String getSolrServer() { return SOLR_SERVER;
public String getHBTbName() { return HBASE_TABLE_NAME;
public String getHBFamily() { return HBASE_TABLE_FAMILY;
参数配置文件“config.properties”:
HBASE_ZOOKEEPER_QUORUM=slave-1,slave-2,slave-3,slave-4,slave-5HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT=2181HBASE_MASTER=master-1:60000HBASE_ROOTDIR=hdfs:///hbaseDFS_NAME_DIR=/opt/data/dfs/name
DFS_DATA_DIR=/opt/data/d0/dfs2/data
FS_DEFAULT_NAME=hdfs://192.168.1.10:9000SOLR_SERVER=http://192.168.1.10:8983/solrHBASE_TABLE_NAME=hb_app_m_user_te
HBASE_TABLE_FAMILY=d
三、结合Solr进行HBase数据的多条件查询:
可以通过web页面操作Solr索引,
http://192.168.1.10:8983/solr/select?(time:201307 AND tetid:1 AND mgcvid:101 AND smaid:101 AND puid:102)
删除所有索引:
http://192.168.1.10:8983/solr/update/?stream.body=&delete&&query&*:*&/query&&/delete&&stream.contentType=text/charset=utf-8&commit=true
通过java客户端结合Solr查询HBase数据:
package com.ultrapower.hbase.import java.io.IOEimport java.nio.ByteBimport java.util.ArrayLimport java.util.Limport org.apache.hadoop.conf.Cimport org.apache.hadoop.hbase.HBaseCimport org.apache.hadoop.hbase.client.Gimport org.apache.hadoop.hbase.client.HTimport org.apache.hadoop.hbase.client.Rimport org.apache.hadoop.hbase.util.Bimport org.apache.solr.client.solrj.SolrQimport org.apache.solr.client.solrj.SolrSimport org.apache.solr.client.solrj.SolrServerEimport org.apache.solr.client.solrj.impl.HttpSolrSimport org.apache.solr.client.solrj.response.QueryRimport org.mon.SolrDimport org.mon.SolrDocumentLpublic class QueryData { /**
SolrServerException
IOException
public static void main(String[] args) throws SolrServerException, IOException {
conf = HBaseConfiguration.create();
HTable table = new HTable(conf, &hb_app_m_user_te&);
Get get = null;
List&Get& list = new ArrayList&Get&();
String url = &http://192.168.1.10:8983/solr&;
SolrServer server = new HttpSolrServer(url);
SolrQuery query = new SolrQuery(&time:201307 AND tetid:1 AND mgcvid:101 AND smaid:101 AND puid:102&);
query.setStart(0);
query.setRows(10);
QueryResponse response = server.query(query);
SolrDocumentList docs = response.getResults();
System.out.println(&文档个数:& &#43; docs.getNumFound());
System.out.println(&查询时间:& &#43; response.getQTime());
for (SolrDocument doc : docs) {
get = new Get(Bytes.toBytes((String) doc.getFieldValue(&rowkey&)));
list.add(get);
Result[] res = table.get(list);
byte[] bt1 = null;
byte[] bt2 = null;
byte[] bt3 = null;
byte[] bt4 = null;
String str1 = null;
String str2 = null;
String str3 = null;
String str4 = null;
for (Result rs : res) {
bt1 = rs.getValue(&d&.getBytes(), &3mpon&.getBytes());
bt2 = rs.getValue(&d&.getBytes(), &3mponid&.getBytes());
bt3 = rs.getValue(&d&.getBytes(), &amarpu&.getBytes());
bt4 = rs.getValue(&d&.getBytes(), &amarpuid&.getBytes());
if (bt1 != null && bt1.length&0) {str1 = new String(bt1);} else {str1 = &无数据&;}
if (bt2 != null && bt2.length&0) {str2 = new String(bt2);} else {str2 = &无数据&;}
if (bt3 != null && bt3.length&0) {str3 = new String(bt3);} else {str3 = &无数据&;}
if (bt4 != null && bt4.length&0) {str4 = new String(bt4);} else {str4 = &无数据&;}
System.out.print(new String(rs.getRow()) &#43; & &);
System.out.print(str1 &#43; &|&);
System.out.print(str2 &#43; &|&);
System.out.print(str3 &#43; &|&);
System.out.println(str4 &#43; &|&);
table.close();
通过测试发现,结合Solr索引可以很好的实现HBase的多条件查询,同时还能解决其两个难点:分页查询、数据总量统计。
实际场景中大多都是分页查询,分页查询返回的数据量很少,采用此种方案完全可以达到前端页面毫秒级的实时响应;若有大批量的数据交互,比如涉及到数据导出,实际上效率也是很高,十万数据仅耗时10秒。
另外,如果真的将Solr纳入使用,Solr以及HBase端都可以不断进行优化,比如可以搭建Solr集群,甚至可以采用SolrCloud基于hadoop的分布式索引服务。
总之,HBase不能多条件过滤查询的先天性缺陷,在Solr的配合之下可以得到较好的弥补,难怪诸如新蛋科技、国美电商、苏宁电商等互联网公司以及众多游戏公司,都使用Solr来支持快速查询。
转自/archives/65847
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:409914次
积分:6200
积分:6200
排名:第1959名
原创:189篇
转载:98篇
评论:92条
(7)(3)(16)(3)(4)(3)(4)(1)(8)(8)(7)(5)(4)(15)(25)(31)(15)(1)(3)(12)(1)(2)(1)(5)(11)(6)(13)(1)(5)(1)(4)(3)(3)(4)(8)(14)(9)(2)(9)(4)(6)(4)(2)(1)(1)(2)(4)(3)大数据架构-使用HBase和Solr配置存储与索引-阿里云资讯网
大数据架构-使用HBase和Solr配置存储与索引
发布时间:
更新时间:
来源:网络
作者:boblee1389
& & HBase和Solr可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增、删、改索 引的操作。将存储与索引放在不同的机器上,这是大数据架构的必须品,但目前还有很多不此道的同学,他们对于这种思想感到很新奇,,这绝对是好的方 向,不懂得抓紧学习吧。
& & 有个朋友给我的那篇博客留言,说CDH也可以做这样的事情,我还没有试过,他还问与此相关的代码,我就稍微整理了一下,作为本篇文章的主要内容。关于CDH的事,我会尽快尝试,有知道的同学可以给我留言。
& & 下面我主要讲述一下,我测试对HBase和Solr的性能时,使用HBase协处理器向HBase添加数据所编写的相关代码,及解释说明。
一、编写HBase协处理器Coprocessor
& & 一旦有数据postPut,就立即对Solr里相应的Core更新。这里使用了ConcurrentUpdateSolrServer,它是Solr速率性能的保证,使用它不要忘记在Solr配置autoCommit哟。/*&&&*
:王安琪&&&*描述:监视HBase,一有数据postPut就向Solr发送,本类要作为触发器添加到HBase&&&*修改时间:&&&*修改内容:新增&&&*/&&package&solrHbase.&&& &import&java.io.UnsupportedEncodingE&&& &import&***;&&& &public&class&SorlIndexCoprocessorObserver&extends&BaseRegionObserver&{&&& && & private&static&final&Logger&LOG&=&LoggerFactory&&& & & & & & .getLogger(SorlIndexCoprocessorObserver.class);&&& & private&static&final&String&solrUrl&=&&http://192.1.11.108:80/solr/core1&;&&& & private&static&final&SolrServer&solrServer&=&new&ConcurrentUpdateSolrServer(&&& & & & & & solrUrl,&10000,&20);&&& && & /**&&& & &*&建立solr索引&&& & &*& && & &*&@throws&UnsupportedEncodingException&&& & &*/&&& & @Override&&& & public&void&postPut(final&ObserverContext&RegionCoprocessorEnvironment&&e,&&& & & & & & final&Put&put,&final&WALEdit&edit,&final&boolean&writeToWAL)&&& & & & & & throws&UnsupportedEncodingException&{&&& & & & inputSolr(put);&&& & }&&& && & public&void&inputSolr(Put&put)&{&&& & & & try&{&&& & & & & & solrServer.add(TestSolrMain.getInputDoc(put));&&& & & & }&catch&(Exception&ex)&{&&& & & & & & LOG.error(ex.getMessage());&&& & & & }&&& & }&&}&
& & 注意:getInputDoc是这个HBase协处理器Coprocessor的精髓所在,它可以把HBase内的Put里的内容转化成Solr需 要的值。其中String&fieldName&=&key.substring(key.indexOf(columnFamily)&+&3,&key.indexOf(& 我在这&)).trim();这里有一个乱码字符,在这里看不到,请大家注意一下。public&static&SolrInputDocument&getInputDoc(Put&put)&{&&& & & & SolrInputDocument&doc&=&new&SolrInputDocument();&&& & & & doc.addField(&test_ID&,&Bytes.toString(put.getRow()));&&& & & & for&(KeyValue&c&:&put.getFamilyMap().get(Bytes.toBytes(columnFamily)))&{&&& & & & & & String&key&=&Bytes.toString(c.getKey());&&& & & & & & String&value&=&Bytes.toString(c.getValue());&&& & & & & & if&(value.isEmpty())&{&&& & & & & & & &&&& & & & & & }&&& & & & & & String&fieldName&=&key.substring(key.indexOf(columnFamily)&+&3,&&& & & & & & & & & & key.indexOf(&&)).trim();&&& & & & & & doc.addField(fieldName,&value);&&& & & & }&&& & & & return&&&& & }&
二、编写测试程序入口代码main
& & 这段代码向HBase请求建了一张表,并将模拟的数据,向HBase连续地提交数据内容,在HBase中不断地插入数据,同时记录时间,测试插入性能。/*&&&*版权:王安琪&&&*描述:测试HBaseInsert,HBase插入性能&&&*修改时间:&&&*修改内容:新增&&&*/&&package&solrHbase.&&& &import&hbaseInput.HbaseI&&& &import&***;&&& &public&class&TestHBaseMain&{&&& && & private&static&Configuration&&&& & private&static&String&tableName&=&&angelHbase&;&&& & private&static&HTable&table&=&&&& & private&static&final&String&columnFamily&=&&wanganqi&;&&& && & /**&&& & &*&@param&args&&& & &*/&&& & public&static&void&main(String[]&args)&{&&& & & & config&=&HBaseConfiguration.create();&&& & & & config.set(&hbase.zookeeper.quorum&,&&192.103.101.104&);&&& & & & HbaseInsert.createTable(config,&tableName,&columnFamily);&&& & & & try&{&&& & & & & & table&=&new&HTable(config,&Bytes.toBytes(tableName));&&& & & & & & for&(int&k&=&0;&k&&&1;&k++)&{&&& & & & & & & & Thread&t&=&new&Thread()&{&&& & & & & & & & & & public&void&run()&{&&& & & & & & & & & & & & for&(int&i&=&0;&i&&&100000;&i++)&{&&& & & & & & & & & & & & & & HbaseInsert.inputData(table,&&& & & & & & & & & & & & & & & & & & PutCreater.createPuts(1000,&columnFamily));&&& & & & & & & & & & & & & & Calendar&c&=&Calendar.getInstance();&&& & & & & & & & & & & & & & String&dateTime&=&c.get(Calendar.YEAR)&+&&-&&&& & & & & & & & & & & & & & & & & & +&c.get(Calendar.MONTH)&+&&-&&&& & & & & & & & & & & & & & & & & & +&c.get(Calendar.DATE)&+&&T&&&& & & & & & & & & & & & & & & & & & +&c.get(Calendar.HOUR)&+&&:&&&& & & & & & & & & & & & & & & & & & +&c.get(Calendar.MINUTE)&+&&:&&&& & & & & & & & & & & & & & & & & & +&c.get(Calendar.SECOND)&+&&:&&&& & & & & & & & & & & & & & & & & & +&c.get(Calendar.MILLISECOND)&+&&Z&写入:&&&&& & & & & & & & & & & & & & & & & & +&i&*&1000;&&& & & & & & & & & & & & & & System.out.println(dateTime);&&& & & & & & & & & & & & }&&& & & & & & & & & & }&&& & & & & & & & };&&& & & & & & & & t.start();&&& & & & & & }&&& & & & }&catch&(IOException&e1)&{&&& & & & & & e1.printStackTrace();&&& & & & }&&& & }&&& &}&
& & 下面的是与HBase相关的操作,把它封装到一个类中,这里就只有建表与插入数据的相关代码。/*&&&*版权:王安琪&&&*描述:与HBase相关操作,建表与插入数据&&&*修改时间:&&&*修改内容:新增&&&*/&&package&hbaseI&&import&***;&&import&org.apache.hadoop.hbase.client.P&&& &public&class&HbaseInsert&{&&& && & public&static&void&createTable(Configuration&config,&String&tableName,&&& & & & & & String&columnFamily)&{&&& & & & HBaseAdmin&hBaseA&&& & & & try&{&&& & & & & & hBaseAdmin&=&new&HBaseAdmin(config);&&& & & & & & if&(hBaseAdmin.tableExists(tableName))&{&&& & & & & & & &&&& & & & & & }&&& & & & & & HTableDescriptor&tableDescriptor&=&new&HTableDescriptor(tableName);&&& & & & & & tableDescriptor.addFamily(new&HColumnDescriptor(columnFamily));&&& & & & & & hBaseAdmin.createTable(tableDescriptor);&&& & & & & & hBaseAdmin.close();&&& & & & }&catch&(MasterNotRunningException&e)&{&&& & & & & & e.printStackTrace();&&& & & & }&catch&(ZooKeeperConnectionException&e)&{&&& & & & & & e.printStackTrace();&&& & & & }&catch&(IOException&e)&{&&& & & & & & e.printStackTrace();&&& & & & }&&& & }&&& && & public&static&void&inputData(HTable&table,&ArrayList&Put&&puts)&{&&& & & & try&{&&& & & & & & table.put(puts);&&& & & & & & table.flushCommits();&&& & & & & & puts.clear();&&& & & & }&catch&(IOException&e)&{&&& & & & & & e.printStackTrace();&&& & & & }&&& & }&&}&
三、编写模拟数据Put
& & 向HBase中写入数据需要构造Put,下面是我构造模拟数据Put的方式,有字符串的生成,我是由mmseg提供的词典words.dic中随机读取一些词语连接起来,生成一句字符串的,下面的代码没有,不过很easy,你自己造你自己想要的数据就OK了。public&static&Put&createPut(String&columnFamily)&{&&& & & & String&ss&=&getSentence();&&& & & & byte[]&family&=&Bytes.toBytes(columnFamily);&&& & & & byte[]&rowKey&=&Bytes.toBytes(&&&+&Math.abs(r.nextLong()));&&& & & & Put&put&=&new&Put(rowKey);&&& & & & put.add(family,&Bytes.toBytes(&DeviceID&),&&& & & & & & & & Bytes.toBytes(&&&+&Math.abs(r.nextInt())));&&& & & & ******&&& & & & put.add(family,&Bytes.toBytes(&Company_mmsegsm&),&Bytes.toBytes(&ss&));&&& && & & & return&&&& & }&
& & 当然在运行上面这个程序之前,需要先在Solr里面配置好你需要的列信息,HBase、Solr安装与配置,它们的基础使用方法将会在之后的文章中 介绍。在这里,Solr的列配置就跟你使用createPut生成的Put搞成一样的列名就行了,当然也可以使用动态列的形式。
四、直接对Solr性能测试
& & 如果想对HBase与Solr的相结合进行测试,只想单独对Solr的性能进行测试,这就更简单了,完全可以利用上面的代码段来测试,稍微组装一下就可以了。private&static&void&sendConcurrentUpdateSolrServer(final&String&url,&&& & & & & & final&int&count)&throws&SolrServerException,&IOException&{&&& & & & SolrServer&solrServer&=&new&ConcurrentUpdateSolrServer(url,&10000,&20);&& & & & for&(int&i&=&0;&i&&&&i++)&{& & & solrServer.add(getInputDoc(PutCreater.createPut(columnFamily)));&& & & & }&& & }&
& & 希望可以帮助到你规格严格-功夫到家。这次的文章代码又偏多了点,但代码是解释思想的的语言,我的提倡就是尽可能的减少代码的注释,尽力简化你的代码,使你的代码足够的清晰易懂,甚至于相似于伪代码了,这也是《重构》这本书里所提倡的。
原文链接:/wgp13x/p/3927979.html
本站所有文章全部来源于互联网,版权归属于原作者。本站所有转载文章言论不代表本站观点,如是侵犯了原作者的权利请发邮件联系站长(yanjing@),我们收到后立即删除。
摘要: 由中国计算机协会(CCF)主办,CCF大数据专家委员会协办,中科院计算所与CSDN共同承办的第七届中国大数据技术大会(Big Data Technology Conference 2013,BDTC 2013) 将于-6日在北京世 &   由中国计算机协会(CCF)主办,CCF大数据专家委员会协办,中科院计算所与CSDN共同承办的第七届中国大数据技术大会(...
摘要: 新浪科技讯 7月25日下午消息,大数据技术公司百分点今日宣布完成第二轮1000万美元融资,投资方为东方星空创投和IDG资本,百分点同时发布新战略,由提供大数据技术进入到大数据管   新浪科技讯 7月25日下午消息,大数据技术公司百分点今日宣布完成第二轮1000万美元融资,投资方为东方星空创投和IDG资本,百分点同时发布新战略,由提供大数据技术进入到大数据管理与应用领域。   成立4年...
摘要: 随着美国中情局前雇员斯诺登将美国的棱镜计划公之于众,全球舆论鼎沸,斯诺登是不是叛国者,美国政府是否违宪,诸如此类的讨论热火朝天。棱镜门为人们反思大数据时代的个人隐 随着美国中情局前雇员斯诺登将美国的“棱镜”计划公之于众,全球舆论鼎沸,斯诺登是不是叛国者,美国政府是否违宪,诸如此类的讨论热火朝天。“棱镜门”为人们反思大数据时代的个人隐私与公共安全提供了一个范本,斯诺登潜逃、引渡以及政治...
阿里大数据梦
摘要: 为了迎接即将到来的大数据时代,各大互联网公司都在争分夺秒。阿里巴巴在公布大数据分享平台之后的半年中,也全面启动了攻势。但即使是这个行业的先行者,离大数据时代也还有 &为了迎接即将到来的大数据时代,各大互联网公司都在争分夺秒。阿里巴巴在公布大数据分享平台之后的半年中,也全面启动了攻势。但即使是这个行业的先行者,离大数据时代也还有不小的距离。& 刚刚过去的2012年,...
投资爱站网
摘要: 最开始知道蔡文胜投资爱站网的消息,是看到老郭在微信朋友圈发布的一条信息,后面看管鹏也有发,应该消息属实。 如图:5月30日老郭微信第一时间爆料,蔡文胜投资爱站的消息 消 最开始知道蔡文胜投资爱站网的消息,是看到老郭在微信朋友圈发布的一条信息,后面看管鹏也有发,应该消息属实。 如图:5月30日老郭微信第一时间爆料,蔡文胜投资爱站的消息 & & 消息经老郭和管鹏第一时...
摘要: 去年是云计算,今年是大数据。作为时下最流行的信息化标志,如今每个行业都在为自己具备大数据能力而作出努力。一时间,似乎不说自己有大数据基因,或者正在做着大数据相关的 去年是“云计算”,今年是“大数据”。作为时下最流行的信息化“标志”,如今每个行业都在为自己具备“大数据”能力而作出努力。一时间,似乎不说自己有“大数据”基因,或者正在做着“大数据”相关的事情,都觉得自己赶不上潮流了。但是最...
服务与支持
售前咨询:400-118-)
账号与支付
关注阿里云}

我要回帖

更多关于 hbase solr 协处理器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信