目录
快来加入我们的互动学习群吧,与我们一起成长和进步吧! QQ交流群:948912943
进群下载配套安装包,无需考虑版本兼容等问题!!!
Linux安装Phoenix及其环境配置
Apache Phoenix是构建在HBase之上的关系型数据库层,作为内嵌的客户端JDBC驱动用以对HBase中的数据进行低延迟访问。Apache Phoenix会将用户编写的SQL查询编译为一系列的scan操作,最终产生通用的JDBC结果集返回给客户端。数据表的元数据存储在HBase的表中被会标记版本号,所以进行查询的时候会自动选择正确的schema。直接使用HBase的API,结合协处理器(coprocessor)和自定义的过滤器的话,小范围的查询在毫秒级响应,千万数据的话响应速度为秒级。
注意:如果只需启动Phoenix,只需将服务端Jar传至hbase/bin目录下,并配置Phoenix相关配置到hbase-site.xml当中,重新启动Hbase即可。
下载Phoenix
官方地址:https://phoenix.apache.org/
下载地址:https://archive.apache.org/dist/phoenix/
选择自己需要的版本
1.解压
tar -zxvf phoenix-hbase-2.4.0-5.1.2-bin.tar.gz
mv ./phoenix-hbase-2.4.0-5.1.2-bin ./phoenix-hbase-2.4.0-5.1.2
2.配置环境变量
将以下部分放在环境变量文件中。记得把$PHOENIX_HOME换成自己的
export PHOENIX_HOME=/home/environment/phoenix-hbase-2.4.0-5.1.2
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PHOENIX_HOME/bin:$PATH
编辑好后切记要让环境变量文件生效:
source .bashrc
3.复制server.jar文件到$HBASE_HOME/lib目录下(每台机器都要发送)
cp -a /home/environment/phoenix-hbase-2.4.0-5.1.2/phoenix-server-hbase-2.4.0-5.1.2.jar /home/environment/hbase-2.4.14/lib
两个Jar包
phoenix-server-hbase-2.4.0-5.1.2.jar
htrace-core-3.1.0-incubating.jar
其中htrace-core-3.1.0-incubating.jar是从maven repo下载的(这个巨坑,phoenix居然没有携带)
4.启用二级索引
进入hbase/conf目录,启用二级索引(建立二级索引,将业务需要的数据联立建立索引,方便查询,但是如果用 hbase 维护的话会很麻烦)
为什么要做二级索引?
对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询。如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫描。对于较大的表,全表扫描的代价是不可接受的。但是,很多情况下,需要从多个角度查询数据。
例如:在定位某个人的时候,可以通过姓名、身份证号、学籍号等不同的角度来查询,要想把这么多角度的数据都放到rowkey中几乎不可能(业务的灵活性不允许,对rowkey长度的要求也不允许)。所以,需要secondary index(二级索引)来完成这件事。secondary index的原理很简单,但是如果自己维护的话则会麻烦一些。现在,Phoenix已经提供了对HBase secondary index的支持。
5.修改Hbase的hbase-site.xml文件配置(全部内容附在最后)
进入$HBASE_HOME/conf,修改hbase-site.xml文件内容,加入下面这一段内容。
<!-- 支持可变索引 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<!-- 开启phoenix命名空间的自动映射 -->
<!-- 使用schema和Namespace对应的配置 -->
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<property>
<name>phoenix.schema.mapSystemTablesToNamespace</name>
<value>true</value>
</property>
<!-- 开启用户自定义函数(UDFs) -->
<property>
<name>phoenix.functions.allowUserDefinedFunctions</name>
<value>true</value>
</property>
isNamespaceMappingEnabled、mapSystemTablesToNamespace属性前缀:phoenix.schema
属性 | 默认值 | 描述 |
---|---|---|
isNamespaceMappingEnabled | false | 如果启用了它,那么使用模式创建的表将映射到名称空间。这需要在客户端和服务器端同时设置。如果设置一次,则不应回滚。启用此属性后,旧客户端将无法工作 |
mapSystemTablesToNamespace | true | 启动此属性将在isNamespaceMappingEnabled也设置成true。如果它启动,系统表将自动迁移到SYSTEM命名空间。如果设置成false,系统表将在默认的命名空间中创建。它需要同时在客户端和服务端设置 |
属性 | 描述 |
---|---|
hbase.rootdir | 共享目录。默认在临时/tmp下,需要自己配置修改,因为重启服务器未见回丢失,也可以配置hdfs。 例如:hdfs://namenode.ehl.com:9000/hbase |
hbase.dynamic.jars.dir | 目录是phoenix 客户端/regionserver获取自定义udf的jar的地方。不需要重启服务 |
然后将hbase-site.xml拷贝到$PHOENIX_HOME/bin目录下:
cp -a hbase-site.xml /home/environment/phoenix-hbase-2.4.0-5.1.2/bin
修改配置后,重启hbase
6.启动Phoenix(客户端)
①先启动hdfs和zookeeper(phoenix是通过zookeeper连接hbase)
②再启动hbase(注意:如果在配置phoenix前已经启动了hbase,需要重启;hbase里的新配置会跟着生效)
③启动phoenix客户端
进入$PHOENIX_HOME/bin目录下,输入以下命令:
./sqlline.py
注意:在启动时可能报以下错误
raceback (most recent call last):
File "./sqlline.py", line 27, in <module>
import argparse
<font color=red>ImportError: No module named argparse</font>
解决办法:在安装phoenix的服务器上安装该模块
#不报错可以不用安装
yum ‐y install python‐argparse
#列出所有表
!tables
开发程序,对HBase+PhoenixDB进行操作
①使用phoenix-queryserver,这是一个http服务,通过这个服务操作Phoenix DB。
②使用JDBC标准驱动; SpringBoot+MyBatis表捆绑映射、直接写代码操作JDBC API。
常用命令
命令 | 描述 |
---|---|
help | 查看所有指令的帮助信息 |
!table | !tables | 查看所有的表 |
!describe | 查看的表的描述信息 |
!index | 查询表的所有索引信息 |
!history | 可以查看执行的历史SQL |
!dbinfo | 可以查看Phoenix所有的属性配置 |
hbase-site.xml文件
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--
HBase有三种运行模式:
①单机模式
②伪分布式模式
③分布式模式
基于本地文件系统运行
将HBase作为单个进程在开发人员工作站。使用此配置,HBase正在运行“单机”模式,没有分布式文件系统。在此模式下,无需进一步配置,HBase和ZooKeeper数据存储在本地文件系统,位于为`hbase.tmp.dir`配置的值下的路径中。
此值将从其默认值“/tmp”重写,因为系统定期清理“/tmp”。相反,它指向此HBase安装目录。针对“LocalFileSystem”运行,而不是针对分布式文件系统存在数据完整性问题和数据丢失的风险。正常地HBase将拒绝在这样的环境中运行。
设置`hbase.unsafe.stream.capability.enforce=false`覆盖此行为,允许操作。此配置用于开发人员工作站仅和不应用于生产
See also https://hbase.apache.org/book.html#standalone_dist
<property>
<name>hbase.cluster.distributed</name>
<value>false</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>./tmp</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
-->
<!-- HBase的存储目录 与Hadoop中的core-site.xml中的地址保持一致-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://node1:9000/hbase</value>
</property>
<!-- HBase Web服务 -->
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
<!-- 指定HBase的运行模式 - 是否为分布式 -->
<!-- 当使用外置zookeeper时必须配置为true,仅在使用hbase自带zookeeper时配置为false -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- Zookeeper的运行节点地址(hbase外置) -->
<!-- 可配置多个节点, 没有配置主机名和IP地址的映射etc/hosts文件, 可以使用各节点IP地址 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>node1,node2,node3</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<!-- Zookeeper的运行节点(hbase内置)
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>60000000</value>
</property>
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
Zookeeper存放数据目录 对应ZooKeeper的config zoo.cfg中的属性
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/environment/zookeeper/zkdata</value>
</property>
-->
<!-- ================================== -->
<!-- ==============Phoenix============= -->
<!-- ================================== -->
<!-- 支持可变索引 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<!-- 开启phoenix命名空间的自动映射 -->
<!-- 使用schema和Namespace对应的配置 -->
<!--
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<property>
<name>phoenix.schema.mapSystemTablesToNamespace</name>
<value>true</value>
</property>
-->
<!-- 开启用户自定义函数(UDFs) -->
<property>
<name>phoenix.functions.allowUserDefinedFunctions</name>
<value>true</value>
</property>
</configuration>