文档章节

大数据架构-使用HBase和Solr将存储与索引放在不同的机器上

m
 miscellanea
发布于 2015/08/24 19:38
字数 1410
阅读 45
收藏 0
点赞 0
评论 0

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

关键词:    HBase,     Solr,     Coprocessor        大数据        架构  


 

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

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

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

 

 

一、编写HBase协处理器Coprocessor  

 

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

 

/*        

 *版权:王安琪        

 *描述:监视HBase,一有数据postPut就向Solr发送,本类要作为触发器添加到HBase        

 *修改时间:2014-05-27        

 *修改内容:新增        

 */        

package solrHbase.test;        

 

import java.io.UnsupportedEncodingException;        

 

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 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()) {        

                continue;        

            }        

            String fieldName = key.substring(key.indexOf(columnFamily) + 3,        

                    key.indexOf(" ")).trim();        

            doc.addField(fieldName, value);        

        }        

        return doc;        

    }

 

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

 

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

 

/*        

 *版权:王安琪        

 *描述:测试HBaseInsert,HBase插入性能        

 *修改时间:2014-05-27        

 *修改内容:新增        

 */        

package solrHbase.test;        

 

import hbaseInput.HbaseInsert;        

 

import ***;        

 

public class TestHBaseMain {        

 

    private static Configuration config;        

    private static String tableName = "angelHbase";        

    private static HTable table = null;        

    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(configtableNamecolumnFamily);        

        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相关操作,建表与插入数据        

 *修改时间:2014-05-27        

 *修改内容:新增        

 */        

package hbaseInput;        

import ***;        

import org.apache.hadoop.hbase.client.Put;        

 

public class HbaseInsert {        

 

    public static void createTable(Configuration config, String tableName,        

            String columnFamily) {        

        HBaseAdmin hBaseAdmin;        

        try {        

            hBaseAdmin = new HBaseAdmin(config);        

            if (hBaseAdmin.tableExists(tableName)) {        

                return;        

            }        

            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 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 put;        

    }

 

当然在运行上面这个程序之前,需要先在Solr里面配置好你需要的列信息,HBase、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 < count; i++) {        

            solrServer.add(getInputDoc(PutCreater.createPut(columnFamily)));        

        }        

    }

 


本文转载自:http://www.open-open.com/lib/view/open1410954480476.html

共有 人打赏支持
m
粉丝 6
博文 71
码字总数 22525
作品 0
海淀
当HBase与云邂逅,又碰撞出了什么样的火花?

摘要:阿里云HBase2.0也就是阿里云即将要上线的ApsaraDB for HBase2.0。它不仅兼容开源HBase2.0,也承载着阿里多年大规模HBase使用的技术积淀,还有广大公有云用户喜欢的商业化功能。在大数据...

萌萌怪兽 ⋅ 06/12 ⋅ 0

云HBaseSQL及分析-Phoenix&Spark

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

HBase技术社区 ⋅ 06/05 ⋅ 0

八年磨一剑,阿里云HBase做到性能和稳定性提升10倍!

6月6日,阿里云宣布云数据库HBase版 正式公测2.0版本。新2.0版本相比1.x版本通过架构级别的优化,在性能,稳定性相比1.x版本带来10x的提升,并结合阿里集团长达8年的实践经验,将HBase这个为...

所在jason ⋅ 06/12 ⋅ 0

八年磨一剑,阿里云ApsaraDB for HBase2.0正式上线

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

天斯 ⋅ 06/05 ⋅ 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

HBase 和 Hive 的差别是什么,各自适用在什么场景中?

https://www.zhihu.com/question/21677041/answer/185664626 先放结论:Hbase和Hive在大数据架构中处在不同位置: Hbase主要解决实时数据查询问题 Hive主要解决数据处理和计算问题,一般是配...

chenhao_asd ⋅ 04/24 ⋅ 0

白骑士基于阿里云HBase构建金融风控数据中心的使用实践

白骑士提供专业大数据风控SaaS服务 互联网金融业务经常遭受中介代办、团伙作案、消费者身份冒用、用户多平台申请、薅羊毛、虚假交易等风险问题。白骑士是一家提供专业大数据风控SaaS服务的公...

所在jason ⋅ 05/03 ⋅ 0

大数据时代数据库-云HBase架构&生态&实践

2018第九届中国数据库技术大会,阿里云高级技术专家、架构师封神(曹龙)带来题为大数据时代数据库-云HBase架构&生态&实践的演讲。主要内容有三个方面:首先介绍了业务挑战带来的架构演进,其...

云迹九州 ⋅ 05/21 ⋅ 0

Hbase的应用场景、原理及架构分析

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

xiangxizhishi ⋅ 2017/07/22 ⋅ 0

中国HBase技术社区第一届MeetUp-HBase2.0研讨圆桌会

HBase Committers&各公司HBase负责人 出席嘉宾(排名不分次序): 封神(HBase Committer,阿里) 天梧(HBase Committer,阿里) 陈恒(HBase Committer,蚂蚁金服) 李钰(HBase PMC,阿里) 王锋(奇...

wenzi0563 ⋅ 06/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部