markdownspringboot整合hbase最佳实践(代码片段)

author author     2022-12-13     617

关键词:

## 为什么选择 Spring data hadoop
hbase 常见的操作方式有以下三种:

### Native Api
原生 api 操作繁琐,就像用 JDBC 操作关系型数据库一样,类似 flush、submit、close 的使用让人眼花缭乱。如果碰巧你的应用程序使用 java 开发,那就又多了一条不使用 Native Api 的理由 —— 在问题周围兜一个圈子再解决才是真正的 java 式设计。

### Phoenix
apache 提供的 phoenix 提供了 mybatis-like 的支持,帮你「隐藏」了行键的麻烦,还支持在 mapper 文件中像操作关系型数据库一样,直接创建某个字段的索引,以优化大量数据操作时可能产生的性能问题。

这实在是太「夸张」了。在我有限的认知中不记得 Hbase 原生支持这样的功能。尽管我的目的只是「简单的操作 Hbase」,却还是怀着对 phenix 项目的崇敬,下载了相关依赖导入项目中。

可是结果让我失望。hbase-client.jar、hbase-server.jar、phoenix-core .jar 这三者在导入项目后产生了大量的依赖冲突。在我尝试了各种冲突排查手段都无解正焦头烂额时,先哲的一句话将我从泥潭拉了出来:

> 当你在一件事情上遇到困难时,就放弃这件事。           —— 鲁迅

### Spring data hadoop
我的目的毕竟只是「简单的操作 Hbase」。而 spring data 使用 Hbase 所需配置不过一行,还没有讨厌的 checked exception,更不会提供某些「夸张」的功能,最重要的是没有依赖冲突!这些特点深深的打动了我。

## 如何配置 Spring data hadoop
**配置 spring data hadoop 分3步。**

**第一步:导入依赖包。**

exclusion 选项最好根据你自己的情况来配置,重点注意 hbase-client 相关的版本一定要使用 1.2.0 以上,不然可能会和项目中既存的 guava 包产生冲突。

```xml
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-hadoop</artifactId>
    <version>2.5.0.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>1.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>

```

**第二步:编写相关配置。**

