大数据架构-使用HBase和Solr配置存储与索引

HBase可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增、删、改索引的操作,这样就可以同时使用HBase存储量大和Solr检索性能高的优点了,更何况HBase和Solr都可以集群。这对海量数据存储、检索提供了一种方式,将存储与索引放在不同的机器上,是大数据架构的必须品。 2014-08-22 11:04:39 大数据架构 nginx,php-fpm,phpfastcgi,upstream实现负载均衡 应用的最前端是一台nginx服务器,所有静态的内容都由nginx来处理,而将所有php的请求都分摊到下游的若干台运行php fastcgi守护进程的服务器中,这样可以以一种廉价的方案来实现对系统负载的分摊,扩展系统的负载能力。 2014-08-22 10:36:37 nginx负载均衡 虚拟机备份克隆导致SQL Server出现IO错误 晚上收到数据库一封告警邮件SQL Server Alert System: 'Severity 016' occurred on \\xxxxx。本文将介绍错误修正过程。 2014-08-21 10:05:59 SQL Server 永远不要在Linux执行的10个最危险的命令 Linux命令行佷有用、很高效,也很有趣,但有时候也很危险,尤其是在你不确定你自己在正 在做什么时候。这篇文章并不打算引来你对Linux或linux 命令行的愤怒。我们只是想让你意识到在你运行某些命令时应该三思而后行。

HBase可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增、删、改索引的操作,这样就可以同时使用HBase存储量大和Solr检索性能高的优点了,更何况HBase和Solr都可以集群。这对海量数据存储、检索提供了一种方式,将存储与索引放在不同的机器上,是大数据架构的必须品。

HBase和Solr可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增、删、改索引的操作。将存储与索引放在不同的机器上,这是大数据架构的必须品,但目前还有很多不懂得此道的同学,他们对于这种思想感到很新奇,不过,这绝对是好的方向,所以不懂得抓紧学习吧。

有个朋友给我的那篇博客留言,说CDH也可以做这样的事情,我还没有试过,他还问我要与此相关的代码,于是我就稍微整理了一下,作为本篇文章的主要内容。关于CDH的事,我会尽快尝试,有知道的同学可以给我留言。

下面我主要讲述一下,我测试对HBase和Solr的性能时,使用HBase协处理器向HBase添加数据所编写的相关代码,及解释说明。

一、编写HBase协处理器Coprocessor

​一旦有数据postPut,就立即对Solr里相应的Core更新。这里使用了ConcurrentUpdateSolrServer,它是Solr速率性能的保证,使用它不要忘记在Solr里面配置autoCommit哟。

  1. /*
  2. *版权:王安琪
  3. *描述:监视HBase,一有数据postPut就向Solr发送,本类要作为触发器添加到HBase
  4. *修改时间:2014-05-27
  5. *修改内容:新增
  6. */
  7. packagesolrHbase.test;
  8. importjava.io.UnsupportedEncodingException;
  9. import***;
  10. publicclassSorlIndexCoprocessorObserverextendsBaseRegionObserver{
  11. privatestaticfinalLoggerLOG=LoggerFactory
  12. .getLogger(SorlIndexCoprocessorObserver.class);
  13. privatestaticfinalStringsolrUrl="http://192.1.11.108:80/solr/core1";
  14. privatestaticfinalSolrServersolrServer=newConcurrentUpdateSolrServer(
  15. solrUrl,10000,20);
  16. /**
  17. *建立solr索引
  18. *
  19. *@throwsUnsupportedEncodingException
  20. */
  21. @Override
  22. publicvoidpostPut(finalObserverContext<RegionCoprocessorEnvironment>e,
  23. finalPutput,finalWALEditedit,finalbooleanwriteToWAL)
  24. throwsUnsupportedEncodingException{
  25. inputSolr(put);
  26. }
  27. publicvoidinputSolr(Putput){
  28. try{
  29. solrServer.add(TestSolrMain.getInputDoc(put));
  30. }catch(Exceptionex){
  31. LOG.error(ex.getMessage());
  32. }
  33. }
  34. }

注意:getInputDoc是这个HBase协处理器Coprocessor的精髓所在,它可以把HBase内的Put里的内容转化成Solr需要的值。其中StringfieldName=key.substring(key.indexOf(columnFamily)+3,key.indexOf("我在这")).trim();这里有一个乱码字符,在这里看不到,请大家注意一下。

  1. publicstaticSolrInputDocumentgetInputDoc(Putput){
  2. SolrInputDocumentdoc=newSolrInputDocument();
  3. doc.addField("test_ID",Bytes.toString(put.getRow()));
  4. for(KeyValuec:put.getFamilyMap().get(Bytes.toBytes(columnFamily))){
  5. Stringkey=Bytes.toString(c.getKey());
  6. Stringvalue=Bytes.toString(c.getValue());
  7. if(value.isEmpty()){
  8. continue;
  9. }
  10. StringfieldName=key.substring(key.indexOf(columnFamily)+3,
  11. key.indexOf("")).trim();
  12. doc.addField(fieldName,value);
  13. }
  14. returndoc;
  15. }

二、编写测试程序入口代码main

