SpringBoot 搭建HBase 数据服务API接口

HBase 工具 | hbase-sdk 推出HQL功能 hbase-sdk 基于HBase Client的相关API开发而来的一款轻量级的HBase ORM框架。提供SQL查询功能,以类SQL的方式——HQL读写HBase数据。???? 针对HBase 1.x和2.xAPI的不同之处,在其上做了一层统一的封装。 hbase-sdk分为spring-boot-starter-hbase和hbase-sdk-core两部分。 SpringBoot项目中引入spring-boot-starter-hbase,在普通的Java项目中则可以使用hbase-sdk- 阅读详情

SpringBoot 搭建HBase 数据对外服务http API接口

1. 背景

  1. 在大数据开发中,数据分析结果在公司内部从数据查询速度要求来看分为2种,一种是不太在乎速度,在时间期限之前给到即可;一种是查询速度要求较高。
  2. 应对查询速度较高的,有2种思路。一种是提前计算好,然后存入数据查询较快的数据库中;一种是采用高速计算引擎,当场计算。
  3. 提前计算好的数据,如果数据规模较小,如亿条数据级别,可以使用如mysql集群应对。当数据再大时,使用Hbase,elasticsearch等就可以纳入技术选型视野。
  4. 本文讲述使用springboot搭建一个简单服务,对外以http API接口方式对外提供数据访问服务。
    注意,HBase其实并不是传统意义上的数据库,本质上使用HBase一般数据读取远大于写入,一般是一次写入多次读取

2. 案例

  1. 环境
  • idea 2020
  • maven 3.6.3
  • scala 2.11
  • jdk 1.8
  • pom文件
<!-- 属性定义,可以理解为定了一些变量 -->
    <properties>
        <java.version>1.8</java.version>
        <spark.version>2.4.4</spark.version>
        <scala.version>2.11.12</scala.version>
        <hadoop.version>3.1.0</hadoop.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>2.0.4</version>
        </dependency>



    </dependencies>


    <repositories>
        <repository>
            <id>nexus-aliyun</id>
            <name>Nexus aliyun</name>
            <layout>default</layout>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
            <snapshots>
                <enabled>false</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>ali-plugin</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <snapshots>
                <enabled>false</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
        </pluginRepository>
    </pluginRepositories>

    <build>
        <plugins>
            <!-- 指定编译java的插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <!-- 指定编译scala的插件 -->
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.2.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                        <configuration>
                            <args>
                                <arg>-dependencyfile</arg>
                                <arg>${project.build.directory}/.scala_dependencies</arg>
                            </args>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>


    </build>
  1. 代码层级
    典型的mvc架构,controller,service,dao,pojo,util四层
    在这里插入图片描述
  2. 代码
  • controller
@RestController
public class SessionAgrQueryController {

    @Autowired
    SessionAgrService sessionAgrService;

    @RequestMapping("/session/agr")
    public List<SessionAgrBean> getSessions(String dt,String startRow,Integer limit) throws Exception {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(dt);
        long ts = date.getTime();

        List<SessionAgrBean> beanList = sessionAgrService.getSessions(ts, startRow, limit);

        return beanList;
    }


}
  • dao
public interface SessionAgrDao {

    public List<HashMap<String, String>> getSessions(Long ts, String start_row, int limit) throws Exception;
}
@Repository
public class SessionAgrDaoImpl implements SessionAgrDao {

    @Override
    public List<HashMap<String, String>> getSessions(Long ts,String start_row,int limit) throws Exception {
        Connection conn = GetHbaseConnection.getConnection();
        Table tb = conn.getTable(TableName.valueOf("session_agr"));

        Scan scan = new Scan();
        scan.withStartRow(Bytes.toBytes(start_row));
        scan.setLimit(limit);

        ResultScanner resultScanner = tb.getScanner(scan);
        Iterator<Result> iter = resultScanner.iterator();

        ArrayList<HashMap<String, String>> beanLst = new ArrayList<>();

        // 迭代每一行结果
        while(iter.hasNext()){
            Result result = iter.next();

            HashMap<String, String> columnsMap = new HashMap<>();

            // 迭代一行中的每一列
            CellScanner cellScanner = result.cellScanner();
            while(cellScanner.advance()){
                Cell cell = cellScanner.current();
                byte[] valueBytes = CellUtil.cloneValue(cell);
                byte[] qualifierBytes = CellUtil.cloneQualifier(cell);
                columnsMap.put(new String(qualifierBytes),new String(valueBytes));
            }

            beanLst.add(columnsMap);
        }


        return beanLst;
    }
}
  • pojo