[spring 官方文档 Working with HBase](https://docs.spring.io/spring-hadoop/docs/1.0.1.RC1/reference/html/hbase.html) 只提供了 xml 配置示例,这让我十分头疼,毕竟不是谁都有心情去看源码的。但考虑到 spring boot 的项目最好还是用 java configuration 为好,所以只好提供一个非官方配置供参考使用。

```java
public class HbaseConfiguration 
    @Bean
    public HbaseTemplate hbaseTemplate() 
        org.apache.hadoop.conf.Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "address1:port","address2:port");
        return new HbaseTemplate(configuration);
    


```

**第三步:开始运行。**
```java
public class HbaseTemplateTest extends BaseTest 

    @Autowired
    private HbaseTemplate hbaseTemplate;

    @Test
    public void hbaseTest() 
        hbaseTemplate.put("zl_test", "lch", "lch", "test", "test2".getBytes());
    

```


```shell
hbase(main):006:0> scan 'zl_test'
ROW                                          COLUMN+CELL
 lch                                         column=lch:test, timestamp=1556627058655, value=test2
1 row(s) in 0.2910 seconds

hbase(main):007:0>
```

## Row key 怎么办?

如果说放弃 phoenix 带来了什么麻烦的话,那就是我们得自己考虑行键问题了。


> 如果你的项目属于「用户消费内容」且不涉及「高并发」,那基本上可以跳过这一小节。
如果你的项目属于「用户生成内容」或涉及「高并发」那就要好好考虑行键设计。

### 为写优化

管理 hbase 数据的最小逻辑单元  region ,是按照 rowkey 字典顺序来进行分区划分的。当频繁写入某些连续字符时,可能会造成同一 region 下写入数据过多的情况。

比如,在一个「用户生成内容」的应用程序中,常常使用时间戳作为 rowkey,这样就可能造成同一时间段内大量数据被写入到一个 region 下,产生热点效应。

为了使我们的写入平均分配到各 region 中,必须对 rowkey 做出一些处理。一个简便的方式便是利用**散列算法与集群数量做加盐处理。**

```java
Long now = LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli();
String saltedInput = String.format("%s|%s", now.hashCode() % 6, now);
System.out.println(saltedInput);

sout:
4|1556729837940
```

大功告成,现在0~9会平均分配到不同的 region 分区上,避免了热点效应。

### 为读(扫描)优化

同样以「在一个用户生成内容的应用程序中使用时间戳作为 rowkey 的情况」作为示例。

为读(扫描)优化意味着你最好把所有的数据尽量放到同一个列族与同一个 region 分区中。
另外,使用倒序时间戳作为 rowkey 也是一个不错的选择。hfile 的有序特性使最新的时间戳数据总是保持在文件起始位,这样在读取操作时就避免了过多的硬盘读,也不需要做额外的排序工作。

### 到底应该为读还是为写?

回顾上面小节的内容,为写优化意味着在读操作上需要付出相应的代价。现在扫描操作不得不在所有的 region 分区上进行遍历了,这大大增加了 IO 开销。

而为读优化,和为写优化的做法背道而驰,容易造成写入时的热点效应。

是的,读与写无法同时兼顾。为了构建出完整的应用程序你需要做出取舍。

## 结语
虽然最终选择了使用 spring data 来操作 hbase,但这并不代表其他的方式都不好。每种工具都有自己的特点和不足,结合自己的实际情况做出选择才是最明智的做法。

hive与hbase关系整合

近期工作用到了Hive与Hbase的关系整合,虽然从网上参考了很多的资料,但是大多数讲的都不是很细,于是决定将这块知识点好好总结一下供大家分享,共同掌握! 本篇文章在具体介绍Hive与Hbase整合之前,先给大家用一个流程... 查看详情

hive与hbase关系整合

近期工作用到了Hive与Hbase的关系整合,虽然从网上参考了很多的资料,但是大多数讲的都不是很细,于是决定将这块知识点好好总结一下供大家分享,共同掌握!本篇文章在具体介绍Hive与Hbase整合之前,先给大家用一个流程图介... 查看详情

markdownspringboot自动配置原理(代码片段)

查看详情

markdownspringboot中的oracleucp配置(代码片段)

查看详情

hbase_hive整合

Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive_hbase-handler.jar工具类首先保证版本一致cd/home/hadoop/hive-1.1.0-cdh5.5.2/lib查看版本是否一致hbase-server-1.0.0-cdh5.5.2.jar zookeeper-3.4.5-cdh5.5.... 查看详情

markdownspringboot可运行的jar(代码片段)

查看详情

springboot整合hbase

前言作为大数据家族中的重要一员,在大数据以及海量数据存储方面,hbase具有重要的地方,本篇将从java对hbase的操作上,进行详细的说明;HBase定义HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库... 查看详情

markdownspringboot-配置富文本编辑器(代码片段)

查看详情

markdownspringboot#springboot#spring#java(代码片段)

查看详情

flume-0.9.4和hbase-0.96整合

...,还用说么?是的,我在本博客的《Flume-1.4.0和Hbase-0.96.0整合》文章中就提到如何用Flume和Hbase整合,从文章中就看出整个过程不太复杂,直接做相应的配置就行了。那么为什么今天还要特意提一下Flume-0.9.4和Hbase-0 查看详情

hbase高可用集群整合phoenix配置(代码片段)

HBase高可用集群整合Phoenix配置接上文:HBase高可用集群配置命令行参考:https://blog.csdn.net/ubuntu64fan/article/details/80832903整合phoenix虽然简单,但是有坑。按照官网(http://phoenix.apache.org/installation.html 查看详情

hive教程---整合hbase

目录6.4.1HBase与Hive的对比6.4.2HBase与Hive集成使用6.4.1HBase与Hive的对比Hive(1)数据仓库Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。(2)用于数据分析、清洗Hive适用于离线的数据... 查看详情

hive与hbase整合(代码片段)

Hive与Hbase整合1.文档  HiveHBaseIntegration 2.拷贝jar文件2.1.把Hbase的lib目录下面的jar文件全部拷贝到Hive的lib目录下面cd/home/hbase/libcp./*/home/hive/lib 2.2.把Hive的lib目录下面的hive-hbase-handler-0.13.1.jar拷贝到Hbase的lib目录下面cp/home/hiv... 查看详情

hive整合hbase

...源?? ??2.3构建低延时的数据仓库 环境准备????3.1hive与hbase整合环境配置修改hive-site.xml文件,添加配置属性(zookeeper的地址)[root@hadoop01conf]#vimhive-site.xml <property> <name>hbase.zookeeper.quorum</name> <value&... 查看详情

hbaseindexer整合solr

LilyHBaseIndexer提供了快速、简单的HBase的内容检索方案,它可以帮助你在Solr中建立HBase的数据索引,从而通过Solr进行数据检索。由于索引过程是异步的,所以并不影响HBase的写负载,同时借助SolrCloud可实现分布式索... 查看详情

spark:spark-sql读hbase

    SparkSQL是指整合了Hive的spark-sqlcli,本质上就是通过Hive访问HBase表,具体就是通过hive-hbase-handler,具体配置参见:Hive(五):hive与hbase整合 目录:SparkSql访问hbase配置测试验证SparkSql访问hbase配置: 拷贝HBase的相关j... 查看详情

hbasehbase和phoenix的整合

phoenix是Apache出的一个全文检索,能够更清晰的帮助hbase存储数据长篇幅预警!!!这一篇东西有点多,大家可以收藏学习!目录apachephoenix简介简介olap和oltpPhoenix的作用apachephoenix安装下载上传到服务器解压... 查看详情

使用hbaseindexer建立二级索引(整合最新版本的hbase1.2.6及solr7.2.1)(代码片段)

这段时间集成HBase,需要为HBase建立二级索引,方便数据的查询使用,Solr权威指南上面有Hbase与Solr的集成章节,照着书上以及网上的说明折腾了很近才配置成功,HBaseIndexer已经有1年多没有更新了,集成最新的HBase1.2.6,solr7.2.1有很多相关的... 查看详情