安装配置 phoenix 到 hbase 遇到的问题和成功经验分享

Phoenix 是一个开源的 SQL 封装,可以用 SQL 语法操作 HBase 这种分布式的 NoSQL 数据库。你也可以使用标准的 JDBC APIs 来取代 HBase client APIs 创建表、插入数据、查询数据等。

本教程包括如何安装 Phoenix 和使用 Phoenix 时遇到的几个问题如何解决。所用平台版本为:hadoop 2.7.1,hbase 1.0.1.1,phoenix-4.7.0-HBase-1.0。因此跟网上搜到的教程不太一样。

下载 并解压缩

#hbase安装phoenix
wget http://mirrors.cnnic.cn/apache/phoenix/phoenix-4.7.0-HBase-1.0/bin/phoenix-4.7.0-HBase-1.0-bin.tar.gz
tar zxvf phoenix-4.7.0-HBase-1.0-bin.tar.gz

复制与你的 hbase 版本兼容的 phoenix server jar 到 所有 region server 节点 HBase 目录中的 lib 目录下

#cp ~/phoenix-4.7.0-HBase-1.0-bin/phoenix-server-4.7.0-HBase-1.0.jar ~/hadoop/hbase-1.0.1.1/lib/phoenix-server-4.7.0-HBase-1.0.jar
#scp ~/phoenix-4.7.0-HBase-1.0-bin/phoenix-server-4.7.0-HBase-1.0.jar root@192.168.137.3:~/hadoop/hbase-1.0.1.1/lib/
以上操作实际报错,一大堆错误,由于我的putty被后续操作刷屏,现在已经找不到了,下次若是再次遇到我会补充在这里。
于是我用下面的办法:
cp ~/phoenix-4.7.0-HBase-1.0-bin/*.jar ~/hadoop/hbase-1.0.1.1/lib/
scp ~/phoenix-4.7.0-HBase-1.0-bin/*.jar root@192.168.137.3:~/hadoop/hbase-1.0.1.1/lib/

官方教程里没有提 phoenix 需要 hbase-site.xml 和 hdfs-site.xml 这两个文件,所以操作之后还是报错,网上搜到的,命令如下:

cp ~/hadoop/hbase-1.0.1.1/conf/hbase-site.xml ~/phoenix-4.7.0-HBase-1.0-bin/bin/
cp ~/hadoop/hadoop-2.7.1/etc/hadoop/hdfs-site.xml ~/phoenix-4.7.0-HBase-1.0-bin/bin/

重启 region servers

~/hadoop/hbase-1.0.1.1/bin/stop-hbase.sh
~/hadoop/hbase-1.0.1.1/bin/start-hbase.sh

验证 phoenix 是否成功加载,网上教程有改变脚本的权限为777,我实际测试不改也可以

#chmod 777 ~/phoenix-4.7.0-HBase-1.0-bin/bin/sqlline.py
~/phoenix-4.7.0-HBase-1.0-bin/bin/sqlline.py localhost

看到如下信息就算 phoenix 安装配置成功

Connected to: Phoenix (version 4.7)
Driver: PhoenixEmbeddedDriver (version 4.7)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
90/90 (100%) Done
Done
sqlline version 1.1.8
0: jdbc:phoenix:localhost>

在这个命令行下,输入 !tables 即可查看 通过 phoenix 在 hbase 中创建的所有表,输入 !quit 即可退出,其它命令可以输入 help 查看,每个命令后面都有说明。借用官网图片:

sqlline

下载并安装 SQuirrel 作为 SQL 客户端,这样你就可以用 SQL 语法来操作你的 hbase 集群了。

借用官网图片:

squirrel

我写这篇教程的时候最新版是3.7,我下载的是squirrelsql-3.7-standard.zip这个版本,解压缩。

将 phoenix client jar 添加到你的 HBase client 的 classpath

将 phoenix-4.7.0-HBase-1.0-bin.tar.gz 解压缩,找到里面的 phoenix-4.7.0-HBase-1.0-client.jar,复制到 squirrelsql-3.7-standard.zip 解压缩后的 lib 目录中,双击 squirrel-sql.bat 启动 squirrel sql HBase client。

  1. 添加 driver 到 SQuirrel (Drivers -> New Driver)
  2. 在 Add Driver 对话框中,  设置 Name 为 Phoenix,  设置 Example URL 为 jdbc:phoenix:localhost.
  3. 复制引号中的内容 “org.apache.phoenix.jdbc.PhoenixDriver” 到 Class Name 文本框,然后点击 OK 关闭对话框。
  4. 切换至 Alias 选项卡,创建 Alias (Aliases -> New Aliases)
  5. 在对话框中设置以下选项,  Name: 随便起一个,  Driver: Phoenix,  User Name: 随便写,可以留空,  Password: 随便写,可以留空
  6. 按照下面的格式构造 URL : jdbc:phoenix: zookeeper quorum server. 例如, 连接本地 HBase 可以使用: jdbc:phoenix:localhost,连接远程 hbase,可以使用远程地址的ip或者主机名(前提有解析)、域名: jdbc:phoenix:192.168.137.3:2181,默认端口2181是可选的,如果改了端口,必须要带上端口。
  7. 点击 Test (如果配置正确,将会提示连接成功) 然后点击 OK 关闭对话框.
  8. 双击刚才创建的 Phoenix alias 并且点击 Connect. 现在你可以尽情使用 SQL 语法查询 NoSQL 数据库 hbase 了。

有几个问题需要注意,phoenix 中没有 insert into,也没有 update,合并成 upsert into 了。另外,插入数据中的字符串要用单引号括起来,我用双引号就报错。以下是一些报错信息:

#双引号报错
Error: ERROR 204 (22008): Values in UPSERT must evaluate to a constant.
SQLState:  22008
ErrorCode: 204
#insert into 报错
Error: ERROR 601 (42P00): Syntax error. Encountered "INSERT" at line 1, column 1.
SQLState:  42P00
ErrorCode: 601

下面是我已经测试成功的 SQL 语句,在 hbase 中查看,表已经成功建成并且已有2条数据:

CREATE TABLE IF NOT EXISTS us_population (
      state CHAR(2) NOT NULL,
      city VARCHAR NOT NULL,
      population BIGINT
      CONSTRAINT my_pk PRIMARY KEY (state, city));
UPSERT INTO us_population (state, city, population) values ('NY','New York',8143197);
UPSERT INTO us_population (state, city, population) values ('CA','Los Angeles',3844829);

参考链接:
http://phoenix.apache.org/Phoenix-in-15-minutes-or-less.html
http://phoenix.apache.org/installation.html
http://www.aboutyun.com/thread-12403-1-2.html
http://www.aboutyun.com/thread-17363-1-1.html
http://www.tuicool.com/articles/UrQv6zz