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

简介:

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

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

 
正如我的之前的博客“ Solr与HBase架构设计 http://http://www.cnblogs.com/wgp13x/p/a8bb8ccd469c96917652201007ad3c50.html中所述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<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()) {
                continue;
            }
            String fieldName = key.substring(key.indexOf(columnFamily) + 3,
                    key.indexOf(“”)).trim();
            doc.addField(fieldName, value);
        }
        return doc;

    }

 
二、编写测试程序入口代码main
 
这段代码向HBase请求建了一张表并将模拟的数据向HBase连续地提交数据内容在HBase中不断地插入数据同时记录时间测试插入性能。
 
/*
 *版权王安琪
 *描述测试HBaseInsertHBase插入性能
 *修改时间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<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 put;

    }

 
当然在运行上面这个程序之前需要先在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)));
        }

    }

 
 
希望可以帮助到你规格严格-功夫到家。这次的文章代码又偏多了点但代码是解释思想的最好的语言我的提倡就是尽可能的减少代码的注释尽力简化你的代码使你的代码足够的清晰易懂甚至于相似于伪代码了这也是《重构》这本书里所提倡的。
相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
11天前
|
存储 分布式计算 Hadoop
大数据处理架构Hadoop
【4月更文挑战第10天】Hadoop是开源的分布式计算框架,核心包括MapReduce和HDFS,用于海量数据的存储和计算。具备高可靠性、高扩展性、高效率和低成本优势,但存在低延迟访问、小文件存储和多用户写入等问题。运行模式有单机、伪分布式和分布式。NameNode管理文件系统,DataNode存储数据并处理请求。Hadoop为大数据处理提供高效可靠的解决方案。
33 2
|
3月前
|
存储 缓存 关系型数据库
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
阿里云RDS率先推出新型存储类型通用云盘,提供低延迟、低成本、高持久性的用户体验。
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
|
3月前
|
存储 缓存 固态存储
【vsan数据恢复】vsan分布式存储架构数据恢复案例
VSAN数据恢复环境: 一套有三台服务器节点的VSAN超融合基础架构,每台服务器节点上配置2块SSD硬盘和4块机械硬盘。 每个服务器节点上配置有两个磁盘组,每个磁盘组使用1个SSD硬盘作为缓存盘,2个机械硬盘作为容量盘。三台服务器节点上共配置6个磁盘组,共同组成VSAN存储空间,存放虚拟机文件。 需要恢复服务器节点上的数据库数据。 VSAN故障: 非正常关机导致VSAN逻辑架构出现故障,部分虚拟机磁盘组件出现问题,磁盘文件丢失。
|
2月前
|
存储 数据可视化 数据管理
基于阿里云服务的数据平台架构实践
本文主要介绍基于阿里云大数据组件服务,对企业进行大数据平台建设的架构实践。
714 2
|
4月前
|
SQL 存储 分布式计算
【大数据技术Hadoop+Spark】Hive数据仓库架构、优缺点、数据模型介绍(图文解释 超详细)
【大数据技术Hadoop+Spark】Hive数据仓库架构、优缺点、数据模型介绍(图文解释 超详细)
171 0
|
3月前
|
存储 关系型数据库 MySQL
Mysql 存储大数据量问题
Mysql 存储大数据量问题
91 1
|
2天前
|
敏捷开发 数据可视化 物联网
云效产品使用常见问题之用ARM架构的机器意义不知道如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
1月前
|
存储 Kubernetes 固态存储
IEEE HPCA 2024|LightPool:高性能、轻量级的存储池化架构
IEEE HPCA 2024|LightPool:高性能、轻量级的存储池化架构
|
1月前
|
存储 监控 容灾
TiDB存储层深入:分布式存储架构与数据一致性保障
【2月更文挑战第26天】本文将深入探讨TiDB的存储层,详细解析其分布式存储架构、数据复制机制以及数据一致性保障措施。通过了解存储层的核心组件和工作原理,我们可以更好地理解TiDB如何确保数据的可靠性、高可用性和可扩展性。本文将从存储层的架构、数据分布、容错机制等方面展开介绍,帮助读者全面掌握TiDB存储层的关键技术和优势。
|
2月前
|
存储 缓存 程序员
DP读书:鲲鹏处理器 架构与编程(三)高性能处理器的存储组织与片上互联
DP读书:鲲鹏处理器 架构与编程(三)高性能处理器的存储组织与片上互联
236 0