public class SessionAgrBean {

    private String guid             ;
    private String session_id       ;
    private String start_ts         ;
    private String end_ts           ;
    private String first_page_id    ;
    private String last_page_id     ;
    private String pv_cnt           ;
    private String isnew            ;
    private String hour_itv         ;
    private String country          ;

    private String province         ;
    private String city             ;
    private String region           ;
    private String device_type      ;
    private String dt               ;
    
    public String getGuid() {
        return guid;
    }

    public void setGuid(String guid) {
        this.guid = guid;
    }

    public String getSession_id() {
        return session_id;
    }

    public void setSession_id(String session_id) {
        this.session_id = session_id;
    }

    public String getStart_ts() {
        return start_ts;
    }

    public void setStart_ts(String start_ts) {
        this.start_ts = start_ts;
    }

    public String getEnd_ts() {
        return end_ts;
    }

    public void setEnd_ts(String end_ts) {
        this.end_ts = end_ts;
    }

    public String getFirst_page_id() {
        return first_page_id;
    }

    public void setFirst_page_id(String first_page_id) {
        this.first_page_id = first_page_id;
    }

    public String getLast_page_id() {
        return last_page_id;
    }

    public void setLast_page_id(String last_page_id) {
        this.last_page_id = last_page_id;
    }

    public String getPv_cnt() {
        return pv_cnt;
    }

    public void setPv_cnt(String pv_cnt) {
        this.pv_cnt = pv_cnt;
    }

    public String getIsnew() {
        return isnew;
    }

    public void setIsnew(String isnew) {
        this.isnew = isnew;
    }

    public String getHour_itv() {
        return hour_itv;
    }

    public void setHour_itv(String hour_itv) {
        this.hour_itv = hour_itv;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getDevice_type() {
        return device_type;
    }

    public void setDevice_type(String device_type) {
        this.device_type = device_type;
    }

    public String getDt() {
        return dt;
    }

    public void setDt(String dt) {
        this.dt = dt;
    }

    

}
  • service
public interface SessionAgrService {

    public List<SessionAgrBean> getSessions(Long ts, String startRow, int limit) throws Exception;
}
@Service
public class SessionAgrServiceImpl implements SessionAgrService {

    @Autowired
    SessionAgrDao sessionAgrDao;

    @Override
    public List<SessionAgrBean> getSessions(Long ts,String startRow,int limit) throws Exception {

        List<HashMap<String, String>> sessions = sessionAgrDao.getSessions(ts, startRow, limit);

        ArrayList<SessionAgrBean> beanList = new ArrayList<>();
        for (HashMap<String, String> sessionMap : sessions) {
            SessionAgrBean bean = new SessionAgrBean();
            bean.setCity(sessionMap.get("city"));
            bean.setCountry(sessionMap.get("country"));
            bean.setDevice_type(sessionMap.get("device_type"));
            bean.setDt(sessionMap.get("dt"));
            bean.setEnd_ts(sessionMap.get("end_ts"));
            bean.setFirst_page_id(sessionMap.get("first_page_id"));
            bean.setGuid(sessionMap.get("guid"));
            bean.setHour_itv(sessionMap.get("hour_itv"));
            bean.setIsnew(sessionMap.get("isnew"));
            bean.setLast_page_id(sessionMap.get("last_page_id"));
            bean.setPv_cnt(sessionMap.get("pv_cnt"));
            bean.setRegion(sessionMap.get("region"));
            bean.setSession_id(sessionMap.get("session_id"));
            bean.setStart_ts(sessionMap.get("start_ts"));

            beanList.add(bean);
        }

        return beanList;
    }

}
  • util
public class GetHbaseConnection {

    private static Connection conn;

    public static Connection getConnection() throws IOException {

        if (conn == null) {
            synchronized ("lock") {
                if(conn == null) {
                    Configuration conf = HBaseConfiguration.create();
                    conf.set("hbase.zookeeper.quorum", "doit01,doit02,doit03");
                    conn = ConnectionFactory.createConnection(conf);
                }
            }
        }
        return conn;
    }
}

3. 效果

  1. 本地运行,就可以访问集群上HBase的数据
  2. 注意,需要先启动zookeeper和hbase,hdfs
  3. 如果需要对外提供服务,可以打成jar包,在linux服务器上运行即可

4. 总结