​这段代码向HBase请求建了一张表,并将模拟的数据,向HBase连续地提交数据内容,在HBase中不断地插入数据,同时记录时间,测试插入性能。

  1. /*
  2. *版权:王安琪
  3. *描述:测试HBaseInsert,HBase插入性能
  4. *修改时间:2014-05-27
  5. *修改内容:新增
  6. */
  7. packagesolrHbase.test;
  8. importhbaseInput.HbaseInsert;
  9. import***;
  10. publicclassTestHBaseMain{
  11. privatestaticConfigurationconfig;
  12. privatestaticStringtableName="angelHbase";
  13. privatestaticHTabletable=null;
  14. privatestaticfinalStringcolumnFamily="wanganqi";
  15. /**
  16. *@paramargs
  17. */
  18. publicstaticvoidmain(String[]args){
  19. config=HBaseConfiguration.create();
  20. config.set("hbase.zookeeper.quorum","192.103.101.104");
  21. HbaseInsert.createTable(config,tableName,columnFamily);
  22. try{
  23. table=newHTable(config,Bytes.toBytes(tableName));
  24. for(intk=0;k<1;k++){
  25. Threadt=newThread(){
  26. publicvoidrun(){
  27. for(inti=0;i<100000;i++){
  28. HbaseInsert.inputData(table,
  29. PutCreater.createPuts(1000,columnFamily));
  30. Calendarc=Calendar.getInstance();
  31. StringdateTime=c.get(Calendar.YEAR)+"-"
  32. +c.get(Calendar.MONTH)+"-"
  33. +c.get(Calendar.DATE)+"T"
  34. +c.get(Calendar.HOUR)+":"
  35. +c.get(Calendar.MINUTE)+":"
  36. +c.get(Calendar.SECOND)+":"
  37. +c.get(Calendar.MILLISECOND)+"Z写入:"
  38. +i*1000;
  39. System.out.println(dateTime);
  40. }
  41. }
  42. };
  43. t.start();
  44. }
  45. }catch(IOExceptione1){
  46. e1.printStackTrace();
  47. }
  48. }
  49. }

​下面的是与HBase相关的操作,把它封装到一个类中,这里就只有建表与插入数据的相关代码。

  1. /*
  2. *版权:王安琪
  3. *描述:与HBase相关操作,建表与插入数据
  4. *修改时间:2014-05-27
  5. *修改内容:新增
  6. */
  7. packagehbaseInput;
  8. import***;
  9. importorg.apache.hadoop.hbase.client.Put;
  10. publicclassHbaseInsert{
  11. publicstaticvoidcreateTable(Configurationconfig,StringtableName,
  12. StringcolumnFamily){
  13. HBaseAdminhBaseAdmin;
  14. try{
  15. hBaseAdmin=newHBaseAdmin(config);
  16. if(hBaseAdmin.tableExists(tableName)){
  17. return;
  18. }
  19. HTableDescriptortableDescriptor=newHTableDescriptor(tableName);
  20. tableDescriptor.addFamily(newHColumnDescriptor(columnFamily));
  21. hBaseAdmin.createTable(tableDescriptor);
  22. hBaseAdmin.close();
  23. }catch(MasterNotRunningExceptione){
  24. e.printStackTrace();
  25. }catch(ZooKeeperConnectionExceptione){
  26. e.printStackTrace();
  27. }catch(IOExceptione){
  28. e.printStackTrace();
  29. }
  30. }
  31. publicstaticvoidinputData(HTabletable,ArrayList<Put>puts){
  32. try{
  33. table.put(puts);
  34. table.flushCommits();
  35. puts.clear();
  36. }catch(IOExceptione){
  37. e.printStackTrace();
  38. }
  39. }
  40. }

三、编写模拟数据Put

向HBase中写入数据需要构造Put,下面是我构造模拟数据Put的方式,有字符串的生成,我是由mmseg提供的词典words.dic中随机读取一些词语连接起来,生成一句字符串的,下面的代码没有体现,不过很easy,你自己造你自己想要的数据就OK了。

  1. publicstaticPutcreatePut(StringcolumnFamily){
  2. Stringss=getSentence();
  3. byte[]family=Bytes.toBytes(columnFamily);
  4. byte[]rowKey=Bytes.toBytes(""+Math.abs(r.nextLong()));
  5. Putput=newPut(rowKey);
  6. put.add(family,Bytes.toBytes("DeviceID"),
  7. Bytes.toBytes(""+Math.abs(r.nextInt())));
  8. ******
  9. put.add(family,Bytes.toBytes("Company_mmsegsm"),Bytes.toBytes("ss"));
  10. returnput;
  11. }

当然在运行上面这个程序之前,需要先在Solr里面配置好你需要的列信息,HBase、Solr安装与配置,它们的基础使用方法将会在之后的文章中介绍。在这里,Solr的列配置就跟你使用createPut生成的Put搞成一样的列名就行了,当然也可以使用动态列的形式。

四、直接对Solr性能测试

如果你不想对HBase与Solr的相结合进行测试,只想单独对Solr的性能进行测试,这就更简单了,完全可以利用上面的代码段来测试,稍微组装一下就可以了。

  1. privatestaticvoidsendConcurrentUpdateSolrServer(finalStringurl,
  2. finalintcount)throwsSolrServerException,IOException{
  3. SolrServersolrServer=newConcurrentUpdateSolrServer(url,10000,20);
  4. for(inti=0;i<count;i++){solrServer.add(getInputDoc(PutCreater.createPut(columnFamily)));
  5. }
  6. }

希望可以帮助到你规格严格-功夫到家。这次的文章代码又偏多了点,但代码是解释思想的***的语言,我的提倡就是尽可能的减少代码的注释,尽力简化你的代码,使你的代码足够的清晰易懂,甚至于相似于伪代码了,这也是《重构》这本书里所提倡的。

原文链接:http://www.cnblogs.com/wgp13x/p/3927979.html

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月6日 17:37
下一篇 2023年5月6日 17:37

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信