精华内容
下载资源
问答
  • hbase二级索引解决方案

    千次阅读 2018-06-13 10:39:31
    HBase建立二级索引的一些解决方式HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索。假设我们相对hbase里面列族的列列进行一些组合查询。就须要采用HBase的二级索引方案来进行多条件的查询。 常见的二级...

    HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索。

    假设我们相对hbase里面列族的列列进行一些组合查询。就须要采用HBase的二级索引方案来进行多条件的查询。 
    常见的二级索引方案有下面几种: 
    1.MapReduce方案 
    2.ITHBASE方案 
    3.IHBASE方案 
    4.Coprocessor方案 
    5.Solr+hbase方案

    MapReduce方案

    IndexBuilder:利用MR的方式构建Index 
    长处:并发批量构建Index 
    缺点:不能实时构建Index

    举例: 
    原表:

    row  1      f1:name  zhangsan
    row  2      f1:name  lisi
    row  3      f1:name  wangwu

    索引表:

    row     zhangsan    f1:id   1
    row     lisi        f1:id   2
    row     wangwu      f1:id   3

    Demo:

    package IndexDouble;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    import org.apache.commons.collections.map.HashedMap;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.client.HConnection;
    import org.apache.hadoop.hbase.client.HConnectionManager;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.client.Result;
    import org.apache.hadoop.hbase.client.Scan;
    import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
    import org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat;
    import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
    import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
    import org.apache.hadoop.hbase.mapreduce.TableMapper;
    import org.apache.hadoop.hbase.util.Bytes;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.util.GenericOptionsParser;
    
    
    public class IndexBuilder {
        private String rootDir;
        private String zkServer;
        private String port;
        private Configuration conf; 
        private HConnection hConn = null;
    
        private IndexBuilder(String rootDir,String zkServer,String port) throws IOException{
            this.rootDir = rootDir;
            this.zkServer = zkServer;
            this.port = port;
    
            conf = HBaseConfiguration.create();
            conf.set("hbase.rootdir", rootDir);
            conf.set("hbase.zookeeper.quorum", zkServer);
            conf.set("hbase.zookeeper.property.clientPort", port);
    
            hConn = HConnectionManager.createConnection(conf);  
        }
    
        static class MyMapper extends TableMapper<ImmutableBytesWritable, Put>{
    
            //记录了要进行索引的列
            private Map<byte[], ImmutableBytesWritable> indexes = new 
                    HashMap<byte[], ImmutableBytesWritable>();
    
            private String familyName;
    
            @Override
            protected void map(ImmutableBytesWritable key, Result value,
                    Context context) throws IOException, InterruptedException {
                //原始表列
                Set<byte[]> keys = indexes.keySet();
    
                //索引表的rowkey是原始表的列。索引表的列是原始表的rowkey
    
                for (byte[] k : keys){
    
                    //获得新建索引表的表名
                    ImmutableBytesWritable indexTableName = indexes.get(k);
    
                    //Result存放的是原始表的数据
                    //查找到内容             依据列族 和 列 得到原始表的值
                    byte[] val = value.getValue(Bytes.toBytes(familyName), k);
    
                    if (val != null) {
                        //索引表
                        Put put = new Put(val);//索引表行键
                        //列族  列   原始表的行键
                        put.add(Bytes.toBytes("f1"),Bytes.toBytes("id"),key.get());
                        context.write(indexTableName, put);
                    }
                }
    
            }
    
            //真正运行Map之前运行一些处理。

    @Override protected void setup(Context context) throws IOException, InterruptedException { //通过上下文得到配置 Configuration conf = context.getConfiguration(); //获得表名 String tableName = conf.get("tableName"); //String family = conf.get("familyName"); //获得列族 familyName = conf.get("columnFamily"); //获得列 String[] qualifiers = conf.getStrings("qualifiers"); for (String qualifier : qualifiers) { //建立一个映射,为每个列创建一个表,表的名字tableName+"-"+qualifier //原始表的列 索引表新建表名 indexes.put(Bytes.toBytes(qualifier), new ImmutableBytesWritable(Bytes.toBytes(tableName+"-"+qualifier))); } } } public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { String rootDir = "hdfs://hadoop1:8020/hbase"; String zkServer = "hadoop1"; String port = "2181"; IndexBuilder conn = new IndexBuilder(rootDir,zkServer,port); String[] otherArgs = new GenericOptionsParser(conn.conf, args).getRemainingArgs(); //IndexBuilder: TableName,ColumnFamily,Qualifier if(otherArgs.length<3){ System.exit(-1); } //表名 String tableName = otherArgs[0]; //列族 String columnFamily = otherArgs[1]; conn.conf.set("tableName", tableName); conn.conf.set("columnFamily", columnFamily); //列 可能存在多个列 String[] qualifiers = new String[otherArgs.length-2]; for (int i = 0; i < qualifiers.length; i++) { qualifiers[i] = otherArgs[i+2]; } //设置列 conn.conf.setStrings("qualifiers", qualifiers); @SuppressWarnings("deprecation") Job job = new Job(conn.conf,tableName); job.setJarByClass(IndexBuilder.class); job.setMapperClass(MyMapper.class); job.setNumReduceTasks(0);//因为不须要运行reduce阶段 job.setInputFormatClass(TableInputFormat.class); job.setOutputFormatClass(MultiTableOutputFormat.class); Scan scan = new Scan(); TableMapReduceUtil.initTableMapperJob(tableName,scan, MyMapper.class, ImmutableBytesWritable.class, Put.class, job); job.waitForCompletion(true); } }

    创建原始表
    hbase(main):002:0> create 'studentinfo','f1'
    0 row(s) in 0.6520 seconds
    
    => Hbase::Table - studentinfo
    
    
    hbase(main):003:0> put 'studentinfo','1','f1:name','zhangsan'
    0 row(s) in 0.1640 seconds
    
    hbase(main):004:0> put 'studentinfo','2','f1:name','lisi'
    0 row(s) in 0.0240 seconds
    
    hbase(main):005:0> put 'studentinfo','3','f1:name','wangwu'
    0 row(s) in 0.0290 seconds
    
    hbase(main):006:0> scan 'studentinfo'
    ROW                      COLUMN+CELL
     1                       column=f1:name, timestamp=1436262175823, value=zhangsan
     2                       column=f1:name, timestamp=1436262183922, value=lisi
     3                       column=f1:name, timestamp=1436262189250, value=wangwu
    3 row(s) in 0.0530 seconds
    创建索引表
    
    hbase(main):007:0> create 'studentinfo-name','f1'
    0 row(s) in 0.7740 seconds
    
    => Hbase::Table - studentinfo-name

    运行结果

    ITHBASE方案

    长处:ITHBase(Indexed Transactional HBase)是HBase的一个事物型的带索引的扩展。 
    缺点:须要重构hbase,几年没有更新。 
    http://github.com/hbase-trx/hbase-transactional-tableindexed

    IHBASE方案

    **长处:**IHBase(Indexed HBase)是HBase的一个扩展。用干支持更快的扫描。 
    缺点:须要重构hbase。 
    原理:在Memstore满了以后刷磁盘时。IHBase会进行拦截请求,并为这个memstore的数据构建索引。索引还有一个CF的方式存储在表内。scan的时候,IHBase会结合索引列中的标记。来加速scan。 
    http://github.com/ykulbak/ihbase

    Coprocessor方案

    HIndex–来自华为的HBase二级索引 
    http://github.com/Huawei-Hadoop/hindex

    The solution is 100% Java, compatible with Apache HBase 0.94.8, and is open sourced under ASL.

    Following capabilities are supported currently. 
    1.multiple indexes on table, 
    2.multi column index, 
    3.index based on part of a column value, 
    4.equals and range condition scans using index, and 
    5.bulk loading data to indexed table (Indexing done with bulk load).

    Solr+hbase方案

    Solr是一个独立的企业级搜索应用server,它对并提供相似干Web-service的API接口。用户能够通过http请求,向搜索引擎server提交一定格式的XML文件,生成索引。也能够通过Http Get操作提出查找请求,并得到XML格式的返回结果。


    Solr是一个高性能。採用Java5开发。基干Lucene的全文搜索server。同一时候对其进行了扩展。提供了比Lucene更为丰富的查询语言,同一时候实现了可配置、可扩展并对查询性能进行了优化,而且提供了一个完好的功能节理界面。是一款非常优秀的全文搜索引擎。

    HBase无可置疑拥有其优势,但其本身仅仅对rowkey支持毫秒级的高速检索,对于多字段的组合查询却无能为力。 
    基于Solr的HBase多条件查询原理非常easy。将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询高速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。 

    展开全文
  • 3,Forms验证下的一级域名和二级域名的登录同步  简要的说下     name="_aq"  timeout="60" domain=".xs.com" >    注意的几项 name domain 这两个选项在父子域名中必须相同  另外登录代码  ...

    1,对于域名a.a.com和域名http://www.a.com/的两个页面

      如果要在a.a.com使用AJAX访问http://www.a.com/的时候js 会提示"没有权限"

    这样的错误很明显,跨域了,在js当中跨域,怎么解决呢?

      发现在页面用Script来引用http://www.google.com/js/js.js 时却不会报错,所以就想了个转化的办法

     也是在网上查到的,人家称之为AJAJ技术,其实也是AJAX的一部分吧

     既然我要用script标签来引用外部js,那么肯定得有个<script>申明吧

     <head>

    <script src='' language='"javascript" id="get"></script>

    </head>

    好了,现在就可以在js中动态链接外部js了、

    button.click=function(){

    var doc=document.getElementById("get");

    doc.src='http://www.google.com/js/js.js';

    //如果'http://www.google.com/js/js.js'的内容是

    ----------------------------------------

    var p='你色吗';

    ----------------------------------------

    那么我就可以这样写了

    //这里注意点,不是IF

    (doc.readStatus==200)

          alert(p);

    整个源码示例:

     

     1 <HTML> 
     2 <HEAD> 
     3 <TITLE> New Document </TITLE> 
     4 <META NAME="Generator" CONTENT="EditPlus"> 
     5 <META NAME="Author" CONTENT=""> 
     6 <META NAME="Keywords" CONTENT=""> 
     7 <META NAME="Description" CONTENT=""> 
     8 </HEAD> 
     9 <SCRIPT LANGUAGE="JavaScript" src="" id="get"> 
    10 </SCRIPT> 
    11 <SCRIPT LANGUAGE="JavaScript"> 
    12 
    13 function get(url) 
    14 
    15 var obj = document.getElementById("get"); 
    16 obj.src = url; 
    17 (obj.readStatus == 200
    18 
    19 alert(xml); 
    20 
    21 
    22 function text() 
    23 
    24 get('get.php'); 
    25 
    26 
    27 </SCRIPT> 
    28 <BODY> 
    29 <INPUT TYPE="button" value="CLICK ME" onclick="text()"> 
    30 </BODY> 
    31 </HTML> 

     

     

    get.php的代码就是

    <? echo '你色吗?' ?>

     

    点击按钮,输出 “你色吗?”

    就这么简单,看起来比那个Ajax的简单吧

    这个是Ajax执行权限的跨域,另一个,cookie的跨域,这个很简单了

    2,cookie的跨域

    var main=".main.com"; //记着一定要加个“.”

    function setCookie(name,value,day)
    {
        var now=new Date();var ms;
        if(day>0){
        now.setTime(now.getTime()+(day*24*3600*1000));
        }
        document.cookie=name+"="+escape(value)+";expires="+now.toGMTString()+";path=/;domain="+main;
    }

    附上php跨域示例

         dotnet跨域示例 

    3,Forms验证下的一级域名和二级域名的登录同步

     简要的说下

     <authentication mode="Forms" >
         <forms defaultUrl="default.aspx" loginUrl="login.aspx" name="_aq"   timeout="60" domain=".xs.com" ></forms>
      </authentication>

     注意的几项 name domain 这两个选项在父子域名中必须相同

     另外登录代码

                        FormsAuthenticationTicket tic = new FormsAuthenticationTicket(uname, true, gettimeByvalue(time));
                        string entic = FormsAuthentication.Encrypt(tic);
                        HttpCookie h = new HttpCookie(FormsAuthentication.FormsCookieName, entic);
                        h.Expires = d;
                        h.Domain = FormsAuthentication.CookieDomain;
                        h.HttpOnly = true;
                        HttpContext.Current.Response.Cookies.Add(h);

     注意加红部分

    注销部分

           Context.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
            FormsAuthentication.SignOut();
            Response.Redirect("/");

     4,JSONP方式

       这里补上浪子兄的建议,使用JSONP突破跨域瓶颈

      理论上就是我上面说的方法,只是一些js框架都封装起来了

      就已jquery来做示例

     ajax方法:

    ExpandedBlockStart.gif代码
     $.ajax({
                 url:"show.aspx",
                 dataType:"jsonp",
                 jsonp:"jsoncallback",/*默认值:callback*/
                 success:function(data){
                     alert(data.mes);
                 }
            });

     

      show.aspx页面:

     

     Response.ContentType = "application/x-javascript";    
     
    string cb = Request.Params["jsoncallback"];
     Response.Write(cb 
    + "({mes:\"kofaslfj\"})");
     Response.End();

     

    getJSON方法:

    $.getJSON("show.aspx&callback=?",function (d){
             alert(d.mes);
            }
            );

     

    这个show.aspx与上面差不多一样,把jsoncallback换成callback就行了

    另外不知有人有不同域名跨域的解决方案,希望能够一起讨论...

     

     

     

     

     

    转载于:https://www.cnblogs.com/IT-Cristian/archive/2010/01/28/1658363.html

    展开全文
  • 360HBase二级索引方案学习总结

    千次阅读 2015-10-12 10:15:18
    在今年的北京QCon大会上,360公司的系统部技术经理赵健博在演讲中公布了360公司的HBase二级索引方案,这一方案的提出将比华为HBase二级索引更好的解决了Hbase的多维实时查询问题。它的核心思想是保证了索引和数据在...

    在今年的北京QCon大会上,360公司的系统部技术经理赵健博在演讲中公布了360公司的HBase二级索引方案,这一方案的提出将比华为HBase二级索引更好的解决了Hbase的多维实时查询问题。它的核心思想是保证了索引和数据在同一region上,减少了IO通信,提升了HBase的读性能,并且无非修改HBase源码,实现更加简单。

    360HBase二级索引公布的演讲视频:http://www.infoq.com/cn/presentations/qihoo360-hbase-two-stage-index-design-and-practice

    经过自己对其一段时间的学习和研究,列出一些总结如下:

            1、设计思想

    索引的思想依然是倒排索引的思想,即将需要查询的列作为索引数据的Rokwey,查询列所在记录的Rowkey作为索引数据的value。

    2、索引设计

    该方案是将索引与数据放在了同一个Region的不同family里。索引的Rowkey首字段是Region的startKey,它保证了索引和数据在同一个Region里,接下来是索引的类型INDEX,然后是建索引的列,最后是该列所在的记录的RowKey,索引的value是用来解析索引RowKey的反序列化信息。

    3、写路径

    几乎没变化。写数据时,先看索引说明里,看哪些列需要建索引,然后给这些列建立索引,将索引和数据都放在同一个put对象中。

    4、读路径

    先需要创建一个scanner,这里扩展了scanner对象,下面的一个框图代表一个Region。查询时先通过查询条件建立一棵检索树,然后通过检索树去找RowKey,最后通过RowKey去原表seek数据。


    5、分裂

    针对索引,产生一次分裂后,第一个daughter没有任何变化信息,第二个daughter的索引rowkey需要变更一下。


    6、与华为Hbase二级索引方案的比较

    7、性能

    7.1  单并发写入性能

    写代价的损失很小。

      7.2  检索性能数据


    展开全文
  • HBase建立二级索引的一些解决方案

    万次阅读 2015-07-07 22:09:01
    如果我们相对hbase里面列族的列列进行一些组合查询,就需要采用HBase的二级索引方案来进行多条件的查询。 常见的二级索引方案有以下几种: 1.MapReduce方案 2.ITHBASE方案 3.IHBASE方案 4.Coprocessor方案 5....

    HBase的一级索引就是rowkey,我们只能通过rowkey进行检索。如果我们相对hbase里面列族的列列进行一些组合查询,就需要采用HBase的二级索引方案来进行多条件的查询。
    常见的二级索引方案有以下几种:
    1.MapReduce方案
    2.ITHBASE方案
    3.IHBASE方案
    4.Coprocessor方案
    5.Solr+hbase方案

    MapReduce方案

    IndexBuilder:利用MR的方式构建Index
    优点:并发批量构建Index
    缺点:不能实时构建Index

    举例:
    原表:

    row  1      f1:name  zhangsan
    row  2      f1:name  lisi
    row  3      f1:name  wangwu

    索引表:

    row     zhangsan    f1:id   1
    row     lisi        f1:id   2
    row     wangwu      f1:id   3

    Demo:

    package IndexDouble;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    import org.apache.commons.collections.map.HashedMap;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.client.HConnection;
    import org.apache.hadoop.hbase.client.HConnectionManager;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.client.Result;
    import org.apache.hadoop.hbase.client.Scan;
    import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
    import org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat;
    import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
    import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
    import org.apache.hadoop.hbase.mapreduce.TableMapper;
    import org.apache.hadoop.hbase.util.Bytes;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.util.GenericOptionsParser;
    
    
    public class IndexBuilder {
        private String rootDir;
        private String zkServer;
        private String port;
        private Configuration conf; 
        private HConnection hConn = null;
    
        private IndexBuilder(String rootDir,String zkServer,String port) throws IOException{
            this.rootDir = rootDir;
            this.zkServer = zkServer;
            this.port = port;
    
            conf = HBaseConfiguration.create();
            conf.set("hbase.rootdir", rootDir);
            conf.set("hbase.zookeeper.quorum", zkServer);
            conf.set("hbase.zookeeper.property.clientPort", port);
    
            hConn = HConnectionManager.createConnection(conf);  
        }
    
        static class MyMapper extends TableMapper<ImmutableBytesWritable, Put>{
    
            //记录了要进行索引的列
            private Map<byte[], ImmutableBytesWritable> indexes = new 
                    HashMap<byte[], ImmutableBytesWritable>();
    
            private String familyName;
    
            @Override
            protected void map(ImmutableBytesWritable key, Result value,
                    Context context) throws IOException, InterruptedException {
                //原始表列
                Set<byte[]> keys = indexes.keySet();
    
                //索引表的rowkey是原始表的列,索引表的列是原始表的rowkey
    
                for (byte[] k : keys){
    
                    //获得新建索引表的表名
                    ImmutableBytesWritable indexTableName = indexes.get(k);
    
                    //Result存放的是原始表的数据
                    //查找到内容             根据列族 和 列 得到原始表的值
                    byte[] val = value.getValue(Bytes.toBytes(familyName), k);
    
                    if (val != null) {
                        //索引表
                        Put put = new Put(val);//索引表行键
                        //列族  列   原始表的行键
                        put.add(Bytes.toBytes("f1"),Bytes.toBytes("id"),key.get());
                        context.write(indexTableName, put);
                    }
                }
    
            }
    
            //真正运行Map之前执行一些处理。
            @Override
            protected void setup(Context context) throws IOException,
                    InterruptedException {
                //通过上下文得到配置
                Configuration conf = context.getConfiguration();
    
                //获得表名
                String tableName = conf.get("tableName"); 
                //String family = conf.get("familyName");
                //获得列族
                familyName = conf.get("columnFamily");
    
                //获得列
                String[] qualifiers = conf.getStrings("qualifiers"); 
    
                for (String qualifier : qualifiers) {
                    //建立一个映射,为每一个列创建一个表,表的名字tableName+"-"+qualifier
                    //原始表的列    索引表新建表名
                    indexes.put(Bytes.toBytes(qualifier), 
                            new ImmutableBytesWritable(Bytes.toBytes(tableName+"-"+qualifier)));
                }
    
            }   
        }
    
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    
            String rootDir = "hdfs://hadoop1:8020/hbase";
            String zkServer = "hadoop1";
            String port = "2181";
    
            IndexBuilder conn = new IndexBuilder(rootDir,zkServer,port);
    
            String[] otherArgs = new GenericOptionsParser(conn.conf, args).getRemainingArgs(); 
    
    
            //IndexBuilder: TableName,ColumnFamily,Qualifier
            if(otherArgs.length<3){
                System.exit(-1);
            }
            //表名
            String tableName = otherArgs[0];
            //列族
            String columnFamily = otherArgs[1];
    
            conn.conf.set("tableName", tableName);
            conn.conf.set("columnFamily", columnFamily);
    
            //列  可能存在多个列
            String[] qualifiers = new String[otherArgs.length-2];
    
            for (int i = 0; i < qualifiers.length; i++) {
                qualifiers[i] = otherArgs[i+2];
            }
    
            //设置列
            conn.conf.setStrings("qualifiers", qualifiers);
    
            @SuppressWarnings("deprecation")
            Job job = new Job(conn.conf,tableName);
    
            job.setJarByClass(IndexBuilder.class);
    
            job.setMapperClass(MyMapper.class);
            job.setNumReduceTasks(0);//由于不需要执行reduce阶段
    
            job.setInputFormatClass(TableInputFormat.class);
            job.setOutputFormatClass(MultiTableOutputFormat.class);
    
            Scan scan = new Scan();
            TableMapReduceUtil.initTableMapperJob(tableName,scan, 
                    MyMapper.class, ImmutableBytesWritable.class, Put.class, job);
    
            job.waitForCompletion(true);
    
        }
    }
    
    创建原始表
    hbase(main):002:0> create 'studentinfo','f1'
    0 row(s) in 0.6520 seconds
    
    => Hbase::Table - studentinfo
    
    
    hbase(main):003:0> put 'studentinfo','1','f1:name','zhangsan'
    0 row(s) in 0.1640 seconds
    
    hbase(main):004:0> put 'studentinfo','2','f1:name','lisi'
    0 row(s) in 0.0240 seconds
    
    hbase(main):005:0> put 'studentinfo','3','f1:name','wangwu'
    0 row(s) in 0.0290 seconds
    
    hbase(main):006:0> scan 'studentinfo'
    ROW                      COLUMN+CELL
     1                       column=f1:name, timestamp=1436262175823, value=zhangsan
     2                       column=f1:name, timestamp=1436262183922, value=lisi
     3                       column=f1:name, timestamp=1436262189250, value=wangwu
    3 row(s) in 0.0530 seconds
    创建索引表
    
    hbase(main):007:0> create 'studentinfo-name','f1'
    0 row(s) in 0.7740 seconds
    
    => Hbase::Table - studentinfo-name

    执行结果

    ITHBASE方案

    优点:ITHBase(Indexed Transactional HBase)是HBase的一个事物型的带索引的扩展。
    缺点:需要重构hbase,几年没有更新。
    http://github.com/hbase-trx/hbase-transactional-tableindexed

    IHBASE方案

    **优点:**IHBase(Indexed HBase)是HBase的一个扩展,用干支持更快的扫描。
    缺点:需要重构hbase。
    原理:在Memstore满了以后刷磁盘时,IHBase会进行拦截请求,并为这个memstore的数据构建索引,索引另一个CF的方式存储在表内。scan的时候,IHBase会结合索引列中的标记,来加速scan。
    http://github.com/ykulbak/ihbase

    Coprocessor方案

    HIndex–来自华为的HBase二级索引
    http://github.com/Huawei-Hadoop/hindex

    The solution is 100% Java, compatible with Apache HBase 0.94.8, and is open sourced under ASL.

    Following capabilities are supported currently.
    1.multiple indexes on table,
    2.multi column index,
    3.index based on part of a column value,
    4.equals and range condition scans using index, and
    5.bulk loading data to indexed table (Indexing done with bulk load).

    Solr+hbase方案

    Solr是一个独立的企业级搜索应用服务器,它对并提供类似干Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
    Solr是一个高性能,采用Java5开发,基干Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能节理界面,是一款非常优秀的全文搜索引擎。

    HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力。
    基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。

    展开全文
  • HBase二级索引实现方案

    千次阅读 2018-08-07 17:52:09
    关于使用hbase进行多维度条件实时查询的方案调研。  1.MapReduce方案  优点:并发批量构建Index  缺点:不能实时构建Index  2.ITHBASE方案 ... 华为的HBase二级索引采用此方案(hindex代码...
  • HBase二级索引方案

    万次阅读 多人点赞 2019-04-12 17:56:56
    HBase是个构建在HDFS之上,用于海量数据存储分布式列存储系统。 参见下图,由于在HBase中: 表的每行都是按照RowKey的字典序排序存储表的数据是按照RowKey区间进行分割存储成多个region 所以HBase主要适用下面...
  • AliOS Things 二级bootloader方案介绍

    千次阅读 2021-03-17 19:42:06
    bootloader不一定只有一个,有些操作系统有两级的bootloader,第一级bootloader和第二级bootloader分别完成不同的功能。 二级bootloader功能如下: 1)提供OTA升级运行环境 OTA的差分及压缩升级功能,需要一个与...
  • 华为的二级索引方案

    千次阅读 2014-06-12 15:59:01
    这个是华为的二级索引方案,已经开放源代码了,下面是网上的篇讲解原理的帖子,发出来和大家共享一下。经过本人认真阅读了一下代码,发现这个源码仅供参考,想要集成到原有的集群当中是有点儿难度的,它对hbase的...
  • 域名解析没问题,但是访问一级域名不能访问,但二级域名可以访问。 今天就遇到了这种问题,但是现在已经解决了。 写这个,希望可以帮到同样问题的朋友。。 =======================操作方法=================...
  • 3月24日 又是一年计算机二级 我报了C语言 就买了未来教育的书和软件进行学习 在下载VS C++2010 Express环境安装后 准备进行艰苦而卓绝的学习的时候 弹出了提示需要下载Service Pack 1 那就下载呗 点击了此处 结果...
  • 关于Mybatis关闭一级二级缓存

    万次阅读 2017-06-23 14:57:15
    但是Mybatis的各个SqlSession的默认一级缓存PerpetualCache不会在各SqlSession间共享,同时他存储下来sql语句和查询到的对象集,再第次查询的时候使用他内部的缓存,所以我决定要去掉这个缓存,以下为默认一级缓存的...
  • hbase-indexer add-indexer \ --name testIndex \ --indexer-conf /testhbase/cdhsolr/testIndex/conf/hbase-indexer/morphline-hbase-mapper.xml \ --connection-param solr.zk=c2:2181,c3:2181,c4:2181/solr \ ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 582,483
精华内容 232,993
关键字:

一级方案二级方案