作者:微信小助手
发布时间:2023-10-09T16:36:25
HydraQL
中的 SQL 语法更轻量,无需引入额外的组件和配置即可使用,且对 HBase 无倾入性,但目前还不支持聚合查询、表关联、以及二级索引等高阶功能。
HBase 是 Apache 的顶级项目之一,是一款开源的、分布式的、面向列的 NoSQL 数据库系统。它基于 Hadoop 的分布式文件系统(HDFS)构建,并且在 Hadoop 生态系统中充当高可靠、高性能和可伸缩性的实时数据存储和处理解决方案。
Facebook:Facebook 使用 HBase 来存储和处理用户的消息、通知、实时新闻源等实时数据,提供实时的社交网络服务。
Twitter:Twitter 使用 HBase 作为其实时分析和查询引擎的后端存储,用于存储和处理大规模的社交网络数据、实时推文和用户行为数据等。
Airbnb:Airbnb 使用 HBase 来存储和处理其大规模的实时用户数据,包括订房信息、用户行为数据和实时推荐。
Yahoo:Yahoo 使用 HBase 作为其广告平台的后端存储,用于存储和处理广告投放相关的海量数据。
Spotify:Spotify 使用 HBase 来存储和处理音乐流媒体服务中的海量用户数据,包括播放历史、音乐推荐和用户互动数据等。
筛选 rowKey 范围在('a1000', 'g1005'],年龄>=18 岁,得有工作或者薪酬大于 1 万,有交通工具,而且交通工具不能是公交、自行车和地铁的人员信息。
HydraQL
由 Hydra + SQL 拼接而来,其名称
Hydra引用了“九头蛇”,象征着在处理 HBase 数据时的灵活性和多功能性。
hql 是其简称,一种类 SQL 的语言,其在执行时,会被“翻译”成
hbase-client
的原生 API 来读写表中的数据。
HydraQL
是 HBase 的衍生工具集,它融合了 hql、ORM、HBatis、hbase-shell、hbase-thrift 等 API 的功能,你可以按需引用,也可以拷贝和修改源码使用,这并不会有什么限制,只希望能及时反馈 bug,或提供更好的建议。
.
├── LICENSE
├── README-EN.md
├── README.md
├── antlr
│ ├── HydraQLLexer.g4
│ ├── HydraQLParser.g4
│ ├── antlr.sh
│
├── bin
│ ├── build-hql-console.sh
│ ├── build.sh
│ ├── change-model-version.sh
│ ├── deploy.sh
│ └── mvn-doc.sh
├── build
│ ├── checkstyle
│ └── findbugs
├── docs
├── hydraql-adapter
│ ├── hydraql-adapter-common
│ ├── hydraql-adapter_1.2
│ ├── hydraql-adapter_1.4
│ ├── hydraql-adapter_2.2
│ ├── hydraql-adapter_2.5
│ └── pom.xml
├── hydraql-common
│
├── hydraql-console
│
├── hydraql-dsl
│
├── hydraql-examples
│ ├── hydraql-example
│ ├── hydraql-shell-example
│ ├── pom.xml
│ └── spring-boot-starter-hydraql-example
├── hydraql-shell
│ ├── hydraql-shell-core
│ ├── hydraql-shell_1.2
│ ├── hydraql-shell_1.4
│ ├── hydraql-shell_2.2
│ ├── hydraql-shell_2.5
│ └── pom.xml
├── hydraql-template
│
├── hydraql-tests
│ ├── hydraql-tests-adapter_1.2
│ ├── hydraql-tests-adapter_1.4
│ ├── hydraql-tests-adapter_2.2
│ ├── hydraql-tests-adapter_2.5
│ ├── hydraql-tests-common
│ ├── hydraql-tests-main
│ └── pom.xml
├── hydraql-thrift
│
├── pom.xml
└── spring-boot-starter-hydraql
|
|
|
|
|
hbase-client api 进行适配和增强,屏蔽了多版本下 hbase-client api 不兼容
|
|
|
|
|
|
|
|
|
|
|
|
|
hbase-client
原生 API 进行了统一的接口定义,屏蔽了底层 API 的复杂调用方式,消除了跨版本升级过程中 API 不兼容的问题。在保证原有功能的同时,额外扩展了其他有用功能,列举如下:
hbase-client
API 之间的差异
spring-boot-starter-hydraql
模块可与 SpringBoot 无缝集成
cd ~/HydraQL
sh bin/build.sh 1.2|1.4|2.2|2.5
# 或者
mvn clean install -Dmaven.test.skip=true
mvn clean install -Dmaven.test.skip=true -Dhbase.profile=1.4
mvn clean install -Dmaven.test.skip=true -Dhbase.profile=2.2
mvn clean install -Dmaven.test.skip=true -Dhbase.profile=2.5
cd ~/HydraQL
sh bin/build-hql-console.sh 1.2|1.4|2.2|2.5
# 或者
mvn clean package -Dmaven.test.skip=true -pl hydraql-console -am
mvn clean package -Dmaven.test.skip=true -Dhbase.profile=1.4 -pl hydraql-console -am
mvn clean package -Dmaven.test.skip=true -Dhbase.profile=2.2 -pl hydraql-console -am
mvn clean package -Dmaven.test.skip=true -Dhbase.profile=2.5 -pl hydraql-console -am
hydraql-template
的依赖
<properties>
<hydraql.hbase.adapter.version>1.2 </hydraql.hbase.adapter.version>
<!-- <hydraql.hbase.adapter.version>1.4</hydraql.hbase.adapter.version>-->
<!-- <hydraql.hbase.adapter.version>2.2</hydraql.hbase.adapter.version>-->
<!-- <hydraql.hbase.adapter.version>2.5</hydraql.hbase.adapter.version>-->
</properties>
<dependency>
<groupId>com.hydraql </groupId>
<artifactId>hydraql-template_${hydraql.hbase.adapter.version} </artifactId>
<version>1.0.0 </version>
</dependency>
1.0.1-SNAPSHOT
,可以关注:https://github.com/CCweixiao/HydraQL,在master分支代码中获取最新的版本号。
// 创建连接HBase的Configuration
Configuration conf = HBaseConfiguration.create();
conf.set( "hbase.zookeeper.quorum", "myhbase");
conf.set( "hbase.zookeeper.property.clientPort", "2181");
// HBase表数据读写的操作模版类
BaseHBaseTableTemplate tableTemplate = HBaseTableTemplate.of(conf);
// Admin操作模版类
BaseHBaseAdminTemplate adminTemplate = HBaseAdminTemplate.of(conf);
// HQL操作模版类
BaseHBaseSqlTemplate sqlTemplate = HBaseSqlTemplate.of(conf);
Configuration conf = HBaseConfiguration.create();
conf.set( "hbase.zookeeper.quorum", "myhbase");
conf.set( "hbase.zookeeper.property.clientPort", "2181");
conf.set( "hbase.security.authentication", "kerberos");
// 下面配置是kerberos认证方式所需
conf.set( "kerberos.principal", "hbase@HADOOP.LEO.COM");
conf.set( "keytab.file", "/etc/hbase/conf/hbase.keytab");
// 设置kerberos用户代理,需保证hbase有代理普通用户的权限
conf.set( "kerberos.proxy.user", "proxy_user");
conf.set( "hbase.regionserver.kerberos.principal", "hbase/_HOST@HADOOP.LEO.COM");
conf.set( "hbase.master.kerberos.principal", "hbase/_HOST@HADOOP.LEO.COM");
// 指定kdc服务相关的配置方式有如下两种:
// 方式一:指定krb5.conf路径
conf.set( "java.security.krb5.conf", "/etc/krb5.conf");
// 方式二:指定java.security.krb5.realm和java.security.krb5.kdc
conf.set( "java.security.krb5.realm", "HADOOP.LEO.COM");
conf.set( "java.security.krb5.kdc", "你自己的kdc服务地址");
// 一些额外的客户端参数
conf.set( "hbase.client.retries.number", "3");
// HBase客户端的hedged read功能
conf.set( "hbase.client.hedged.read.open", "true");
// 主集群读超时触发hedged.read的阈值
conf.set( "hbase.client.hedged.read.timeout", "100");
// 可以与rpc handler count一致
conf.set( "hbase.client.hedged.thread.pool.size", "100");
// 设置hedged.read集群的配置,其他配置,默认复用主集群的配置
conf.set( "hbase.zookeeper.quorum.hedged.read", "myhbase");
conf.set( "hbase.zookeeper.property.clientPort.hedged.read", "2181");
BaseHBaseTableTemplate tableTemplate = HBaseTableTemplate.of(conf);
IHBaseTableOpAdapter.java
或测试模块中的测试用例
public class CityTag {
private String tagName;
public CityTag(String tagName) {
this.tagName = tagName;
}
// 省略Getter/Setter/toString
}
@HBaseTable(namespaceName = "default", tableName = "test_table", defaultFamilyName = "f1")
public class CityModel {
@HBaseRowKey
private String cityId;
private String cityName;
private String cityAddress;
@HBaseColumn(familyName = "detail")
private Integer cityArea;
@HBaseColumn(familyName = "detail", toUpperCase = true)
private Integer totalPopulation;
@HBaseColumn(familyName = "detail", columnName = "cityTagList")
private List<CityTag> cityTagList;
// 省略Getter/Setter/toString
}
@HBaseTable
注解用于定义 HBase 的表信息
@HBaseTable(namespaceName = "default", tableName = "t2", defaultFamilyName = "info")
@HBaseRowKey
注解用于定义某一个属性字段是用作存储 rowKey 数据的,是必须要设置的,如:
@HBaseRowKey
private String cityId;
@HBaseColumn
注解用于定义 HBase 的列簇和列名信息,如:
@HBaseColumn(familyName = "detail", columnName = "TOTAL_POPULATION", toUpperCase = true)
private Integer totalPopulation;
@Test
public void testSave() {
// 构造数据对象
CityModel cityModel = CityModelUtil.createDefaultCityModel();
// 调用save存储数据
tableTemplate.save(cityModel);
// 构造 GetRowParam 查询参数
GetRowParam getRowParam = GetRowParam.of(cityModel.getCityId()).build();
// 调用getRow查询单条数据
Optional<CityModel> cityModelRes = tableTemplate.getRow(getRowParam, CityModel .class);
Assert.assertNotNull(cityModelRes);
}
spring-boot-starter-hydraql
的依赖
<properties>
<hydraql.hbase.adapter.version>1.2 </hydraql.hbase.adapter.version>
<!-- <hydraql.hbase.adapter.version>1.4</hydraql.hbase.adapter.version>-->
<!-- <hydraql.hbase.adapter.version>2.2</hydraql.hbase.adapter.version>-->
<!-- <hydraql.hbase.adapter.version>2.5</hydraql.hbase.adapter.version>-->
</properties>
<dependency>
<groupId>com.hydraql </groupId>
<artifactId>spring-boot-starter-hydraql_${hydraql.hbase.adapter.version} </artifactId>
<version>1.0.0 </version>
</dependency>
@Autowired
注解注入 HBase 的模版操作类
@Service
public class UserService {
@Autowired
private BaseHBaseTableTemplate tableTemplate;
@Autowired
private BaseHBaseAdminTemplate adminTemplate;
@Autowired
private BaseHBaseSqlTemplate sqlTemplate;
}
application.yaml
文件中设置 HBase 集群的连接信息
spring:
datasource:
hbase:
zk-quorum: zk_host1,zk_host2,zk_host3
zk-client-port: 2181 # (可选,默认2181)
dfs-root-dir: /hbase # (可选,默认/hbase)
zk-node-parent: /hbase # (可选,默认/hbase)
security-auth-way: simple # (可选,默认simple)
client-properties: hbase.client.retries.number=3;key1=value2
server:
port: 8088
application.yaml
配置文件内容如下:
spring:
datasource:
hbase:
zk-quorum: myhbase
zk-client-port: 2181
dfs-root-dir: /hbase
zk-node-parent: /hbase
security-auth-way: simple
kerberos-principal: hbase@HADOOP.LEO.COM
keytab-file-path: /etc/hbase/conf/hbase.keytab
kerberos-proxy-user: test
rs-kerberos-principal: hbase/_HOST@HADOOP.LEO.COM
master-kerberos-principal: hbase/_HOST@HADOOP.LEO.COM
krb5-conf-path: /etc/krb5.conf
krb5-realm:
krb5-kdc-server-addr:
client-properties: hbase.client.retries.number=3
server:
port: 8088
CREATE VIRTUAL TABLE
IF NOT EXISTS test:test_sql (
row_key VARCHAR ( 100 ) NOT NULL PRIMARY KEY,
f1 : id VARCHAR ( 200 ) NOT NULL,
f1 : name VARCHAR ( 200 ) NOT NULL,
f1 : age SMALLINT NULL,
f1 : job VARCHAR ( 200 ) NOT NULL,
f1 : pay FLOAT,
f2 : address VARCHAR ( 200 ) NOT NULL,
f2 : commuter VARCHAR ( 200 ) NOT NULL
)
WITH properties
( "hbase.client.scanner.caching" = 1000,
"hbase.client.scan.batch" = 100,
"hbase.client.delete.batch" = 5,
"hbase.client.scanner.cache" = FALSE
);
sqlTemplate.createVirtualTable(hql);
show virtual tables;
public void testShowTables() {
String hql = "show virtual tables";
List<String> virtualTables = sqlTemplate.showVirtualTables(hql);
System.out.println(virtualTables);
}
show create virtual table test:test_sql;
public void testShowCreateTable() {
String hql = "show create virtual table test:test_sql;";
String s = sqlTemplate.showCreateVirtualTable(hql);
System.out.println(s);
}
drop virtual table if exists test:test_sql
public void testDropVirtualTable() {
sqlTemplate.dropVirtualTable( "drop virtual table if exists test:test_sql;");
}
select * from test:test_sql where startkey > 'a1000' and endkey <= 'g1005' limit 50
String hql = "select * from test:test_sql where rowKey = 'a1005'";
HBaseDataSet dataSet = sqlTemplate.select(hql);
dataSet.show();
delete from test:test_sql where rowkey = 'a1002'
@Test
public void testDelete() {
String hql = "delete from test:test_sql where rowkey = 'a1002';";
sqlTemplate.delete(hql);
}
upsert into test:test_sql ( row_key , f1:id , f1:name , f1:age , f1:job , f1:pay , f2:address , f2:commuter )
values ( '22222', '10001' , 'leojie' , null , '程序员' , 15333.33 , '北京' , '' );
upsert into test:test_sql ( row_key , f1:id , f1:name , f1:age , f1:job , f1:pay , f2:address , f2:commuter )
values ( '22222', '10001' , 'leojie' , null , '程序员' , 15333.33 , '北京' , '' ),
( '33333', '10001' , 'leojie' , null , '程序员' , 15333.33 , '北京' , '' );
@Test
public void testInsertOne() {
testCreateVirtualTable();
String hql = " upsert into test:test_sql ( row_key , f1:id , f1:name , f1:age , f1:job , f1:pay , f2:address , f2:commuter ) values ('22222', '10001' , 'leojie' , null , '程序员' , 15333.33 , '北京' , '' );";
sqlTemplate.insert(hql);
}
hydraql-console/target/hydraql-console_1.4-1.0.1-SNAPSHOT-release.tar.gz
tar -zxvf hydraql-console_1.4-1.0.1-SNAPSHOT-release.tar.gz
cd hydraql-console_1.4-1.0.1-SNAPSHOT
ll
(base) leojie@宇宙无敌第一帅 ~/software/hydraql-console_1.4-1.0.1-SNAPSHOT ll
total 0
drwxr-xr-x 3 leojie staff 96B 9 28 16:08 bin # 启动脚本
drwxr-xr-x 4 leojie staff 128B 9 28 16:08 conf # 配置文件,不需要什么配置
drwxr-xr-x 127 leojie staff 4.0K 9 28 16:08 lib # 第三方jar
drwxr-xr-x 3 leojie staff 96B 9 28 16:08 logs # 日志目录,方便排障
sh bin/hydraql-console.sh
# 添加集群信息
add_cluster test hbase.zookeeper.quorum=myhbase;hbase.zookeeper.property.clientPort=2181
# 查看集群列表
list_clusters
# 切换集群
switch_cluster test
# 命令帮助
help
hydraql-console 支持历史命令提示,以及 TAB 提示命令,上下键翻转选择历史命令,关键词色彩提示、HQL 语法解析异常提示等等