—— 目录 ——
0. 前置
前一篇记录了 HBase 的 Shell 操作和 JavaAPI 操作,但操作过程还是较为繁琐
【HBase之轨迹】(2)使用 hbase命令 和 JavaAPI 操作 HBase(包括复杂查询–过滤器,HBase 工具类)
如果能像使用 MySQL 一样编写 SQL 操作数据库就好了,而 Phoenix 正是提供了这样一种支持
本篇将记录 Phoenix 的安装配置过程,Shell 使用和使用 SpringBoot+MyBatis 整合 Phoenix
配置过程中的一些常见错误已经在文中指出,有如 Phoenix 无法启动、缺少依赖、Command line too long、如何映射实体类等
避免走笔者已经走过的弯路,如果还发现新的问题欢迎留言
1. Apache Phoenix 简介
Apache Phoenix 是给予 HBase 的一个 SQL 引擎,通过提供 Jar 包拓展 HBase 的功能
支持使用 SQL 语句对 HBase 进行操作,底层是将 SQL 语言转化为 HBase 原生语句(如 scan get put 等)
同时还支持二级索引,底层基于 HBase 的协处理器,可以提升 HBase 的查询效率
Phoenix 作为一个数据源,在 Java 项目中的使用和 MySQL 一样,可以用 JDBC 进行连接,也可以使用 MyBatis 框架进行整合,像正常关系型数据库一样操作
2. 下载配置与启动
① 下载安装包
首先到官方下载页面:https://phoenix.apache.org/download.html
选择对应 HBase 版本的 Phoenix 版本进行下载
本文 Hbase 版本为 2.3.7,故选择如下:
进去第一各连接点击即可下载安装包,之后用 xftp 上传到服务器
或直接在服务器使用 wget https://...
下载
② 将 Phoenix 的 jar 包拷贝到 HBase lib 目录下
由于 Phoenix 只是作为 HBase 的拓展,而不是作为一个单独的程序
所以只需要将下载的一系列 jar 包拷贝到 HBase 的 lib 目录下,再简单配置一下就可以使用了
解压安装包后,可以先拷贝到一个服务器,再进行分发
▲ 注意:这里只拷贝 phoenix-server-hbase-2.3-5.1.2.jar
和 phoenix-pherf-5.1.2.jar
两个就够了,把客户端也拷贝进去可能出大问题(我就被搞了可恶啊)
cp phoenix-server-hbase-2.3-5.1.2.jar /.../hbase-2.3.7/lib
cp phoenix-pherf-5.1.2.jar /.../hbase-2.3.7/lib
xsync /.../hbase-2.3.7/lib
③ 为 HBase 配置 Phoenix
修改 HBase 的 hbase-site.xml 配置文件,加上下列几个配置
<!-- 支持 HBase命名空间映射 -->
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<!-- 支持索引预写日志编码 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
然后分发到各台服务器
如果是从前面用 docker 搭建集群来的,就不能直接分发了,因为每个容器的端口设置都不一样,如 16100 16101 16102 等,这就需要一个一个修改了
▲ 同时非常非常非常重要的 不仅仅需要修改 HBase 的 hbase-site.xml 文件 还需要修改 Phoenix bin 目录下的 hbase-site.xml 文件 Phoenix 目录下的原配置文件中只有 hbase.regionserver.wal.codec 一个配置 还需要和上边一样加上另一个配置,总之保证 Phoenix 自身的 hbase-site.xml 文件也要又以上两个配置 忘记加的后果: 启动 Phoenix sqlline.py 客户端时,卡住无反应 最后结果为 Phoenix 启动超时,HBase 的三个 HRegionServer 全部挂掉 查看 HBase logs 下的 Region 日志,可发现错误: org.apache.phoenix.coprocessor.MetaDataEndpointImpl cannot be cast to com.google.protobuf.Service |
配置完之后,重启 HBase(stop + start)
④ 启动 Phoenix
进入到 Phoenix 安装目录下的 bin
目录,执行如下
# 示例:./sqlline.py hadoop001:2181
./sqlline.py <master 服务器 IP 地址>:<Zookeeper 端口>
会进入到以下界面,先使用 !table
查看表
上面这些表都是 Phoenix 自动帮我们创建的,能看见就说明启动成功了
同时在 Web 端也能够看到:
3. Phoenix 命令行使用
① DDL 表的增删改查
(1)—— 创建表
▲ 注意:原 HBase 中的表不会自动映射到 Phoenix 中去,并不会在 Phoenix 中显示出来
但在 Phoenix 中创建相同名字的表,原表数据会导入到表中相应的列(列名一模一样),可以看到原先的数据
其中必须有一项设置为 PRIMARY KEY
,表示该项作为 ROWKEY
且在 Phoenix 中,所有名字都会被自动转化成大写,如果需要保留小写,则需加上双引号
语法如下:
CREATE TABLE IF NOT EXISTS 表名 (
ROWKEY名称 数据类型 PRIMARY KEY,
列族名.列名 数据类型 NOT NULL,
列族名.列名 数据类型,
...
);
# 下面为可选设置,直接加在后边即可
CONPRESSION='xxx'(可以指定数据压缩方式,如 GZ)
SPLIT ON ('5', '10', '15') (预分区设置方法1,对于 rowkey 使用直接划分)
SALT_BUCKETS=10 (预分区设置方法2,直接设置 n 各预分区,这里是 10 个)
建表示例(直接客户端命令行运行)
CREATE TABLE IF NOT EXISTS "stardust" (
"id" VARCHAR PRIMARY KEY,
"info"."name" VARCHAR(20),
"info"."kind" VARCHAR(20),
"inf