大数据单机部署-phoenix

版本:

apache-phoenix-4.14.2-HBase-1.4-bin.tar.gz (选择对应的hbase)

1.安装phoenix

1).解压,放到 /usr/local/phoenix

2).配置环境变量

sudo vim /etc/profile
export PHOENIX_HOME=/usr/local/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin

source /etc/profile

3).将 Phoenix 目录下的 phoenix-core-4.14.2-HBase-1.4.jar、phoenix-4.14.2-HBase-1.4-server.jar 拷贝到 hbase 集群各个节点 hbase 安装目录 lib 中(单机就是一个hbase了)。

4).将 hbase 集群中的配置文件 hbase-site.xml 拷贝到 Phoenix 的 bin 目录下,覆盖原有的配置文件。
5).将 hdfs 集群中的配置文件 core-site.xml、 hdfs-site.xml 拷贝到 Phoenix 的 bin 目录下

2.启动;

命令格式:./sqlline.sh <hbase.zookeeper.quorum>
我的ubuntu 的hostname是master

./sqlline.sh  master

3.测试

在客户端执行 !tables 命令,罗列所有表到客户端界面

!tables

4.phoenix图形查询工具squirrel

在windows电脑上下载squirrel,修改hosts文件
添加ubuntu 的ip以及名字

修改C:\Windows\System32\drivers\etc\hosts
如果hosts文件没有权限先复制到桌面修改再粘贴覆盖回去
增加行如下:

#phoenix主机的ip以及hostname
192.168.1.21    master

5.在 Spark 运行环境中添加 Phoenix 依赖

spark-env.sh 添加如下代码:

添加 Phoenix 依赖

for file in $(find /opt/hbase-1.2.4/lib |grep  phoenix)
do
    SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:$file"
done
export SPARK_DIST_CLASSPATH

这样每次启动 spark 任务都会将 phoenix 的 jar 包添加到 classpath 了

6.语法规则 ------------------------------

如果报错记得在表名加双引号

1). 插入数据
在 Phoenix 中是没有 Insert 语句的,取而代之的是 Upsert 语句。Upsert 有两种用法,
分别是:upsert into 和 upsert select

upsert into:
类似于 insert into 的语句,旨在单条插入外部数据
upsert into tb values('ak','hhh',222)
upsert into tb(stat,city,num) values('ak','hhh',222)

upsert select:
类似于 Hive 中的 insert select 语句,旨在批量插入其他表的数据。
upsert into tb1 (state,city,population) select state,city,population from tb2 where population < 40000;
upsert into tb1 select state,city,population from tb2 where population > 40000;
upsert into tb1 select * from tb2 where population > 40000;
注意:在 phoenix 中插入语句并不会像传统数据库一样存在重复数据。
因为 Phoenix 是构建在 HBase 之上的,也就是必须存在一个主键。
后面插入的会覆盖前面的,但是时间戳不一样。

2). 删除数据
delete from tb; 清空表中所有记录,Phoenix 中不能使用 truncate table tb;
delete from tb where city = 'kenai';
drop table tb; 删除表
delete from system.catalog where table_name = 'int_s6a';
drop table if exists tb;
drop table my_schema.tb;
drop table my_schema.tb cascade; 用于删除表的同时删除基于该表的所有视图。

3). 修改数据
由于 HBase 的主键设计,相同 rowkey 的内容可以直接覆盖,这就变相的更新了数据。
所以 Phoenix 的更新操作仍旧是 upsert into 和 upsert select
upsert into us_population (state,city,population) values('ak','juneau',40711);

4). 查询数据
union all, group by, order by, limit 都支持
select * from test limit 1000;
select * from test limit 1000 offset 100;
select full_name from sales_person where ranking >= 5.0 union all select reviewer_name from customer_review where score >= 8.0

5). 在 Phoenix 中是没有 Database 的概念的,所有的表都在同一个命名空间。但支持多个命名空间
设置为 true,创建的带有 schema 的表将映射到一个 namespace

<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>

6). 创建表
A.SALT_BUCKETS (加盐)
加盐 Salting 能够通过预分区 (pre-splitting) 数据到多个 region 中来显著提升读写性能。
本质是在 hbase 中,rowkey 的 byte 数组的第一个字节位置设定一个系统生成的 byte 值,
这个 byte 值是由主键生成 rowkey 的 byte 数组做一个哈希算法,计算得来的。
Salting 之后可以把数据分布到不同的 region 上,这样有利于 phoenix 并发的读写操作。

SALT_BUCKETS 的值范围在(1 ~ 256):
create table test(host varchar not null primary key, description varchar)salt_buckets=16;

upsert into test (host,description) values ('192.168.0.1','s1');
upsert into test (host,description) values ('192.168.0.2','s2');
upsert into test (host,description) values ('192.168.0.3','s3');

