ES整合HBase实现二级索引

前言;
es整合hbase实现二级索引的目的,只要是因为hbase不具备全文检索,只有rowkey是全局的唯一标识,在大量数据的前提下,想要根据字段进行检索,没办法利用rowkey就会出现效率低下的情况.刚好es具备全文检索的优良传统,两个优秀的框架注定是要擦出点火花来的.

设计思想: 在es中存储标题,在hbase 中存储正文

实现思路:
1.使用代码解析excel,读取excel的内容
2.将读取到的内容保存到es和hbase中去
3.搜索es中的字段,然后选择详细信息
4.通过hbase显示具体文件内容

es整合hbase步骤图

一:在es中构建索引库

PUT /articles
{  
    "settings":{  
         "number_of_shards":3,   //分片个数
         "number_of_replicas":1, //副本个数
         "analysis" : {
            "analyzer" : {
                "ik" : {      //ik分词器
                    "tokenizer" : "ik_max_word"  //分词器
                }
            }
        }
    }, 
    "mappings":{  
         "article":{   
             "dynamic":"strict",   //动静态
             "_source": {  //字段来源
               "includes": [
                  "id","title","from","readCounts","times"   //包含字段
                ],
               "excludes": [    //不包含字段
                  "content"    //不包含文章内容
               ]
             },
             "properties":{  //属性
                 "id":{"type": "keyword", "store": true},  //id,keyword类型,存储
                    //标题,text类型,存储,索引存储,使用ik分词器
                 "title":{"type": "text","store": true,"index" : true,"analyzer": "ik_max_word"}, 
                    //from字段, keyword类型,存储
                 "from":{"type": "keyword","store": true}, 
                    //readcounts字段,integer类型,存储
                 "readCounts":{"type": "integer","store": true},  
                    //文章内容,text类型,不存储,不做索引
                 "content":{"type": "text","store": false,"index": false},
                    //时间,keyword类型,不做索引
                 "times": {"type": "keyword", "index": false}
             }  
         }  
    }  
}

二:创建maven工程,导入依赖

<dependencies>
<!--解析excel文件-->
  <dependency>
  <groupId>org.apache.poi</groupId>
  <artif