  1. 不管是什么接口服务器,本质都是运行一个程序,部署在服务器上通过地址端口对外提供服务
  2. 使用springboot可以快速开发一个简单接口,不过本案例相对简单,一些代码规范和细节点并没有完全遵守严格开发规范。只是实现了目的,并不算规范,仅供参考
  3. JDBC应用广泛,大部分数据存储服务框架和数据计算框架都提供了JDBC接口,可以很方便使用JDBC进行功能调用。Java确实是工程化语言老大
  4. 本案例还是使用最经典也是最老的代码分层,MVC架构。各个公司可能会使用更新的架构。注意这些层级中注解的使用,不过这是springboot基本用法,注意即可。
  5. 注意,接口的使用,这里主要是用来约束接口方法,方便后续开发和维护,代码也会更加清晰。
springboot 整合hbase 阅读详情

相关推荐

小红书分享链接失效?教你永久保存笔记的2种方法(含API调用技巧)

本文详细解析了小红书笔记链接失效的原因,并提供了两种永久保存笔记的方法,包括短链接转换API调用技巧和本地归档技术。通过Python代码示例和工具推荐,帮助用户实现笔记内容的高效保存和管理,确保珍贵内容不再丢失。

gin88的博客 2769

springboot如何连接hbase并实现简单查询

application.yml添加配置 hbase: zookeeper: quorum: zkip parent: /hbase(默认) client: username:用户名 password:密码 创建config @org.springframework.context.annotation.Configuration public class HbaseConfig { private static final Logger log =.

lepgon的博客 2078

保姆级教程:用Kalibr搞定Intel D435i三目(RGB+双目)相机联合标定,附完整ROSbag录制避坑指南

本文详细介绍了如何使用Kalibr工具对Intel D435i三目相机(RGB+双目)进行高精度联合标定,包括硬件准备、ROSbag录制技巧、Kalibr标定实战及结果验证。特别针对实际工程中的常见问题提供了解决方案,帮助开发者提升SLAM和三维重建等应用的精度。

weixin_42524762的博客 405

【收藏】Spring Boot项目中使用最新版HBase Java API操作HBase 2.x详解

https://www.zifangsky.cn/1286.html

学亮编程手记 563

VS2022跨平台开发实战:SSH远程调试Linux程序全攻略

本文详细介绍了如何使用Visual Studio 2022进行跨平台开发,通过SSH协议远程调试部署在Linux服务器上的C/C++程序。文章提供了从环境搭建、连接配置、项目创建到编译调试的完整实战指南,帮助Windows开发者无缝衔接Linux环境,显著提升问题定位与开发效率。

weixin_28826521的博客 431

python音频信号分析

声音以具有诸如频率、带宽、分贝等参数的音频信号的形式表示,典型的音频信号可以表示为幅度和时间的函数

MAY的博客 2787

Springboot整合HBase开发

操作hbase的客户端有以下几种方式:1、原生HBase API:hbase-client 比较底层,需要自己进一步封装api,而且版本号和安装的hbase也要匹配,否则会报错2、Spring's HBase API:spring-data-hadoop2019年4月5停止维护3、Phoenix、Spark等:Apache Phoenix 使用SQL的方式来操作HBase。

csdnzhang365的博客 1068

调节桌面图标大小的方法(编程)

如果你对其他操作系统或编程语言有类似的需求,可以根据具体的情况进行相应的调整和搜索相关的库和方法。在编程中,我们可以使用各种桌面应用程序来调节桌面图标的大小。库提供的函数,我们获取了桌面图标的窗口句柄,并使用Windows消息发送方式设置图标的大小。你可以根据自己的需求修改代码中的图标大小值,并在运行代码后观察桌面图标的变化。函数并传入所需的图标大小,这里设置为48x48像素。首先,我们需要使用Python的第三现的方法。首先,我们需要使用Python的第三方库。首先,我们需要使用实现的方法。

CyberFlare的博客 439

hbase数据读取优化_SpringBoot读取Hbase数据并提供接口

一 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者数据开发人员应该是需要具备spr...

weixin_35588980的博客 681

WPS Office JS宏实现文件和数据的上传及下载

WPS Office JS宏下载、上传文件;通过加载项实现数据的获取和上传。

学点笔记 4300

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SpringBoot整合HBase

本文演示SpringBoot整合HBase。 一、项目搭建 新建一个SpringBoot项目,引入依赖: <properties> <java.version>1.8</java.version> <hbase.version>2.1.0</hbase.version> </properties> <dependencies> ...

SeeYouAgain的博客 1027

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Mac OS环境下 SpringBoot实现获取Hbase的数据并提供接口

先上结果图: 本文参考:https://my.oschina.net/u/4631230/blog/4671556 一、创建一个SpringBoot的工程,选择Dependencies->Web 我修改了版本为1.0.0,理论上版本无影响 二、创建的工程目录如下: 以上目录中,HelloController和TestOne是测试SpringBoot和Hbase的,在之前的博文中也有介绍,此处不再赘述,其余的是本项目中的分层结构。 三、Hbase的准备 新建简单的表如下: 四、代码详情 4

K的博客 280

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Springboot整合HBase——大数据技术之HBase2.x

Apache HBase 是以hdfs为数据存储的,一种分布式、可扩展的noSql数据库。是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase使用与BigTable(BigTable是一个稀疏的、分布式的、持久化的多维排序map)非常相似的数据模型。用户将数据行存储在带标签的表中。数据行具有可排序的键和任意数量的列。该表存储稀疏,因此如果用户喜欢,同一表中的行可以具有疯狂变化的列。

qq_43842093的博客 4828

Springboot整合HBase

Data。

青春不散场的专栏 3229

springboot2集成hbase2环境搭建

HBase原理 1. 简介 HBase是大数据NoSQL领域里非常重要的分布式KV数据库,是一个实时、高可靠、高性能、高伸缩的分布式存储系统,运行依赖于Hadoop HDFS、zk 2. 逻辑结构 因为是key-value结构的数据库,所以curd操作都是通过key去操作value。与redis不同的是HBase的key有点复杂。 Key则是由Rowkey、Column Family : Column Qualifier、Timestamp、Type等几个维度组成。rowkey是HBase的行键;co

本作者:想花 1471

大数据技术(八)—— HBase数据读写流程和Api的使用

HBase数据读写流程 HBase Api测试 HBase整合SpringBoot+Mybatis

weixin_39555954的博客 1519

SpringBoot整合HBase将数据写入Docker中的HBase

在之前的项目里,docker容器中已经运行了HBase,现将API操作HBase实现数据的增删改查 通过SpringBoot整合Hbase是一个很好的选择 首先打开IDEA,创建项目(project)时选择Spring Initializer 选择如下三种来创建工程 创建完后的pom文件如下(修改了spring-boot-starter-parent版本),并且加入了HBase的客户端依赖 <?xml version="1.0" encoding="UTF-8"?> <project

weixin_48445640的博客 617

springboot集成phoenix,操作hbase

文章目录前言1、版本要求1.1 对hbase版本的支持2、微服务集成2.1 创建gradle项目,添加依赖2.2 application.yml配置2.3 准备调试环境2.3.1 服务器配置2.3.2 本地配置3 Phoenix语法3.1 创建表3.2 删除表3.3 查询数据3.4 删除数据3.5 插入或更新数据3.6 Phoenix映射HBase以正确的姿势创建表映射创建表来进行表的映射创建视图来进行表的映射FAQhbase插入的数据,phoenix查出来的怎么是奇怪的值1 java.net.Unknow

t18092838767的博客 6001

springboot整合hbase

前言 因公司业务场景,原本使用phoenix数据库(hbase的一个sql层)的查询服务需要改为直连hbase,因为phoenix建表 映射到hbase这个过程需要的时间太长了,大数据组的同事是这么说的,也许是我们服务器资源不够吧。原本写的很 nice的sql要全部重构了! java连接hbase注意事项 1、对hbase不熟悉的建议先大致了解一下它的基本原理及重要组成部分,它是一个非关系...

User_xiangpeng的专栏 1804

springboot-集成hbase

修改pom.xml 添加依赖 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-hadoop</artifactId> <version>2.5.0.RELEASE</version&...

子龙修仙的博客 3120

java连接hbase_HBase 工具 | hbasesdk 推出HQL功能

hbase-sdk基于HBase Client的相关API开发而来的一款轻量级的HBase ORM框架。提供SQL查询功能,以类SQL的方式——HQL读写HBase数据。?针对HBase 1.x和2.xAPI的不同之处,在其上做了一层统一的封装。hbase-sdk分为spring-boot-starter-hbase和hbase-sdk-core两部分。SpringBoot项目中引入sp...

weixin_39922868的博客 374

Hbase基本操作---idea连接hbase(shell脚本 springBoot整合Hbase)

Hbase基本操作---idea连接hbase

just_learing的博客 2000

【在Windows 10下的Docker Desktop安装Hbase, 并使用SpringBoot进行连接】

在Windows 10下的Docker DeskTop安装Hbase, 并使用SpringBoot进行连接Hbase的小栗子

weixin_52785320的博客 3521
上一篇: 大数据开发之机器学习总结(二)
下一篇: 数仓建模和业务建模对比总结
闻香识代码
博客等级 码龄12年 314粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值