salted table 可以自动在每一个 rowkey 前面加上一个字节,这样对于一段连续的 rowkeys,它们在表中实际存储时,就被自动地分布到不同的 region 中去了。
当指定要读写该段区间内的数据时,也就避免了读写操作都集中在同一个 region 上。
简而言之,如果我们用 Phoenix 创建了一个 saltedtable,那么向该表中写入数据时,
原始的 rowkey 的前面会被自动地加上一个 byte(不同的 rowkey 会被分配不同的 byte),使得连续的 rowkeys 也能被均匀地分布到多个 regions。

B.Pre-split(预分区)
Salting 能够自动的设置表预分区,但是你得去控制表是如何分区的,
所以在建 phoenix 表时,可以精确的指定要根据什么值来做预分区,比如:
create table test (host varchar not null primary key, description varchar) split on ('cs','eu','na');

C. 使用多列族
列族包含相关的数据都在独立的文件中,在 Phoenix 设置多个列族可以提高查询性能。
创建两个列族:
create table test (
mykey varchar not null primary key,
a.col1 varchar,
a.col2 varchar,
b.col3 varchar
);
upsert into test values ('key1','a1','b1','c1');
upsert into test values ('key2','a2','b2','c2');

D. 使用压缩
create table test (host varchar not null primary key, description varchar) compression='snappy';

7). 创建视图,删除视图
create view "my_hbase_table"( k varchar primary key, "v" unsigned_long) default_column_family='a';
create view my_view ( new_col smallint ) as select * from my_table where k = 100;
create view my_view_on_view as select * from my_view where new_col > 70
create view v1 as select * from test where description in ('s1','s2','s3')

drop view my_view
drop view if exists my_schema.my_view
drop view if exists my_schema.my_view cascade

8). 创建二级索引
支持可变数据和不可变数据(数据插入后不再更新)上建立二级索引
create index my_idx on sales.opportunity(last_updated_date desc)
create index my_idx on log.event(created_date desc) include (name, payload) salt_buckets=10
create index if not exists my_comp_idx on server_metrics ( gc_time desc, created_date desc )
data_block_encoding='none',versions=?,max_filesize=2000000 split on (?, ?, ?)
create index my_idx on sales.opportunity(upper(contact_name))
create index test_index on test (host) include (description);

删除索引:
drop index my_idx on sales.opportunity
drop index if exists my_idx on server_metrics
drop index if exists xdgl_acct_fee_index on xdgl_acct_fee

默认是可变表,手动创建不可变表
create table hao2 (k varchar primary key, v varchar) immutable_rows=true;
alter table HAO2 set IMMUTABLE_ROWS = false; 修改为可变
alter index index1 on tb rebuild; 索引重建是把索引表清空后重新装配数据。

Global Indexing 多读少写,适合条件较少
create index my_index on items(price);
调用方法:

  1. 强制索引
    select /*+ index(items my_index) */ * from items where price=0.8824734;
    drop index my_name on usertable;
  1. 覆盖索引 Covered Indexes,需要 include 包含需要返回数据结果的列。
    create index index1_c on hao1 (age) include (name); name 已经被缓存在这张索引表里了。
    对于 select name from hao1 where age=2,查询效率和速度最快
    select * from hao1 where age =2,其他列不在索引表内,会全表扫描

Local Indexing 写多读少,不是索引字段索引表也会被使用,索引数据和真实数据存储在同一台机器上(
create local index index3_l_name on hao1 (name);

异步创建索引,创建的索引表中不会有数据,单独使用命令行工具来执行数据的创建
create index index1_c on hao1 (age) include(name) async;
hbase org.apache.phoenix.mapreduce.index.indextool
--schema my_schema --data-table my_table --index-table async_idx
--output-path async_idx_hfiles

9). 与现有的 HBase 表关联
首先创建一张 HBase 表,再创建的 Phoenix 表,表名必须和 HBase 表名一致即可。
create 'stu' ,'cf1','cf2'
put 'stu', 'key1','cf1:name','luozhao'
put 'stu', 'key1','cf1:sex','man'
put 'stu', 'key1','cf2:age','24'
put 'stu', 'key1','cf2:adress','cqupt'

create table "stu" (
id VARCHAR NOT NULL PRIMARY KEY ,
"cf1"."name" VARCHAR ,
"cf1"."sex" VARCHAR ,
"cf2"."age" VARCHAR ,
"cf2"."adress" VARCHAR );
upsert into "stu"(id,"cf1"."name","cf1"."sex","cf2"."age","cf2"."adress") values('key6','zkk','man','111','Beijing');

select * from "stu"; 会发现两张表是数据同步的。
这里查询表名需要用双引号括起来,强制不转换为大写。
这里一定要注意的是表名和列族以及列名需要用双引号括起来,因为 HBase 是区分大小写的,
如果不用双引号括起来的话 Phoenix 在创建表的时候会自动将小写转换为大写字母

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容