<think>好的,我现在需要帮助用户设计一个基于HBase的标签数据存储方案。首先,回顾一下之前的对话,用户已经询问过画像数据和标签数据的存储方案,我之前提到了HBase作为实时查询场景的选择,现在用户明确想了解如何具体设计HBase来存储标签数据。同时,用户提供的引用内容提到了HBase的配置、二级索引、Rowkey设计以及数据一致性等问题,这些都是需要整合到设计方案中的关键点。 首先,我需要明确用户的需求。他们可能是在处理用户画像,需要存储大量动态变化的标签,并且可能需要高效的读写能力,尤其是在实时查询场景下。同时,用户提到HBase无法像关系型数据库那样进行多条件查询,因此需要考虑二级索引,比如结合Elasticsearch。 接下来,我应该从以下几个方面入手: 1. **Rowkey设计**:这是HBase的核心,影响数据分布和查询效率。引用3提到Rowkey过长会影响缓存效率,所以需要合理设计。可能的方案包括组合用户ID和标签类型,同时进行哈希处理以避免热点问题。 2. **二级索引**:引用2和4都提到HBase需要二级索引来支持复杂查询,因此需要引入Elasticsearch来存储索引数据,确保快速的多条件查询。 3. **存储结构优化**:考虑列族的设计,使用短列名减少存储开销,以及数据压缩等方法提升性能。 4. **数据更新与一致性**:引用5提到数据一致性的问题,需要设计同步机制,确保HBaseES的数据一致,可能通过消息队列如Kafka进行异步同步。 5. **性能调优**:包括缓存配置(BlockCache和MemStore)、预分区策略以及压缩算法选择,如Snappy或LZO。 此外,用户可能关心如何实际应用这些设计,例如具体的配置示例、代码片段或者架构图,所以需要提供具体的例子,比如Rowkey的构建方法,或者HBaseES的同步流程。 需要确保回答结构清晰,分点列出,并且参考之前的引用内容,比如引用1中的WAL配置,虽然用户当前的问题可能不直接涉及,但可以作为存储优化的一个方面提及。 最后,验证整个设计是否解决了用户的核心问题:高效存储和查询标签数据,支持多条件查询,保证数据一致性,并且具备良好的扩展性和性能。</think>以下是根据HBase特性设计的标签数据存储方案,结合性能优化与查询需求,重点解决二级索引、Rowkey设计和数据一致性等问题: --- ### 一、Rowkey核心设计原则 1. **组合键结构** $$ \text{Rowkey} = \text{MD5(user_id)[0:4]} + \vert\vert \text{user_id} \vert\vert \text{tag_type} $$ - **哈希前缀**:对user_id前4位MD5哈希,解决数据倾斜问题[^3] - **业务拼接**:固定长度user_id(如补零到18位)+标签类型编码(2位数字) - **示例**:`a3b9150000000123456701`(01代表基础属性标签) 2. **动态标签处理** ```java // 时间戳倒序拼接,支持最新标签快速查询 String rowkey = HashPrefix(user_id) + user_id + tag_type + (Long.MAX_VALUE - timestamp) ``` --- ### 二、存储结构设计 #### 1. 表结构定义(HBase Shell) ```shell create 'user_tags', {NAME => 'cf', VERSIONS => 1, COMPRESSION => 'SNAPPY', BLOOMFILTER => 'ROW'}, {SPLITS => ['1000','2000','3000']} ``` - **列族设计**:单列族`cf`,避免跨列族查询开销 - **压缩优化**:Snappy压缩减少磁盘占用30%+ - **预分区**:按哈希前缀预建16个分区 #### 2. 数据存储格式 | Rowkey | 列标识(Qualifier) | 值(Value) | 时间戳 | |-------------------|-------------------|------------------|------------| | a3b9150000000123456701 | gender | male | 1697011200 | | c8d215000000098765432102 | last_login | 2023-10-01 | 1697011200 | --- ### 三、二级索引方案(HBase+ES协同) #### 1. 架构流程 ```mermaid graph LR A[HBase写入] --> B{Kafka} B --> C[Flink实时消费] C --> D[ES索引构建] D --> E[ES索引存储] ``` #### 2. ES索引映射 ```json { "mappings": { "properties": { "user_id": {"type": "keyword"}, "tags": { "type": "nested", "properties": { "tag_name": {"type": "keyword"}, "tag_value": {"type": "keyword"} } } } } } ``` #### 3. 数据同步保障 - **双写校验**:通过HBase协处理器(Coprocessor)触发ES写入[^5] - **补偿机制**:定时扫描HBaseES差异数据 - **版本控制**:在Value中存储数据版本号 --- ### 四、性能优化措施 1. **缓存策略** ```xml <!-- 提升BlockCache命中率 --> <property> <name>hfile.block.cache.size</name> <value>0.4</value> </property> ``` 2. **写入优化** - 批量Put:每批次提交1000条记录 - WAL异步写入:`Mutation.setDurability(Durability.SKIP_WAL)` 3. **查询加速** ```java // 使用FilterList组合查询 FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("gender"), CompareOperator.EQUAL, Bytes.toBytes("male"))); ``` --- ### 五、数据治理方案 1. **TTL设置** ```shell alter 'user_tags', {NAME => 'cf', TTL => '15552000'} # 6个月自动过期 ``` 2. **冷热分离** - 热数据:SSD磁盘,保留最近3个月数据 - 冷数据:HDD磁盘,COALESCED压缩存储 3. **监控指标 - RegionServer的MemStore使用率(阈值85%) - Compaction队列堆积告警 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值