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

*修改时间: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安装与配置,它们的基础使用方法将会在之后的文章中介绍。在这里,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)));

}

}

转载于:https://my.oschina.net/u/1377774/blog/496555

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

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

    大数据架构-使用HBase和Solr配置存储与索引 2014-08-22 11:04 王安琪 博客园 字号:T | T HBase可以通过协处理器Coprocessor的方式向Solr发出请求,Sol ...

  2. 云原生大数据架构中实时计算维表和结果表的选型实践

    简介: 随着互联网技术的日渐发展.数据规模的扩大与复杂的需求场景的产生,传统的大数据架构无法承载. 作者 | 志羽 来源 | 阿里技术公众号 一 前言 传统的大数据技术起源于 Google 三架马车 ...

  3. 【企业架构设计实战】5 大数据架构设计

    数据架构概述 什么是数据? 一个企业的数字化核心是数据,数据化的价值依赖于数据的标准和质量,数据对一个企业来说至关重要,它也是整个信息化建设及企业架构的核心.数据具有多样性,有结构化的.非结构化的,与 ...

  4. 大数据架构师在关注什么?

    大数据架构师在关注什么? 在一个大数据团队中,大数据架构师主要关注的核心问题就是技术架构选型问题.架构选型问题一般会受到哪些因素的影响呢?在我们的实践中,一般大数据领域架构选型最受以下几个因素影响: ...

  5. python架构师工作职责_大数据架构师工作的岗位职责

    大数据架构师负责研发技术发展方向,新技术领域的探索,将新技术应用到公司大数据平台,提升公司效能.下面是学习啦小编整理的大数据架构师工作的岗位职责. 大数据架构师工作的岗位职责1 职责: 1.负责大数据 ...

  6. 大数据架构师应该做到的

    ---- github地址 ---- 关于软实力部分同步会更新场景落地 ---- 直接访问ProcessOn脑图 请点击 ---- 高清大图 ---- 脑图文件 技能图 大数据架构师该掌握的技能 主要 ...

  7. 大数据架构+Lamba+Kappa+Unifield

    大数据架构+Lamba+Kappa+Unifield 前端+主数据服务(MDS)+后端 Tomcat  HBase ElasticSearch Pig Oozie Node.js JQuery 数据分 ...

  8. 大数据数据收集数据困难_大数据架构、大数据开发与数据分析的区别

    是新朋友吗?记得先点蓝字关注我哦- 今日课程菜单 Java全栈开发 | Web前端+H5 大数据开发 | 数据分析  人工智能+Python | 人工智能+物联网 来源:小职(z_zhizuobiao ...

  9. 大数据架构师基础:hadoop家族,Cloudera产品系列等各种技术

    大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来.为了能够更好的架构大数据项目,这里整理一下,供技术人员,项目经理,架构师选 ...

最新文章

  1. 对复杂业务组件在实际开发过程中被调用的反思
  2. 柱状图中xy轴怎么出现_烤烟烘烤中出现叶片发霉怎么办?
  3. PEOPEO中国区总经理于景:当我谈交互设计时我谈些什么
  4. C# 文件流 导入 导出
  5. DeepMind 的马尔可夫决策过程(MDP)课堂笔记
  6. 剑指offer之机器人的运动轨迹
  7. 可重组合与不相邻组合
  8. Ubuntu 14.04 无线网卡驱动安装
  9. 病毒 Worm.Logo.g
  10. android service 接收广播,【11-16求助】急急急,service中无法接收广播!
  11. 如何将.sql文件导入数据库
  12. 30系列显卡安装tensorflow1.15
  13. xxx is not in the sudoers file. This incident will be reported.解決方法
  14. 防止恶意刷新页面的Java实现
  15. matlab数值微分与数值积分
  16. 案例分析——2020春HIT网络与社会导论
  17. 探索学习:网红容器引擎Docker
  18. 4.18、TCP滑动窗口
  19. 怎么办理质量管理体系认证证书ISO9001?
  20. threeJS对光有反应的材质

热门文章

  1. Kotlin基础(三)
  2. springboot健康饮食
  3. linux 64位系统最新版,CentOS下载_CentOSX64官方正式64位下载4.7 - 系统之家
  4. Anolis OS8.6QU1通过cephadm部署ceph17.2.0分布式块存储(六)部署iscsi服务
  5. 机器视觉LED光源类型及技术简介
  6. 智能办公峰会亮剑 慧点科技让智能OA具有“魂”
  7. 边界值测试实战:关于佣金计算问题
  8. WeTest明星工具-移动端性能测试PerfDog初探
  9. 6 流水线处理器题库
  10. 三星加入android11beta计划,基于Android 11:三星OneUI3.0升级计划公布