点击上方蓝色字体,选择“设为星标”
回复”资源“获取更多惊喜
![d0d42be81f9dbbb7e0a5d76683ed1c83.png](https://i-blog.csdnimg.cn/blog_migrate/67e8158a05b6d2e60b1717df89753f01.jpeg)
![f2acd74e8e28b8e5f901ec743af0cb3b.png](https://i-blog.csdnimg.cn/blog_migrate/149ca4bc1b0085dfb44aa520107f18e3.jpeg)
环境
CDH-6.3.1Hive-2.1.1Phoenix-5.0.0Hbase-2.1.0 hive集成phoenix仅支持hive使用mapreduce,tez引擎,不支持spark引擎;如果启用了kerberos,需要使用同时有hive和hbase权限的用户;
依赖
需要在hive中添加phoenix的jar包依赖,下面的命令是在hive命令行里session级别生效的,如果想全局生效可参考上面的hive操作ES的文章里的内容。phoenix-version-hive.jar包可以在$PHOENIX_HOME/lib下找到。
add jar /home/tools/wyk/phoenix-5.0.0-cdh6.2.0-hive.jar;
![105d79e2cca16c437347b0d98b5f2f3d.png](https://i-blog.csdnimg.cn/blog_migrate/29ec4208031e4c862cb038f651577f0a.png)
验证
在hive中建phoenix内表
在hive中创建Phoenix内部表,hive会管理结构和数据,会自动在phoenix建表,删除hive表的时候对应的Phoenix表也删除。
-- 在hive中创建Phoenix内部表,hive会管理结构和数据,会自动在phoenix建表,删除hive表的时候对应的Phoenix表也删除:create table default.phoenix_hive_create_internal (s1 string,i1 int,f1 float,d1 double)STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'TBLPROPERTIES ("phoenix.table.name" = "phoenix_hive_create_internal","phoenix.zookeeper.quorum" = "uathd01,uathd02,uathd03","phoenix.zookeeper.znode.parent" = "/hbase","phoenix.zookeeper.client.port" = "2181","phoenix.rowkeys" = "s1, i1","phoenix.column.mapping" = "s1:s1, i1:i1, f1:f1, d1:d1","phoenix.table.options" = "SALT_BUCKETS=10, DATA_BLOCK_ENCODING='DIFF'");
![0de219e7c620cd7512bcfa6c440766e1.png](https://i-blog.csdnimg.cn/blog_migrate/839eada85c380761cb3c63ee4cf3bcc1.png)
在hive中建完Phoenix内表之后可以看到在phoenix中和hbase中都自动创建了一张表PHOENIX_HIVE_CREATE_INTERNAL。
![869733739281be8158eb88135e899ffb.png](https://i-blog.csdnimg.cn/blog_migrate/36da7bdd7fde214e9ded24871f2829bf.png)
![cd661d50bc3d1323237571bec81276e6.png](https://i-blog.csdnimg.cn/blog_migrate/81b85f07c7025ea55dcab037a1ee36f0.png)
从hive往phoenix插入数据
不支持spark引擎:
![d3170f5d8a931c9ceb2bad9dc681c990.png](https://i-blog.csdnimg.cn/blog_migrate/eae2c8ebd595f214e62766f9738b3d52.png)
--修改执行引擎set hive.execution.engine=mr; --在hive中插入一条记录insert into default.phoenix_hive_create_internal values('wyk',1,2.3412,3.14);
![d10f615c83ba53d5cecdf3162932afd3.png](https://i-blog.csdnimg.cn/blog_migrate/39c945c2208f5645cb9aa21444f338ce.png)
查看hbase和phoenix端是否同步了该数据:
--hbasescan "PHOENIX_HIVE_CREATE_INTERNAL"--phoenixselect * from "PHOENIX_HIVE_CREATE_INTERNAL";
![6a41f30b7def88477e784e2b0d4b4466.png](https://i-blog.csdnimg.cn/blog_migrate/d4cedd81108251269aaa8525229fee6c.png)
![9af50e4afb54df56117476dbfc3d6777.png](https://i-blog.csdnimg.cn/blog_migrate/c40de3143862b58c389673ab80dd763a.png)
从Phoenix插入数据,在hive端查看
--phoenix端 插入一条数据upsert into "PHOENIX_HIVE_CREATE_INTERNAL" values('csdn',2,8.66,7.555); select * from "PHOENIX_HIVE_CREATE_INTERNAL";
![98f20a51ccf31f49be8e9546dfe65359.png](https://i-blog.csdnimg.cn/blog_migrate/33c0d8e590347c253398c9700e7ec9dd.png)
--hive端验证能否看到phoenix端插入的记录select * from default.phoenix_hive_create_internal ;
在Hive中对Phoenix的数据进行更新
官方文档上说不支持在hive中对phoenix表进行update和delete操作,但是我们可以执行insert命令,只要主键与phoenix表的相同就会自动更新。
例:
--准备一条记录用做更新insert into default.phoenix_hive_create_internal values('csdn',3,0.222,0.1114); --再次插入一条记录,主键与phoenix的相同,这里的是s1和i1组合键,更新f1字段insert into default.phoenix_hive_create_internal values('csdn',3,0.888,0.1114);
如果在hive中对phoenix表执行update或delete 命令会报下面的错误:
--不支持update deleteupdate default.phoenix_hive_create_internal set f1=0.888 where i1=3;delete from default.phoenix_hive_create_internal where i1=3;FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.
"Hive on Phoenix" VS "Hive on Hbase"
hive读phoenix和hive读hbase的性能对比:
首先在hive中建一个hbase外表,然后建一个phoenix外表,将hive表的数据同时写入hbase表和phoenix表,然后对比在hive中查询hbase和phoenix的性能。
hive建hbase外表和phoenix外表以及数据准备的步骤先略过了,在之前的文章和本篇上面已经有过示例代码,我们直接看表:
Hive shell--hive表select count(1) from tbl_doc_record; result: 565343--hbase外表select count(1) from default.hbase_tbl_doc_record; result: 565343 --phoenix外表select count(1) from default.phoenix_tbl_doc_record;result: 565343
对比phoenix客户端查出来的结果一致都是565343条记录:
尝试了几个SQL,使用hive查询phoenix和hbase的性能几乎一致,直接在phoenix里查询性能远超在impala中查询hive表。很奇怪为什么使用hive查询phoenix就慢了呢,下面根据Phoenix上的方式修改配置。
提升Hive查询Phoenix的性能:
按官方的说法,设置下面两个参数后,在Hive shell中对phoenix表的查询速度跟在phoenix client中查询一样,但尝试之后发现在hive中查询phoenix表的速度跟查hbase表差不多,就是很慢,但是在phoenix client查刚才从hive建的表就很快,尝试修改了好几个参数都没能成功,希望有小伙伴尝试成功了能跟我同步一下,谢谢。
Hive Shell:set hive.exec.parallel=true;set hive.fetch.task.conversion=more ;
当前版本的限制
暂不支持在Hive中对Phoenix表进行更新update和删除delete。但是可以通过insert的时候主键相同会实现更新操作,和hive操作ES类似。
字段映射不到rowkey列。
mapreduce和tez引擎仅支持一个reducer。